diff --git a/platform/chromium/vapi-background.js b/platform/chromium/vapi-background.js index 7ec139227b24c..25e079ffb7950 100644 --- a/platform/chromium/vapi-background.js +++ b/platform/chromium/vapi-background.js @@ -299,9 +299,6 @@ var toChromiumTabId = function(tabId) { /******************************************************************************/ vAPI.tabs.registerListeners = function() { - var onNavigationClient = this.onNavigation || noopFunc; - var onUpdatedClient = this.onUpdated || noopFunc; - // https://developer.chrome.com/extensions/webNavigation // [onCreatedNavigationTarget ->] // onBeforeNavigate -> @@ -315,74 +312,71 @@ vAPI.tabs.registerListeners = function() { // properly setup if network requests are fired from within the tab. // Example: Chromium + case #6 at // http://raymondhill.net/ublock/popup.html - var reGoodForWebRequestAPI = /^https?:\/\//; + const reGoodForWebRequestAPI = /^https?:\/\//; // https://forums.lanik.us/viewtopic.php?f=62&t=32826 // Chromium-based browsers: sanitize target URL. I've seen data: URI with // newline characters in standard fields, possibly as a way of evading // filters. As per spec, there should be no whitespaces in a data: URI's // standard fields. - var sanitizeURL = function(url) { + const sanitizeURL = function(url) { if ( url.startsWith('data:') === false ) { return url; } - var pos = url.indexOf(','); + const pos = url.indexOf(','); if ( pos === -1 ) { return url; } - var s = url.slice(0, pos); + const s = url.slice(0, pos); if ( s.search(/\s/) === -1 ) { return url; } return s.replace(/\s+/, '') + url.slice(pos); }; - var onCreatedNavigationTarget = function(details) { + browser.webNavigation.onCreatedNavigationTarget.addListener(details => { if ( typeof details.url !== 'string' ) { details.url = ''; } if ( reGoodForWebRequestAPI.test(details.url) === false ) { details.frameId = 0; details.url = sanitizeURL(details.url); - onNavigationClient(details); + if ( this.onNavigation ) { + this.onNavigation(details); + } } - if ( typeof vAPI.tabs.onPopupCreated === 'function' ) { + if ( vAPI.tabs.onPopupCreated ) { vAPI.tabs.onPopupCreated( details.tabId, details.sourceTabId ); } - }; + }); - var onCommitted = function(details) { + browser.webNavigation.onCommitted.addListener(details => { details.url = sanitizeURL(details.url); - onNavigationClient(details); - }; - - var onActivated = function(details) { - if ( vAPI.contextMenu instanceof Object ) { - vAPI.contextMenu.onMustUpdate(details.tabId); + if ( this.onNavigation ) { + this.onNavigation(details); } - }; + }); // https://github.com/gorhill/uBlock/issues/3073 - // - Fall back to `tab.url` when `changeInfo.url` is not set. - var onUpdated = function(tabId, changeInfo, tab) { + // Fall back to `tab.url` when `changeInfo.url` is not set. + browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => { if ( typeof changeInfo.url !== 'string' ) { changeInfo.url = tab && tab.url; } if ( changeInfo.url ) { changeInfo.url = sanitizeURL(changeInfo.url); } - onUpdatedClient(tabId, changeInfo, tab); - }; - - chrome.webNavigation.onCommitted.addListener(onCommitted); - // Not supported on Firefox WebExtensions yet. - if ( chrome.webNavigation.onCreatedNavigationTarget instanceof Object ) { - chrome.webNavigation.onCreatedNavigationTarget.addListener(onCreatedNavigationTarget); - } - chrome.tabs.onActivated.addListener(onActivated); - chrome.tabs.onUpdated.addListener(onUpdated); + if ( this.onUpdated ) { + this.onUpdated(tabId, changeInfo, tab); + } + }); - if ( typeof this.onClosed === 'function' ) { - chrome.tabs.onRemoved.addListener(this.onClosed); - } + browser.tabs.onActivated.addListener(( ) => { + if ( vAPI.contextMenu ) { + vAPI.contextMenu.onMustUpdate(); + } + }); + browser.tabs.onRemoved.addListener((tabId, details) => { + this.onClosed(tabId, details); + }); }; /******************************************************************************/ @@ -395,7 +389,7 @@ vAPI.tabs.get = function(tabId, callback) { if ( tabId === null ) { chrome.tabs.query( { active: true, currentWindow: true }, - function(tabs) { + tabs => { void chrome.runtime.lastError; callback( Array.isArray(tabs) && tabs.length !== 0 ? tabs[0] : null diff --git a/src/js/contextmenu.js b/src/js/contextmenu.js index 9c0e268a57bd2..4d70ecb248873 100644 --- a/src/js/contextmenu.js +++ b/src/js/contextmenu.js @@ -23,7 +23,7 @@ /******************************************************************************/ -µBlock.contextMenu = (function() { +µBlock.contextMenu = (( ) => { /******************************************************************************/ @@ -35,7 +35,7 @@ if ( vAPI.contextMenu === undefined ) { /******************************************************************************/ -var onBlockElement = function(details, tab) { +const onBlockElement = function(details, tab) { if ( tab === undefined ) { return; } if ( /^https?:\/\//.test(tab.url) === false ) { return; } let tagName = details.tagName || ''; @@ -62,7 +62,7 @@ var onBlockElement = function(details, tab) { /******************************************************************************/ -var onTemporarilyAllowLargeMediaElements = function(details, tab) { +const onTemporarilyAllowLargeMediaElements = function(details, tab) { if ( tab === undefined ) { return; } let pageStore = µBlock.pageStoreFromTabId(tab.id); if ( pageStore === null ) { return; } @@ -71,7 +71,7 @@ var onTemporarilyAllowLargeMediaElements = function(details, tab) { /******************************************************************************/ -var onEntryClicked = function(details, tab) { +const onEntryClicked = function(details, tab) { if ( details.menuItemId === 'uBlock0-blockElement' ) { return onBlockElement(details, tab); } @@ -82,7 +82,7 @@ var onEntryClicked = function(details, tab) { /******************************************************************************/ -var menuEntries = [ +const menuEntries = [ { id: 'uBlock0-blockElement', title: vAPI.i18n('pickerContextMenuEntry'), @@ -97,9 +97,11 @@ var menuEntries = [ /******************************************************************************/ -var update = function(tabId) { +let currentBits = 0; + +const update = function(tabId = undefined) { let newBits = 0; - if ( µBlock.userSettings.contextMenuEnabled && tabId !== null ) { + if ( µBlock.userSettings.contextMenuEnabled && tabId !== undefined ) { let pageStore = µBlock.pageStoreFromTabId(tabId); if ( pageStore && pageStore.getNetFilteringSwitch() ) { newBits |= 0x01; @@ -120,26 +122,27 @@ var update = function(tabId) { vAPI.contextMenu.setEntries(usedEntries, onEntryClicked); }; -var currentBits = 0; - -vAPI.contextMenu.onMustUpdate = update; - /******************************************************************************/ -return { - update: function(tabId) { - if ( µBlock.userSettings.contextMenuEnabled && tabId === undefined ) { - vAPI.tabs.get(null, function(tab) { - if ( tab ) { - update(tab.id); - } - }); - return; - } - update(tabId); +// https://github.com/uBlockOrigin/uBlock-issues/issues/151 +// For unknown reasons, the currently active tab will not be successfully +// looked up after closing a window. + +vAPI.contextMenu.onMustUpdate = function(tabId = undefined) { + if ( µBlock.userSettings.contextMenuEnabled === false ) { + return update(); + } + if ( tabId !== undefined ) { + return update(tabId); } + vAPI.tabs.get(null, tab => { + if ( tab instanceof Object === false ) { return; } + update(tab.id); + }); }; +return { update: vAPI.contextMenu.onMustUpdate }; + /******************************************************************************/ })(); diff --git a/src/js/tab.js b/src/js/tab.js index 0374fc61914cf..648309e159c49 100644 --- a/src/js/tab.js +++ b/src/js/tab.js @@ -524,10 +524,9 @@ vAPI.tabs.onUpdated = function(tabId, changeInfo, tab) { /******************************************************************************/ vAPI.tabs.onClosed = function(tabId) { - if ( vAPI.isBehindTheSceneTabId(tabId) ) { - return; - } + if ( vAPI.isBehindTheSceneTabId(tabId) ) { return; } µb.unbindTabFromPageStats(tabId); + µb.contextMenu.update(); }; /******************************************************************************/