mirror of https://github.com/gorhill/uBlock.git
Safari: (semi)support vAPI.tabs.onUpdated()
This commit is contained in:
parent
c0e11d8182
commit
f3bb101310
|
@ -187,12 +187,9 @@ vAPI.tabs.registerListeners = function() {
|
||||||
safari.application.addEventListener('navigate', this.onNavigation, true);
|
safari.application.addEventListener('navigate', this.onNavigation, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ??
|
|
||||||
/* if (typeof this.onUpdated === 'function') { } */
|
|
||||||
|
|
||||||
// onClosed handled in the main tab-close event
|
// onClosed handled in the main tab-close event
|
||||||
// onPopup is handled in window.open on web-pages?
|
// onUpdated handled via monitoring the history.pushState on web-pages
|
||||||
/* if (typeof onPopup === 'function') { } */
|
// onPopup is handled in window.open on web-pages
|
||||||
};
|
};
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
@ -603,8 +600,17 @@ vAPI.net.registerListeners = function() {
|
||||||
return e.message;
|
return e.message;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// when the URL changes, but the document doesn't
|
||||||
|
if (e.message.type === 'popstate') {
|
||||||
|
vAPI.tabs.onUpdated(
|
||||||
|
vAPI.tabs.getTabId(e.target),
|
||||||
|
{url: e.message.url},
|
||||||
|
{url: e.message.url}
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
// blocking unwanted pop-ups
|
// blocking unwanted pop-ups
|
||||||
if (e.message.type === 'popup') {
|
else if (e.message.type === 'popup') {
|
||||||
if (typeof vAPI.tabs.onPopup === 'function') {
|
if (typeof vAPI.tabs.onPopup === 'function') {
|
||||||
e.message.type = 'main_frame';
|
e.message.type = 'main_frame';
|
||||||
e.message.sourceTabId = vAPI.tabs.getTabId(e.target);
|
e.message.sourceTabId = vAPI.tabs.getTabId(e.target);
|
||||||
|
|
|
@ -330,28 +330,51 @@ var firstMutation = function() {
|
||||||
// the extension context is unable to reach the page context,
|
// the extension context is unable to reach the page context,
|
||||||
// also this only works when Content Security Policy allows inline scripts
|
// also this only works when Content Security Policy allows inline scripts
|
||||||
var tmpJS = document.createElement('script');
|
var tmpJS = document.createElement('script');
|
||||||
var tmpScript = ["(function() {",
|
var tmpScript = ['(function() {',
|
||||||
"var block = function(u, t) {",
|
'var block = function(u, t) {',
|
||||||
"var e = document.createEvent('CustomEvent'),",
|
'var e = document.createEvent("CustomEvent"),',
|
||||||
"d = {url: u, type: t};",
|
'd = {url: u, type: t};',
|
||||||
"e.initCustomEvent('" + randEventName + "', !1, !1, d);",
|
'e.initCustomEvent("' + randEventName + '", !1, !1, d);',
|
||||||
"dispatchEvent(e);",
|
'dispatchEvent(e);',
|
||||||
"return d.url === !1;",
|
'return d.url === !1;',
|
||||||
"}, wo = open, xo = XMLHttpRequest.prototype.open;",
|
'}, wo = open, xo = XMLHttpRequest.prototype.open;',
|
||||||
"open = function(u) {",
|
'open = function(u) {',
|
||||||
"return block(u, 'popup') ? null : wo.apply(this, [].slice.call(arguments));",
|
'return block(u, "popup") ? null : wo.apply(this, arguments);',
|
||||||
"};",
|
'};',
|
||||||
"XMLHttpRequest.prototype.open = function(m, u, s) {",
|
'XMLHttpRequest.prototype.open = function(m, u, s) {',
|
||||||
"return xo.apply(this, block(u, 'xmlhttprequest') ? ['HEAD', u, s] : [].slice.call(arguments));",
|
'return xo.apply(this, block(u, "xmlhttprequest") ? ["HEAD", u, s] : arguments);',
|
||||||
"};"
|
'};'
|
||||||
];
|
];
|
||||||
|
|
||||||
if (vAPI.sitePatch
|
if (frameId === 0) {
|
||||||
&& !safari.self.tab.canLoad(beforeLoadEvent, {isWhiteListed: location.href})) {
|
tmpScript.push(
|
||||||
|
'var pS = history.pushState, rS = history.replaceState,',
|
||||||
|
'onpopstate = function(e) {',
|
||||||
|
'if (!e || e.state !== null) block(location.href, "popstate");',
|
||||||
|
'};',
|
||||||
|
'window.addEventListener("popstate", onpopstate, true);',
|
||||||
|
'history.pushState = function() {',
|
||||||
|
'var r = pS.apply(this, arguments);',
|
||||||
|
'onpopstate();',
|
||||||
|
'return r;',
|
||||||
|
'};',
|
||||||
|
'history.replaceState = function() {',
|
||||||
|
'var r = pR.apply(this, arguments);',
|
||||||
|
'onpopstate();',
|
||||||
|
'return r;',
|
||||||
|
'};'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
var block = safari.self.tab.canLoad(beforeLoadEvent, {
|
||||||
|
isWhiteListed: location.href
|
||||||
|
});
|
||||||
|
|
||||||
|
if (vAPI.sitePatch && !block) {
|
||||||
tmpScript.push('(' + vAPI.sitePatch + ')();');
|
tmpScript.push('(' + vAPI.sitePatch + ')();');
|
||||||
}
|
}
|
||||||
|
|
||||||
tmpScript.push("})();");
|
tmpScript.push('})();');
|
||||||
tmpJS.textContent = tmpScript.join('');
|
tmpJS.textContent = tmpScript.join('');
|
||||||
document.documentElement.removeChild(document.documentElement.appendChild(tmpJS));
|
document.documentElement.removeChild(document.documentElement.appendChild(tmpJS));
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue