Safari: (semi)support vAPI.tabs.onUpdated()

This commit is contained in:
Deathamns 2014-12-01 16:30:17 +01:00
parent c0e11d8182
commit f3bb101310
2 changed files with 52 additions and 23 deletions

View File

@ -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);

View File

@ -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));
}; };