1
0
mirror of https://github.com/gorhill/uBlock.git synced 2024-10-04 16:47:15 +02:00

Reset the DOM inspector when URL in top context changes

Related issue:
https://github.com/uBlockOrigin/uBlock-issues/issues/542
This commit is contained in:
Raymond Hill 2023-12-04 08:07:53 -05:00
parent 941077a25c
commit c744c87607
No known key found for this signature in database
GPG Key ID: 25E1490B761470C2
3 changed files with 60 additions and 64 deletions

View File

@ -19,6 +19,8 @@
Home: https://github.com/gorhill/uBlock Home: https://github.com/gorhill/uBlock
*/ */
/* globals browser */
'use strict'; 'use strict';
import { dom, qs$, qsa$ } from './dom.js'; import { dom, qs$, qsa$ } from './dom.js';
@ -29,21 +31,8 @@ import { dom, qs$, qsa$ } from './dom.js';
/******************************************************************************/ /******************************************************************************/
const showdomButton = qs$('#showdom');
// Don't bother if the browser is not modern enough.
if (
typeof Map === 'undefined' ||
Map.polyfill ||
typeof WeakMap === 'undefined'
) {
dom.cl.add(showdomButton, 'disabled');
return;
}
/******************************************************************************/
const logger = self.logger; const logger = self.logger;
const showdomButton = qs$('#showdom');
const inspector = qs$('#domInspector'); const inspector = qs$('#domInspector');
const domTree = qs$('#domTree'); const domTree = qs$('#domTree');
const filterToIdMap = new Map(); const filterToIdMap = new Map();
@ -71,7 +60,7 @@ inspectorFramePort.onmessageerror = ( ) => {
/******************************************************************************/ /******************************************************************************/
const nodeFromDomEntry = function(entry) { const nodeFromDomEntry = entry => {
const li = document.createElement('li'); const li = document.createElement('li');
dom.attr(li, 'id', entry.nid); dom.attr(li, 'id', entry.nid);
// expander/collapser // expander/collapser
@ -107,7 +96,7 @@ const nodeFromDomEntry = function(entry) {
/******************************************************************************/ /******************************************************************************/
const appendListItem = function(ul, li) { const appendListItem = (ul, li) => {
ul.appendChild(li); ul.appendChild(li);
// Ancestor nodes of a node which is affected by a cosmetic filter will // Ancestor nodes of a node which is affected by a cosmetic filter will
// be marked as "containing cosmetic filters", for user convenience. // be marked as "containing cosmetic filters", for user convenience.
@ -121,7 +110,7 @@ const appendListItem = function(ul, li) {
/******************************************************************************/ /******************************************************************************/
const renderDOMFull = function(response) { const renderDOMFull = response => {
const domTreeParent = domTree.parentElement; const domTreeParent = domTree.parentElement;
let ul = domTreeParent.removeChild(domTree); let ul = domTreeParent.removeChild(domTree);
logger.removeAllChildren(domTree); logger.removeAllChildren(domTree);
@ -165,7 +154,7 @@ const renderDOMFull = function(response) {
/******************************************************************************/ /******************************************************************************/
const patchIncremental = function(from, delta) { const patchIncremental = (from, delta) => {
let li = from.parentElement.parentElement; let li = from.parentElement.parentElement;
const patchCosmeticHide = delta >= 0 && const patchCosmeticHide = delta >= 0 &&
dom.cl.has(from, 'isCosmeticHide') && dom.cl.has(from, 'isCosmeticHide') &&
@ -189,7 +178,7 @@ const patchIncremental = function(from, delta) {
/******************************************************************************/ /******************************************************************************/
const renderDOMIncremental = function(response) { const renderDOMIncremental = response => {
// Process each journal entry: // Process each journal entry:
// 1 = node added // 1 = node added
// -1 = node removed // -1 = node removed
@ -248,7 +237,7 @@ const renderDOMIncremental = function(response) {
/******************************************************************************/ /******************************************************************************/
const countFromNode = function(li) { const countFromNode = li => {
const span = li.children[2]; const span = li.children[2];
const cnt = parseInt(dom.attr(span, 'data-cnt'), 10); const cnt = parseInt(dom.attr(span, 'data-cnt'), 10);
return isNaN(cnt) ? 0 : cnt; return isNaN(cnt) ? 0 : cnt;
@ -256,7 +245,7 @@ const countFromNode = function(li) {
/******************************************************************************/ /******************************************************************************/
const selectorFromNode = function(node) { const selectorFromNode = node => {
let selector = ''; let selector = '';
while ( node !== null ) { while ( node !== null ) {
if ( node.localName === 'li' ) { if ( node.localName === 'li' ) {
@ -273,7 +262,7 @@ const selectorFromNode = function(node) {
/******************************************************************************/ /******************************************************************************/
const selectorFromFilter = function(node) { const selectorFromFilter = node => {
while ( node !== null ) { while ( node !== null ) {
if ( node.localName === 'li' ) { if ( node.localName === 'li' ) {
const code = qs$(node, 'code:nth-of-type(2)'); const code = qs$(node, 'code:nth-of-type(2)');
@ -288,7 +277,7 @@ const selectorFromFilter = function(node) {
/******************************************************************************/ /******************************************************************************/
const nidFromNode = function(node) { const nidFromNode = node => {
let li = node; let li = node;
while ( li !== null ) { while ( li !== null ) {
if ( li.localName === 'li' ) { if ( li.localName === 'li' ) {
@ -301,7 +290,7 @@ const nidFromNode = function(node) {
/******************************************************************************/ /******************************************************************************/
const startDialog = (function() { const startDialog = (( ) => {
let dialog; let dialog;
let textarea; let textarea;
let hideSelectors = []; let hideSelectors = [];
@ -414,7 +403,7 @@ const startDialog = (function() {
/******************************************************************************/ /******************************************************************************/
const onClicked = function(ev) { const onClicked = ev => {
ev.stopPropagation(); ev.stopPropagation();
if ( inspectedTabId === 0 ) { return; } if ( inspectedTabId === 0 ) { return; }
@ -475,21 +464,19 @@ const onClicked = function(ev) {
/******************************************************************************/ /******************************************************************************/
const onMouseOver = (function() { const onMouseOver = (( ) => {
let mouseoverTarget = null; let mouseoverTarget = null;
const timerHandler = ( ) => { const mouseoverTimer = vAPI.defer.create(( ) => {
inspectorFramePort.postMessage({ inspectorFramePort.postMessage({
what: 'highlightOne', what: 'highlightOne',
selector: selectorFromNode(mouseoverTarget), selector: selectorFromNode(mouseoverTarget),
nid: nidFromNode(mouseoverTarget), nid: nidFromNode(mouseoverTarget),
scrollTo: true scrollTo: true
}); });
}; });
const mouseoverTimer = vAPI.defer.create(timerHandler); return ev => {
return function(ev) {
if ( inspectedTabId === 0 ) { return; } if ( inspectedTabId === 0 ) { return; }
// Convenience: skip real-time highlighting if shift key is pressed. // Convenience: skip real-time highlighting if shift key is pressed.
if ( ev.shiftKey ) { return; } if ( ev.shiftKey ) { return; }
@ -503,30 +490,34 @@ const onMouseOver = (function() {
/******************************************************************************/ /******************************************************************************/
const currentTabId = function() { const currentTabId = ( ) => {
if ( dom.cl.has(showdomButton, 'active') === false ) { return 0; } if ( dom.cl.has(showdomButton, 'active') === false ) { return 0; }
return logger.tabIdFromPageSelector(); return logger.tabIdFromPageSelector();
}; };
/******************************************************************************/ /******************************************************************************/
const injectInspector = function() { const injectInspector = (( ) => {
const tabId = currentTabId(); const timer = vAPI.defer.create(( ) => {
if ( tabId <= 0 ) { return; } const tabId = currentTabId();
inspectedTabId = tabId; if ( tabId <= 0 ) { return; }
vAPI.messaging.send('loggerUI', { inspectedTabId = tabId;
what: 'scriptlet', vAPI.messaging.send('loggerUI', {
tabId, what: 'scriptlet',
scriptlet: 'dom-inspector', tabId,
scriptlet: 'dom-inspector',
});
}); });
}; return ( ) => {
shutdownInspector();
timer.offon(353);
};
})();
/******************************************************************************/ /******************************************************************************/
const shutdownInspector = function() { const shutdownInspector = ( ) => {
if ( inspectorFramePort !== undefined ) { inspectorFramePort.postMessage({ what: 'quitInspector' });
inspectorFramePort.postMessage({ what: 'quitInspector' });
}
logger.removeAllChildren(domTree); logger.removeAllChildren(domTree);
dom.cl.remove(inspector, 'vExpanded'); dom.cl.remove(inspector, 'vExpanded');
inspectedTabId = 0; inspectedTabId = 0;
@ -534,20 +525,27 @@ const shutdownInspector = function() {
/******************************************************************************/ /******************************************************************************/
const onTabIdChanged = function() { const onTabIdChanged = ( ) => {
const tabId = currentTabId(); const tabId = currentTabId();
if ( tabId <= 0 ) { if ( tabId <= 0 ) {
return toggleOff(); return toggleOff();
} }
if ( inspectedTabId !== tabId ) { if ( inspectedTabId !== tabId ) {
shutdownInspector();
injectInspector(); injectInspector();
} }
}; };
/******************************************************************************/ /******************************************************************************/
const toggleVCompactView = function() { const onDOMContentLoaded = details => {
if ( details.tabId !== inspectedTabId ) { return; }
if ( details.frameId !== 0 ) { return; }
injectInspector();
};
/******************************************************************************/
const toggleVCompactView = ( ) => {
const state = dom.cl.toggle(inspector, 'vExpanded'); const state = dom.cl.toggle(inspector, 'vExpanded');
const branches = qsa$('#domInspector li.branch'); const branches = qsa$('#domInspector li.branch');
for ( const branch of branches ) { for ( const branch of branches ) {
@ -555,13 +553,13 @@ const toggleVCompactView = function() {
} }
}; };
const toggleHCompactView = function() { const toggleHCompactView = ( ) => {
dom.cl.toggle(inspector, 'hCompact'); dom.cl.toggle(inspector, 'hCompact');
}; };
/******************************************************************************/ /******************************************************************************/
const revert = function() { const revert = ( ) => {
dom.cl.remove('#domTree .off', 'off'); dom.cl.remove('#domTree .off', 'off');
inspectorFramePort.postMessage({ what: 'resetToggledNodes' }); inspectorFramePort.postMessage({ what: 'resetToggledNodes' });
dom.cl.add(qs$(inspector, '.permatoolbar .revert'), 'disabled'); dom.cl.add(qs$(inspector, '.permatoolbar .revert'), 'disabled');
@ -570,7 +568,7 @@ const revert = function() {
/******************************************************************************/ /******************************************************************************/
const toggleOn = function() { const toggleOn = ( ) => {
dom.cl.add('#inspectors', 'dom'); dom.cl.add('#inspectors', 'dom');
window.addEventListener('beforeunload', toggleOff); window.addEventListener('beforeunload', toggleOff);
document.addEventListener('tabIdChanged', onTabIdChanged); document.addEventListener('tabIdChanged', onTabIdChanged);
@ -580,12 +578,13 @@ const toggleOn = function() {
dom.on('#domInspector .hCompactToggler', 'click', toggleHCompactView); dom.on('#domInspector .hCompactToggler', 'click', toggleHCompactView);
dom.on('#domInspector .permatoolbar .revert', 'click', revert); dom.on('#domInspector .permatoolbar .revert', 'click', revert);
dom.on('#domInspector .permatoolbar .commit', 'click', startDialog); dom.on('#domInspector .permatoolbar .commit', 'click', startDialog);
browser.webNavigation.onDOMContentLoaded.addListener(onDOMContentLoaded);
injectInspector(); injectInspector();
}; };
/******************************************************************************/ /******************************************************************************/
const toggleOff = function() { const toggleOff = ( ) => {
dom.cl.remove(showdomButton, 'active'); dom.cl.remove(showdomButton, 'active');
dom.cl.remove('#inspectors', 'dom'); dom.cl.remove('#inspectors', 'dom');
shutdownInspector(); shutdownInspector();
@ -597,12 +596,13 @@ const toggleOff = function() {
dom.off('#domInspector .hCompactToggler', 'click', toggleHCompactView); dom.off('#domInspector .hCompactToggler', 'click', toggleHCompactView);
dom.off('#domInspector .permatoolbar .revert', 'click', revert); dom.off('#domInspector .permatoolbar .revert', 'click', revert);
dom.off('#domInspector .permatoolbar .commit', 'click', startDialog); dom.off('#domInspector .permatoolbar .commit', 'click', startDialog);
browser.webNavigation.onDOMContentLoaded.removeListener(onDOMContentLoaded);
inspectedTabId = 0; inspectedTabId = 0;
}; };
/******************************************************************************/ /******************************************************************************/
const toggle = function() { const toggle = ( ) => {
if ( dom.cl.toggle(showdomButton, 'active') ) { if ( dom.cl.toggle(showdomButton, 'active') ) {
toggleOn(); toggleOn();
} else { } else {

View File

@ -972,7 +972,7 @@ const viewPort = (( ) => {
const updateCurrentTabTitle = (( ) => { const updateCurrentTabTitle = (( ) => {
const i18nCurrentTab = i18n$('loggerCurrentTab'); const i18nCurrentTab = i18n$('loggerCurrentTab');
return function() { return ( ) => {
const select = qs$('#pageSelector'); const select = qs$('#pageSelector');
if ( select.value !== '_' || activeTabId === 0 ) { return; } if ( select.value !== '_' || activeTabId === 0 ) { return; }
const opt0 = qs$(select, '[value="_"]'); const opt0 = qs$(select, '[value="_"]');
@ -1033,8 +1033,7 @@ const synchronizeTabIds = function(newTabIds) {
return newTabIds.get(a).localeCompare(newTabIds.get(b)); return newTabIds.get(a).localeCompare(newTabIds.get(b));
}); });
let j = 3; let j = 3;
for ( let i = 0; i < tabIds.length; i++ ) { for ( const tabId of tabIds ) {
const tabId = tabIds[i];
if ( tabId <= 0 ) { continue; } if ( tabId <= 0 ) { continue; }
if ( j === select.options.length ) { if ( j === select.options.length ) {
select.appendChild(document.createElement('option')); select.appendChild(document.createElement('option'));

View File

@ -1696,17 +1696,14 @@ const getLoggerData = async function(details, activeTabId, callback) {
tooltips: µb.userSettings.tooltipsDisabled === false tooltips: µb.userSettings.tooltipsDisabled === false
}; };
if ( µb.pageStoresToken !== details.tabIdsToken ) { if ( µb.pageStoresToken !== details.tabIdsToken ) {
const tabIds = new Map(); response.tabIds = [];
for ( const [ tabId, pageStore ] of µb.pageStores ) { for ( const [ tabId, pageStore ] of µb.pageStores ) {
const { rawURL } = pageStore; const { rawURL, title } = pageStore;
if ( if ( rawURL.startsWith(extensionOriginURL) ) {
rawURL.startsWith(extensionOriginURL) === false || if ( rawURL.startsWith(documentBlockedURL) === false ) { continue; }
rawURL.startsWith(documentBlockedURL)
) {
tabIds.set(tabId, pageStore.title);
} }
response.tabIds.push([ tabId, title ]);
} }
response.tabIds = Array.from(tabIds);
} }
if ( activeTabId ) { if ( activeTabId ) {
const pageStore = µb.pageStoreFromTabId(activeTabId); const pageStore = µb.pageStoreFromTabId(activeTabId);