mirror of https://github.com/gorhill/uBlock.git
Use different page navigation detection for Safari
The beforeNavigate event wasn't reliable (sometimes didn't fire, sometimes fired unnecessary when opening a link with the middle click - which had a workaround previously, but that's also removed by this commit). When the event didn't fire, the bindTabToPageStats method didn't run, and the requests related to the tab weren't blocked.
This commit is contained in:
parent
d114bf21e7
commit
ba0b11aabe
|
@ -390,7 +390,8 @@ if (self.chrome) {
|
||||||
|
|
||||||
if (typeof onNavigation === 'function') {
|
if (typeof onNavigation === 'function') {
|
||||||
this.onNavigation = function(e) {
|
this.onNavigation = function(e) {
|
||||||
// e.url is not present for local files or data URIs
|
// e.url is not present for local files or data URIs,
|
||||||
|
// or probably for those URLs which we don't have access to
|
||||||
if (!e.target || !e.target.url) {
|
if (!e.target || !e.target.url) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -740,11 +741,6 @@ if (self.chrome) {
|
||||||
return e.message;
|
return e.message;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e.message.middleClickURL) {
|
|
||||||
vAPI.lastMiddleClick = e.message;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// blocking unwanted pop-ups
|
// blocking unwanted pop-ups
|
||||||
if (e.message.type === 'popup') {
|
if (e.message.type === 'popup') {
|
||||||
if (typeof vAPI.tabs.onPopup === 'function') {
|
if (typeof vAPI.tabs.onPopup === 'function') {
|
||||||
|
@ -790,39 +786,8 @@ if (self.chrome) {
|
||||||
|
|
||||||
return e.message;
|
return e.message;
|
||||||
};
|
};
|
||||||
|
|
||||||
safari.application.addEventListener('message', this.onBeforeRequest.callback, true);
|
safari.application.addEventListener('message', this.onBeforeRequest.callback, true);
|
||||||
|
|
||||||
// 'main_frame' simulation, since this isn't available in beforeload
|
|
||||||
safari.application.addEventListener('beforeNavigate', function(e) {
|
|
||||||
// e.url is not present for local files or data URIs
|
|
||||||
if (e.url) {
|
|
||||||
// beforeNavigate fires twice when opening a link with
|
|
||||||
// middle click. Once with the same tab, second time with
|
|
||||||
// the new tab. This hack tries to ignore the first one.
|
|
||||||
if (vAPI.lastMiddleClick) {
|
|
||||||
if (e.target === safari.application.activeBrowserWindow.activeTab
|
|
||||||
&& e.timeStamp - vAPI.lastMiddleClick.timeStamp <= 500
|
|
||||||
&& e.url === vAPI.lastMiddleClick.middleClickURL) {
|
|
||||||
vAPI.lastMiddleClick = null;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
vAPI.lastMiddleClick = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
vAPI.net.onBeforeRequest.callback({
|
|
||||||
name: 'canLoad',
|
|
||||||
target: e.target,
|
|
||||||
message: {
|
|
||||||
url: e.url,
|
|
||||||
type: 'main_frame',
|
|
||||||
frameId: 0,
|
|
||||||
parentFrameId: -1,
|
|
||||||
timeStamp: e.timeStamp
|
|
||||||
}
|
|
||||||
}) || e.preventDefault();
|
|
||||||
}
|
|
||||||
}, true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -256,7 +256,13 @@ if (self.chrome) {
|
||||||
var response = safari.self.tab.canLoad(e, details);
|
var response = safari.self.tab.canLoad(e, details);
|
||||||
|
|
||||||
if (!response) {
|
if (!response) {
|
||||||
|
if (details.type === 'main_frame') {
|
||||||
|
window.stop();
|
||||||
|
throw Error;
|
||||||
|
}
|
||||||
|
else {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// local mirroring, response is a data: URL here
|
// local mirroring, response is a data: URL here
|
||||||
|
@ -350,20 +356,11 @@ if (self.chrome) {
|
||||||
|
|
||||||
self.addEventListener('contextmenu', onContextMenu, true);
|
self.addEventListener('contextmenu', onContextMenu, true);
|
||||||
|
|
||||||
self.addEventListener('mouseup', function(e) {
|
// 'main_frame' simulation
|
||||||
if (e.button !== 1) {
|
onBeforeLoad(beforeLoadEvent, {
|
||||||
return;
|
url: window.location.href,
|
||||||
}
|
type: 'main_frame'
|
||||||
|
|
||||||
e = document.evaluate('ancestor-or-self::a[@href]', e.target, null, 9, null).singleNodeValue;
|
|
||||||
|
|
||||||
if (e && /^https?:$/.test(e.protocol)) {
|
|
||||||
safari.self.tab.canLoad(beforeLoadEvent, {
|
|
||||||
middleClickURL: e.href,
|
|
||||||
timeStamp: Date.now()
|
|
||||||
});
|
});
|
||||||
}
|
|
||||||
}, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|
Loading…
Reference in New Issue