From cf47bdc4c8e446987d37adb618f79e101dfac8a6 Mon Sep 17 00:00:00 2001 From: gorhill Date: Tue, 29 Mar 2016 11:37:19 -0400 Subject: [PATCH] this tentatively fixes #1514 --- platform/firefox/frameScript.js | 40 +++++++++++---------------------- 1 file changed, 13 insertions(+), 27 deletions(-) diff --git a/platform/firefox/frameScript.js b/platform/firefox/frameScript.js index 55e0757ce..4e09fdcbb 100644 --- a/platform/firefox/frameScript.js +++ b/platform/firefox/frameScript.js @@ -24,44 +24,30 @@ // https://developer.mozilla.org/en-US/Firefox/Multiprocess_Firefox/Frame_script_environment (function() { - 'use strict'; - if ( !this.docShell ) { - return; - } - let {LocationChangeListener} = Components.utils.import( Components.stack.filename.replace('Script', 'Module'), null ); // https://github.com/gorhill/uBlock/issues/1444 - // Apparently the same context is used for all extensions, hence we must - // use scoped variables to ensure no collision. - let locationChangeListener; + // Apparently, on older versions of Firefox (31 and less), the same context + // is used for all extensions, hence we must use a unique variable name to + // ensure no collision. + this.ublock0LocationChangeListener = null; - // https://developer.mozilla.org/en-US/Add-ons/Code_snippets/Progress_Listeners - // "Note that the browser uses a weak reference to your listener object, - // "so make sure to keep an external reference to your object to ensure - // "that it stays in memory." - // This listener below allows us to keep `locationChangeListener` alive - // until we no longer need it. - let shutdown = function(ev) { - if ( ev.target === this ) { - this.removeEventListener('unload', shutdown); - locationChangeListener = null; + // https://github.com/gorhill/uBlock/issues/1514 + // Fix? + if ( this.docShell ) { + let webProgress = this.docShell + .QueryInterface(Components.interfaces.nsIInterfaceRequestor) + .getInterface(Components.interfaces.nsIWebProgress); + let domWindow = webProgress.DOMWindow; + if ( domWindow === domWindow.top ) { + this.ublock0LocationChangeListener = new LocationChangeListener(this.docShell, webProgress); } - }; - this.addEventListener('unload', shutdown); - - let webProgress = this.docShell - .QueryInterface(Components.interfaces.nsIInterfaceRequestor) - .getInterface(Components.interfaces.nsIWebProgress); - if ( webProgress && webProgress.isTopLevel ) { - locationChangeListener = new LocationChangeListener(this.docShell, webProgress); } - }).call(this); /******************************************************************************/