diff --git a/debug_toolbar/static/debug_toolbar/js/toolbar.js b/debug_toolbar/static/debug_toolbar/js/toolbar.js index c9ffb4fc8..2b852815a 100644 --- a/debug_toolbar/static/debug_toolbar/js/toolbar.js +++ b/debug_toolbar/static/debug_toolbar/js/toolbar.js @@ -1,309 +1,308 @@ -(function () { - const $$ = { - on: function(root, eventName, selector, fn) { - root.addEventListener(eventName, function(event) { - const target = event.target.closest(selector); - if (root.contains(target)) { - fn.call(target, event); - } - }); - }, - show: function(element) { - element.style.display = 'block'; - }, - hide: function(element) { - element.style.display = 'none'; - }, - toggle: function(element, value) { - if (value) { - $$.show(element); - } else { - $$.hide(element); +const $$ = { + on: function(root, eventName, selector, fn) { + root.addEventListener(eventName, function(event) { + const target = event.target.closest(selector); + if (root.contains(target)) { + fn.call(target, event); } - }, - visible: function(element) { - const style = getComputedStyle(element); - return style.display !== 'none'; - }, - executeScripts: function(scripts) { - scripts.forEach(function(script) { - const el = document.createElement('script'); - el.src = script; - el.async = true; - document.head.appendChild(el); - }); - }, - }; + }); + }, + show: function(element) { + element.style.display = 'block'; + }, + hide: function(element) { + element.style.display = 'none'; + }, + toggle: function(element, value) { + if (value) { + $$.show(element); + } else { + $$.hide(element); + } + }, + visible: function(element) { + const style = getComputedStyle(element); + return style.display !== 'none'; + }, + executeScripts: function(scripts) { + scripts.forEach(function(script) { + const el = document.createElement('script'); + el.type = 'module'; + el.src = script; + el.async = true; + document.head.appendChild(el); + }); + }, +}; - const onKeyDown = function(event) { - if (event.keyCode === 27) { - djdt.hide_one_level(); +const onKeyDown = function(event) { + if (event.keyCode === 27) { + djdt.hide_one_level(); + } +}; + +const ajax = function(url, init) { + init = Object.assign({credentials: 'same-origin'}, init); + return fetch(url, init).then(function(response) { + if (response.ok) { + return response.json(); + } else { + const win = document.querySelector('#djDebugWindow'); + win.innerHTML = '
»

'+response.status+': '+response.statusText+'

'; + $$.show(win); + return Promise.reject(); } - }; + }); +}; - const ajax = function(url, init) { - init = Object.assign({credentials: 'same-origin'}, init); - return fetch(url, init).then(function(response) { - if (response.ok) { - return response.json(); - } else { - const win = document.querySelector('#djDebugWindow'); - win.innerHTML = '
»

'+response.status+': '+response.statusText+'

'; - $$.show(win); - return Promise.reject(); +const djdt = { + handleDragged: false, + init: function() { + const djDebug = document.querySelector('#djDebug'); + $$.show(djDebug); + $$.on(djDebug.querySelector('#djDebugPanelList'), 'click', 'li a', function(event) { + event.preventDefault(); + if (!this.className) { + return; } - }); - }; - - const djdt = { - handleDragged: false, - init: function() { - const djDebug = document.querySelector('#djDebug'); - $$.show(djDebug); - $$.on(djDebug.querySelector('#djDebugPanelList'), 'click', 'li a', function(event) { - event.preventDefault(); - if (!this.className) { - return; - } - const current = djDebug.querySelector('#' + this.className); - if ($$.visible(current)) { - djdt.hide_panels(); - } else { - djdt.hide_panels(); + const current = djDebug.querySelector('#' + this.className); + if ($$.visible(current)) { + djdt.hide_panels(); + } else { + djdt.hide_panels(); - $$.show(current); - this.parentElement.classList.add('djdt-active'); + $$.show(current); + this.parentElement.classList.add('djdt-active'); - const inner = current.querySelector('.djDebugPanelContent .djdt-scroll'), - store_id = djDebug.dataset.storeId; - if (store_id && inner.children.length === 0) { - let url = djDebug.dataset.renderPanelUrl; - const url_params = new URLSearchParams(); - url_params.append('store_id', store_id); - url_params.append('panel_id', this.className); - url += '?' + url_params.toString(); - ajax(url).then(function(data) { - inner.previousElementSibling.remove(); // Remove AJAX loader - inner.innerHTML = data.content; - $$.executeScripts(data.scripts); - }); - } + const inner = current.querySelector('.djDebugPanelContent .djdt-scroll'), + store_id = djDebug.dataset.storeId; + if (store_id && inner.children.length === 0) { + let url = djDebug.dataset.renderPanelUrl; + const url_params = new URLSearchParams(); + url_params.append('store_id', store_id); + url_params.append('panel_id', this.className); + url += '?' + url_params.toString(); + ajax(url).then(function(data) { + inner.previousElementSibling.remove(); // Remove AJAX loader + inner.innerHTML = data.content; + $$.executeScripts(data.scripts); + }); } + } + }); + $$.on(djDebug, 'click', 'a.djDebugClose', function(event) { + event.preventDefault(); + djdt.hide_one_level(); + }); + $$.on(djDebug, 'click', '.djDebugPanelButton input[type=checkbox]', function() { + djdt.cookie.set(this.dataset.cookie, this.checked ? 'on' : 'off', { + path: '/', + expires: 10 }); - $$.on(djDebug, 'click', 'a.djDebugClose', function(event) { - event.preventDefault(); - djdt.hide_one_level(); - }); - $$.on(djDebug, 'click', '.djDebugPanelButton input[type=checkbox]', function() { - djdt.cookie.set(this.dataset.cookie, this.checked ? 'on' : 'off', { - path: '/', - expires: 10 - }); - }); + }); - // Used by the SQL and template panels - $$.on(djDebug, 'click', '.remoteCall', function(event) { - event.preventDefault(); + // Used by the SQL and template panels + $$.on(djDebug, 'click', '.remoteCall', function(event) { + event.preventDefault(); - const ajax_data = {}; + const ajax_data = {}; - if (this.tagName === 'BUTTON') { - const form = this.closest('form'); - ajax_data.url = this.formAction; + if (this.tagName === 'BUTTON') { + const form = this.closest('form'); + ajax_data.url = this.formAction; - if (form) { - ajax_data.body = new FormData(form); - ajax_data.method = form.method.toUpperCase(); - } + if (form) { + ajax_data.body = new FormData(form); + ajax_data.method = form.method.toUpperCase(); } + } - if (this.tagName === 'A') { - ajax_data.url = this.href; - } + if (this.tagName === 'A') { + ajax_data.url = this.href; + } - ajax(ajax_data.url, ajax_data).then(function(data) { - const win = djDebug.querySelector('#djDebugWindow'); - win.innerHTML = data.content; - $$.show(win); - }); + ajax(ajax_data.url, ajax_data).then(function(data) { + const win = djDebug.querySelector('#djDebugWindow'); + win.innerHTML = data.content; + $$.show(win); }); + }); - // Used by the cache, profiling and SQL panels - $$.on(djDebug, 'click', 'a.djToggleSwitch', function(event) { - event.preventDefault(); - const self = this; - const id = this.dataset.toggleId; - const open_me = this.textContent === this.dataset.toggleOpen; - const name = this.dataset.toggleName; - const container = this.closest('.djDebugPanelContent').querySelector('#' + name + '_' + id); - container.querySelectorAll('.djDebugCollapsed').forEach(function(e) { - $$.toggle(e, open_me); - }); - container.querySelectorAll('.djDebugUncollapsed').forEach(function(e) { - $$.toggle(e, !open_me); - }); - this.closest('.djDebugPanelContent').querySelectorAll('.djToggleDetails_' + id).forEach(function(e) { - if (open_me) { - e.classList.add('djSelected'); - e.classList.remove('djUnselected'); - self.textContent = self.dataset.toggleClose; - } else { - e.classList.remove('djSelected'); - e.classList.add('djUnselected'); - self.textContent = self.dataset.toggleOpen; - } - const switch_ = e.querySelector('.djToggleSwitch'); - if (switch_) { - switch_.textContent = self.textContent; - } - }); + // Used by the cache, profiling and SQL panels + $$.on(djDebug, 'click', 'a.djToggleSwitch', function(event) { + event.preventDefault(); + const self = this; + const id = this.dataset.toggleId; + const open_me = this.textContent === this.dataset.toggleOpen; + const name = this.dataset.toggleName; + const container = this.closest('.djDebugPanelContent').querySelector('#' + name + '_' + id); + container.querySelectorAll('.djDebugCollapsed').forEach(function(e) { + $$.toggle(e, open_me); }); - - djDebug.querySelector('#djHideToolBarButton').addEventListener('click', function(event) { - event.preventDefault(); - djdt.hide_toolbar(true); + container.querySelectorAll('.djDebugUncollapsed').forEach(function(e) { + $$.toggle(e, !open_me); }); - djDebug.querySelector('#djShowToolBarButton').addEventListener('click', function(event) { - event.preventDefault(); - if (!djdt.handleDragged) { - djdt.show_toolbar(); + this.closest('.djDebugPanelContent').querySelectorAll('.djToggleDetails_' + id).forEach(function(e) { + if (open_me) { + e.classList.add('djSelected'); + e.classList.remove('djUnselected'); + self.textContent = self.dataset.toggleClose; + } else { + e.classList.remove('djSelected'); + e.classList.add('djUnselected'); + self.textContent = self.dataset.toggleOpen; + } + const switch_ = e.querySelector('.djToggleSwitch'); + if (switch_) { + switch_.textContent = self.textContent; } }); - let startPageY, baseY; - const handle = document.querySelector('#djDebugToolbarHandle'); - const onHandleMove = function(event) { - // Chrome can send spurious mousemove events, so don't do anything unless the - // cursor really moved. Otherwise, it will be impossible to expand the toolbar - // due to djdt.handleDragged being set to true. - if (djdt.handleDragged || event.pageY !== startPageY) { - let top = baseY + event.pageY; + }); - if (top < 0) { - top = 0; - } else if (top + handle.offsetHeight > window.innerHeight) { - top = window.innerHeight - handle.offsetHeight; - } + djDebug.querySelector('#djHideToolBarButton').addEventListener('click', function(event) { + event.preventDefault(); + djdt.hide_toolbar(true); + }); + djDebug.querySelector('#djShowToolBarButton').addEventListener('click', function(event) { + event.preventDefault(); + if (!djdt.handleDragged) { + djdt.show_toolbar(); + } + }); + let startPageY, baseY; + const handle = document.querySelector('#djDebugToolbarHandle'); + const onHandleMove = function(event) { + // Chrome can send spurious mousemove events, so don't do anything unless the + // cursor really moved. Otherwise, it will be impossible to expand the toolbar + // due to djdt.handleDragged being set to true. + if (djdt.handleDragged || event.pageY !== startPageY) { + let top = baseY + event.pageY; - handle.style.top = top + 'px'; - djdt.handleDragged = true; + if (top < 0) { + top = 0; + } else if (top + handle.offsetHeight > window.innerHeight) { + top = window.innerHeight - handle.offsetHeight; } - }; - djDebug.querySelector('#djShowToolBarButton').addEventListener('mousedown', function(event) { + + handle.style.top = top + 'px'; + djdt.handleDragged = true; + } + }; + djDebug.querySelector('#djShowToolBarButton').addEventListener('mousedown', function(event) { + event.preventDefault(); + startPageY = event.pageY; + baseY = handle.offsetTop - startPageY; + document.addEventListener('mousemove', onHandleMove); + }); + document.addEventListener('mouseup', function (event) { + document.removeEventListener('mousemove', onHandleMove); + if (djdt.handleDragged) { event.preventDefault(); - startPageY = event.pageY; - baseY = handle.offsetTop - startPageY; - document.addEventListener('mousemove', onHandleMove); - }); - document.addEventListener('mouseup', function (event) { - document.removeEventListener('mousemove', onHandleMove); - if (djdt.handleDragged) { - event.preventDefault(); - localStorage.setItem('djdt.top', handle.offsetTop); - setTimeout(function () { - djdt.handleDragged = false; - }, 10); - } - }); - const show = localStorage.getItem('djdt.show') || djDebug.dataset.defaultShow; - if (show === 'true') { - djdt.show_toolbar(); - } else { - djdt.hide_toolbar(); + localStorage.setItem('djdt.top', handle.offsetTop); + setTimeout(function () { + djdt.handleDragged = false; + }, 10); } - }, - hide_panels: function() { - const djDebug = document.getElementById('djDebug'); - $$.hide(djDebug.querySelector('#djDebugWindow')); - djDebug.querySelectorAll('.djdt-panelContent').forEach(function(e) { - $$.hide(e); - }); - djDebug.querySelectorAll('#djDebugToolbar li').forEach(function(e) { - e.classList.remove('djdt-active'); - }); - }, - hide_toolbar: function() { - djdt.hide_panels(); + }); + const show = localStorage.getItem('djdt.show') || djDebug.dataset.defaultShow; + if (show === 'true') { + djdt.show_toolbar(); + } else { + djdt.hide_toolbar(); + } + }, + hide_panels: function() { + const djDebug = document.getElementById('djDebug'); + $$.hide(djDebug.querySelector('#djDebugWindow')); + djDebug.querySelectorAll('.djdt-panelContent').forEach(function(e) { + $$.hide(e); + }); + djDebug.querySelectorAll('#djDebugToolbar li').forEach(function(e) { + e.classList.remove('djdt-active'); + }); + }, + hide_toolbar: function() { + djdt.hide_panels(); - const djDebug = document.getElementById('djDebug'); - $$.hide(djDebug.querySelector('#djDebugToolbar')); + const djDebug = document.getElementById('djDebug'); + $$.hide(djDebug.querySelector('#djDebugToolbar')); - const handle = document.querySelector('#djDebugToolbarHandle'); - $$.show(handle); - // set handle position - let handleTop = localStorage.getItem('djdt.top'); - if (handleTop) { - handleTop = Math.min(handleTop, window.innerHeight - handle.offsetHeight); - handle.style.top = handleTop + 'px'; - } + const handle = document.querySelector('#djDebugToolbarHandle'); + $$.show(handle); + // set handle position + let handleTop = localStorage.getItem('djdt.top'); + if (handleTop) { + handleTop = Math.min(handleTop, window.innerHeight - handle.offsetHeight); + handle.style.top = handleTop + 'px'; + } - document.removeEventListener('keydown', onKeyDown); + document.removeEventListener('keydown', onKeyDown); - localStorage.setItem('djdt.show', 'false'); - }, - hide_one_level: function() { - const djDebug = document.getElementById('djDebug'); - if ($$.visible(djDebug.querySelector('#djDebugWindow'))) { - $$.hide(djDebug.querySelector('#djDebugWindow')); - } else if (djDebug.querySelector('#djDebugToolbar li.djdt-active')) { - djdt.hide_panels(); - } else { - djdt.hide_toolbar(true); + localStorage.setItem('djdt.show', 'false'); + }, + hide_one_level: function() { + const djDebug = document.getElementById('djDebug'); + if ($$.visible(djDebug.querySelector('#djDebugWindow'))) { + $$.hide(djDebug.querySelector('#djDebugWindow')); + } else if (djDebug.querySelector('#djDebugToolbar li.djdt-active')) { + djdt.hide_panels(); + } else { + djdt.hide_toolbar(true); + } + }, + show_toolbar: function() { + document.addEventListener('keydown', onKeyDown); + const djDebug = document.getElementById('djDebug'); + $$.hide(djDebug.querySelector('#djDebugToolbarHandle')); + $$.show(djDebug.querySelector('#djDebugToolbar')); + localStorage.setItem('djdt.show', 'true'); + }, + cookie: { + get: function(key){ + if (document.cookie.indexOf(key) === -1) { + return null; } - }, - show_toolbar: function() { - document.addEventListener('keydown', onKeyDown); - const djDebug = document.getElementById('djDebug'); - $$.hide(djDebug.querySelector('#djDebugToolbarHandle')); - $$.show(djDebug.querySelector('#djDebugToolbar')); - localStorage.setItem('djdt.show', 'true'); - }, - cookie: { - get: function(key){ - if (document.cookie.indexOf(key) === -1) { - return null; - } - const cookieArray = document.cookie.split('; '), - cookies = {}; + const cookieArray = document.cookie.split('; '), + cookies = {}; - cookieArray.forEach(function(e){ - const parts = e.split('='); - cookies[ parts[0] ] = parts[1]; - }); + cookieArray.forEach(function(e){ + const parts = e.split('='); + cookies[ parts[0] ] = parts[1]; + }); - return cookies[ key ]; - }, - set: function(key, value, options){ - options = options || {}; + return cookies[ key ]; + }, + set: function(key, value, options){ + options = options || {}; - if (typeof options.expires === 'number') { - const days = options.expires, t = options.expires = new Date(); - t.setDate(t.getDate() + days); - } + if (typeof options.expires === 'number') { + const days = options.expires, t = options.expires = new Date(); + t.setDate(t.getDate() + days); + } - document.cookie = [ - encodeURIComponent(key) + '=' + String(value), - options.expires ? '; expires=' + options.expires.toUTCString() : '', - options.path ? '; path=' + options.path : '', - options.domain ? '; domain=' + options.domain : '', - options.secure ? '; secure' : '' - ].join(''); + document.cookie = [ + encodeURIComponent(key) + '=' + String(value), + options.expires ? '; expires=' + options.expires.toUTCString() : '', + options.path ? '; path=' + options.path : '', + options.domain ? '; domain=' + options.domain : '', + options.secure ? '; secure' : '' + ].join(''); - return value; - } - }, - }; - window.djdt = { - show_toolbar: djdt.show_toolbar, - hide_toolbar: djdt.hide_toolbar, - init: djdt.init, - close: djdt.hide_one_level, - cookie: djdt.cookie, - }; + return value; + } + }, +}; +window.djdt = { + show_toolbar: djdt.show_toolbar, + hide_toolbar: djdt.hide_toolbar, + init: djdt.init, + close: djdt.hide_one_level, + cookie: djdt.cookie, +}; - if (document.readyState !== 'loading') { - djdt.init(); - } else { - document.addEventListener('DOMContentLoaded', djdt.init); - } -})(); +if (document.readyState !== 'loading') { + djdt.init(); +} else { + document.addEventListener('DOMContentLoaded', djdt.init); +} diff --git a/debug_toolbar/static/debug_toolbar/js/toolbar.timer.js b/debug_toolbar/static/debug_toolbar/js/toolbar.timer.js index a4625d607..fe8ee7310 100644 --- a/debug_toolbar/static/debug_toolbar/js/toolbar.timer.js +++ b/debug_toolbar/static/debug_toolbar/js/toolbar.timer.js @@ -1,43 +1,41 @@ -(function () { - const timingOffset = performance.timing.navigationStart, - timingEnd = performance.timing.loadEventEnd, - totalTime = timingEnd - timingOffset; - function getLeft(stat) { - return ((performance.timing[stat] - timingOffset) / (totalTime)) * 100.0; - } - function getCSSWidth(stat, endStat) { - let width = ((performance.timing[endStat] - performance.timing[stat]) / (totalTime)) * 100.0; - // Calculate relative percent (same as sql panel logic) - width = 100.0 * width / (100.0 - getLeft(stat)); - return (width < 1) ? "2px" : width + "%"; - } - function addRow(stat, endStat) { - const row = document.createElement('tr'); - if (endStat) { - // Render a start through end bar - row.innerHTML = '' + stat.replace('Start', '') + '' + - '
 
' + - '' + (performance.timing[stat] - timingOffset) + ' (+' + (performance.timing[endStat] - performance.timing[stat]) + ')'; - row.querySelector('strong').style.width = getCSSWidth(stat, endStat); - } else { - // Render a point in time - row.innerHTML = '' + stat + '' + - '
 
' + - '' + (performance.timing[stat] - timingOffset) + ''; - row.querySelector('strong').style.width = '2px'; - } - row.querySelector('.djDebugLineChart').style.left = getLeft(stat) + '%'; - document.querySelector('#djDebugBrowserTimingTableBody').appendChild(row); +const timingOffset = performance.timing.navigationStart, + timingEnd = performance.timing.loadEventEnd, + totalTime = timingEnd - timingOffset; +function getLeft(stat) { + return ((performance.timing[stat] - timingOffset) / (totalTime)) * 100.0; +} +function getCSSWidth(stat, endStat) { + let width = ((performance.timing[endStat] - performance.timing[stat]) / (totalTime)) * 100.0; + // Calculate relative percent (same as sql panel logic) + width = 100.0 * width / (100.0 - getLeft(stat)); + return (width < 1) ? "2px" : width + "%"; +} +function addRow(stat, endStat) { + const row = document.createElement('tr'); + if (endStat) { + // Render a start through end bar + row.innerHTML = '' + stat.replace('Start', '') + '' + + '
 
' + + '' + (performance.timing[stat] - timingOffset) + ' (+' + (performance.timing[endStat] - performance.timing[stat]) + ')'; + row.querySelector('strong').style.width = getCSSWidth(stat, endStat); + } else { + // Render a point in time + row.innerHTML = '' + stat + '' + + '
 
' + + '' + (performance.timing[stat] - timingOffset) + ''; + row.querySelector('strong').style.width = '2px'; } + row.querySelector('.djDebugLineChart').style.left = getLeft(stat) + '%'; + document.querySelector('#djDebugBrowserTimingTableBody').appendChild(row); +} - // This is a reasonably complete and ordered set of timing periods (2 params) and events (1 param) - addRow('domainLookupStart', 'domainLookupEnd'); - addRow('connectStart', 'connectEnd'); - addRow('requestStart', 'responseEnd'); // There is no requestEnd - addRow('responseStart', 'responseEnd'); - addRow('domLoading', 'domComplete'); // Spans the events below - addRow('domInteractive'); - addRow('domContentLoadedEventStart', 'domContentLoadedEventEnd'); - addRow('loadEventStart', 'loadEventEnd'); - document.querySelector('#djDebugBrowserTiming').classList.remove('djdt-hidden'); -})(); +// This is a reasonably complete and ordered set of timing periods (2 params) and events (1 param) +addRow('domainLookupStart', 'domainLookupEnd'); +addRow('connectStart', 'connectEnd'); +addRow('requestStart', 'responseEnd'); // There is no requestEnd +addRow('responseStart', 'responseEnd'); +addRow('domLoading', 'domComplete'); // Spans the events below +addRow('domInteractive'); +addRow('domContentLoadedEventStart', 'domContentLoadedEventEnd'); +addRow('loadEventStart', 'loadEventEnd'); +document.querySelector('#djDebugBrowserTiming').classList.remove('djdt-hidden'); diff --git a/debug_toolbar/templates/debug_toolbar/base.html b/debug_toolbar/templates/debug_toolbar/base.html index 4281ad623..d8080db91 100644 --- a/debug_toolbar/templates/debug_toolbar/base.html +++ b/debug_toolbar/templates/debug_toolbar/base.html @@ -1,7 +1,7 @@ {% load i18n %}{% load static %} - +
Django Debug Toolbar Redirects Panel: {{ status_line }} - +

{{ status_line }}