mirror of
https://github.com/gorhill/uMatrix.git
synced 2024-06-28 11:00:38 +12:00
this should fix #284
This commit is contained in:
parent
d333eb96ea
commit
e088e9cf70
|
@ -19,11 +19,13 @@
|
||||||
Home: https://github.com/gorhill/uMatrix
|
Home: https://github.com/gorhill/uMatrix
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* global Components */
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
this.EXPORTED_SYMBOLS = ['contentObserver'];
|
this.EXPORTED_SYMBOLS = ['contentObserver', 'LocationChangeListener'];
|
||||||
|
|
||||||
const {interfaces: Ci, utils: Cu} = Components;
|
const {interfaces: Ci, utils: Cu} = Components;
|
||||||
const {Services} = Cu.import('resource://gre/modules/Services.jsm', null);
|
const {Services} = Cu.import('resource://gre/modules/Services.jsm', null);
|
||||||
|
@ -236,6 +238,41 @@ const contentObserver = {
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
|
const locationChangedMessageName = hostName + ':locationChanged';
|
||||||
|
|
||||||
|
const LocationChangeListener = function(docShell) {
|
||||||
|
if ( !docShell ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var requestor = docShell.QueryInterface(Ci.nsIInterfaceRequestor);
|
||||||
|
var ds = requestor.getInterface(Ci.nsIWebProgress);
|
||||||
|
var mm = requestor.getInterface(Ci.nsIContentFrameMessageManager);
|
||||||
|
|
||||||
|
if ( ds && mm && typeof mm.sendAsyncMessage === 'function' ) {
|
||||||
|
this.docShell = ds;
|
||||||
|
this.messageManager = mm;
|
||||||
|
ds.addProgressListener(this, Ci.nsIWebProgress.NOTIFY_LOCATION);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
LocationChangeListener.prototype.QueryInterface = XPCOMUtils.generateQI([
|
||||||
|
'nsIWebProgressListener',
|
||||||
|
'nsISupportsWeakReference'
|
||||||
|
]);
|
||||||
|
|
||||||
|
LocationChangeListener.prototype.onLocationChange = function(webProgress, request, location, flags) {
|
||||||
|
if ( !webProgress.isTopLevel ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.messageManager.sendAsyncMessage(locationChangedMessageName, {
|
||||||
|
url: location.asciiSpec,
|
||||||
|
flags: flags,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
contentObserver.register();
|
contentObserver.register();
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
|
@ -21,13 +21,15 @@
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
|
var locationChangeListener; // Keep alive while frameScript is alive
|
||||||
|
|
||||||
(function() {
|
(function() {
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
let {contentObserver} = Components.utils.import(
|
let {contentObserver, LocationChangeListener} = Components.utils.import(
|
||||||
Components.stack.filename.replace('Script', 'Module'),
|
Components.stack.filename.replace('Script', 'Module'),
|
||||||
null
|
null
|
||||||
);
|
);
|
||||||
|
@ -54,6 +56,15 @@ let onLoadCompleted = function() {
|
||||||
|
|
||||||
addMessageListener('umatrix-load-completed', onLoadCompleted);
|
addMessageListener('umatrix-load-completed', onLoadCompleted);
|
||||||
|
|
||||||
|
if ( docShell ) {
|
||||||
|
let Ci = Components.interfaces;
|
||||||
|
let wp = docShell.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIWebProgress);
|
||||||
|
let dw = wp.DOMWindow;
|
||||||
|
if ( dw === dw.top ) {
|
||||||
|
locationChangeListener = new LocationChangeListener(docShell);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|
|
@ -890,6 +890,45 @@ var tabWatcher = (function() {
|
||||||
vAPI.setIcon(tabIdFromTarget(target), getOwnerWindow(target));
|
vAPI.setIcon(tabIdFromTarget(target), getOwnerWindow(target));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var locationChangedMessageName = location.host + ':locationChanged';
|
||||||
|
|
||||||
|
var onLocationChanged = function(e) {
|
||||||
|
var vapi = vAPI;
|
||||||
|
var details = e.data;
|
||||||
|
|
||||||
|
// Ignore notifications related to our popup
|
||||||
|
if ( details.url.lastIndexOf(vapi.getURL('popup.html'), 0) === 0 ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var browser = e.target;
|
||||||
|
var tabId = tabIdFromTarget(browser);
|
||||||
|
|
||||||
|
if ( tabId === vapi.noTabId ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//console.debug("nsIWebProgressListener: onLocationChange: " + details.url + " (" + details.flags + ")");
|
||||||
|
|
||||||
|
// LOCATION_CHANGE_SAME_DOCUMENT = "did not load a new document"
|
||||||
|
if ( details.flags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT ) {
|
||||||
|
vapi.tabs.onUpdated(tabId, {url: details.url}, {
|
||||||
|
frameId: 0,
|
||||||
|
tabId: tabId,
|
||||||
|
url: browser.currentURI.asciiSpec
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/chrisaljoudi/uBlock/issues/105
|
||||||
|
// Allow any kind of pages
|
||||||
|
vapi.tabs.onNavigation({
|
||||||
|
frameId: 0,
|
||||||
|
tabId: tabId,
|
||||||
|
url: details.url,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
var onWindowLoad = function(ev) {
|
var onWindowLoad = function(ev) {
|
||||||
if ( ev ) {
|
if ( ev ) {
|
||||||
this.removeEventListener(ev.type, onWindowLoad);
|
this.removeEventListener(ev.type, onWindowLoad);
|
||||||
|
@ -899,19 +938,16 @@ var tabWatcher = (function() {
|
||||||
if ( wintype !== 'navigator:browser' ) {
|
if ( wintype !== 'navigator:browser' ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var tabBrowser = getTabBrowser(this);
|
var tabBrowser = getTabBrowser(this);
|
||||||
if ( !tabBrowser ) {
|
if ( !tabBrowser ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
var tabContainer = tabBrowser.tabContainer;
|
||||||
var tabContainer;
|
if ( !tabContainer ) {
|
||||||
if ( tabBrowser.tabContainer ) {
|
|
||||||
tabContainer = tabBrowser.tabContainer;
|
|
||||||
vAPI.contextMenu.register(this.document);
|
|
||||||
} else {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vAPI.contextMenu.register(this.document);
|
||||||
tabContainer.addEventListener('TabOpen', onOpen);
|
tabContainer.addEventListener('TabOpen', onOpen);
|
||||||
tabContainer.addEventListener('TabShow', onShow);
|
tabContainer.addEventListener('TabShow', onShow);
|
||||||
tabContainer.addEventListener('TabClose', onClose);
|
tabContainer.addEventListener('TabClose', onClose);
|
||||||
|
@ -991,10 +1027,20 @@ var tabWatcher = (function() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vAPI.messaging.globalMessageManager.addMessageListener(
|
||||||
|
locationChangedMessageName,
|
||||||
|
onLocationChanged
|
||||||
|
);
|
||||||
|
|
||||||
Services.ww.registerNotification(windowWatcher);
|
Services.ww.registerNotification(windowWatcher);
|
||||||
};
|
};
|
||||||
|
|
||||||
var stop = function() {
|
var stop = function() {
|
||||||
|
vAPI.messaging.globalMessageManager.removeMessageListener(
|
||||||
|
locationChangedMessageName,
|
||||||
|
onLocationChanged
|
||||||
|
);
|
||||||
|
|
||||||
Services.ww.unregisterNotification(windowWatcher);
|
Services.ww.unregisterNotification(windowWatcher);
|
||||||
|
|
||||||
for ( var win of vAPI.tabs.getWindows() ) {
|
for ( var win of vAPI.tabs.getWindows() ) {
|
||||||
|
|
Loading…
Reference in a new issue