Index: safari/ext/content.js |
diff --git a/safari/ext/content.js b/safari/ext/content.js |
deleted file mode 100644 |
index 38c0240a7c77ab19b226cafe06b971b015ccb82f..0000000000000000000000000000000000000000 |
--- a/safari/ext/content.js |
+++ /dev/null |
@@ -1,232 +0,0 @@ |
-/* |
- * This file is part of Adblock Plus <https://adblockplus.org/>, |
- * Copyright (C) 2006-2016 Eyeo GmbH |
- * |
- * Adblock Plus is free software: you can redistribute it and/or modify |
- * it under the terms of the GNU General Public License version 3 as |
- * published by the Free Software Foundation. |
- * |
- * Adblock Plus is distributed in the hope that it will be useful, |
- * but WITHOUT ANY WARRANTY; without even the implied warranty of |
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
- * GNU General Public License for more details. |
- * |
- * You should have received a copy of the GNU General Public License |
- * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
- */ |
- |
-(function() |
-{ |
- // the safari object is missing in frames created from javascript: URLs. |
- // So we have to fallback to the safari object from the parent frame. |
- if (!("safari" in window)) |
- window.safari = window.parent.safari; |
- |
- |
- /* Intialization */ |
- |
- var beforeLoadEvent = document.createEvent("Event"); |
- beforeLoadEvent.initEvent("beforeload", false, true); |
- |
- // Decide if we should use the new content blocker API or not. (Note when the |
- // API is used Safari breaks the canLoad function, making it either throw an |
- // exception or return true when used.) |
- var usingContentBlockerAPI = true; |
- try |
- { |
- if (safari.self.tab.canLoad(beforeLoadEvent, |
- {category: "request", |
- payload: {type: "prefs.get", |
- key: "safariContentBlocker"}}) != true) |
- usingContentBlockerAPI = false; |
- } |
- catch (e) |
- { |
- } |
- |
- var isTopLevel; |
- var isPrerendered; |
- var documentId; |
- function notifyFrameLoading() |
- { |
- isTopLevel = window == window.top; |
- isPrerendered = document.visibilityState == "prerender"; |
- documentId = Math.random().toString().substr(2); |
- |
- // Notify the background page that this frame is loading, generating |
- // ourselves a random documentId while we're at it. That way the background |
- // page can communicate with us reliably, despite limitations in Safari's |
- // extension API. |
- safari.self.tab.dispatchMessage("loading", { |
- url: window.location.href, |
- referrer: document.referrer, |
- isTopLevel: isTopLevel, |
- isPrerendered: isPrerendered, |
- documentId: documentId, |
- legacyAPISupported: "canLoad" in safari.self.tab && |
- "onbeforeload" in Element.prototype |
- }); |
- } |
- |
- // We must notify the background page when this page is first loadeding (now) |
- // but also when it is re-shown (if the user uses the back button to return to |
- // this page in the future). |
- notifyFrameLoading(); |
- window.addEventListener("pageshow", function(event) |
- { |
- if (event.persisted) |
- notifyFrameLoading(); |
- }); |
- |
- // Notify the background page when a prerendered page is displayed. That way |
- // the existing page of the tab can be replaced with this new one. |
- if (isTopLevel && isPrerendered) |
- { |
- var onVisibilitychange = function() |
- { |
- safari.self.tab.dispatchMessage("replaced", {documentId: documentId}); |
- document.removeEventListener("visibilitychange", onVisibilitychange); |
- }; |
- document.addEventListener("visibilitychange", onVisibilitychange); |
- } |
- |
- /* Web requests */ |
- |
- if (!usingContentBlockerAPI) |
- { |
- document.addEventListener("beforeload", function(event) |
- { |
- // we don't block non-HTTP requests anyway, so we can bail out |
- // without asking the background page. This is even necessary |
- // because passing large data (like a photo encoded as data: URL) |
- // to the background page, freezes Safari. |
- if (/^(?!https?:)[\w-]+:/.test(event.url)) |
- return; |
- |
- var type = "OTHER"; |
- var eventName = "error"; |
- |
- switch(event.target.localName) |
- { |
- case "frame": |
- case "iframe": |
- type = "SUBDOCUMENT"; |
- eventName = "load"; |
- break; |
- case "img": |
- case "input": |
- type = "IMAGE"; |
- break; |
- case "video": |
- case "audio": |
- case "source": |
- type = "MEDIA"; |
- break; |
- case "object": |
- case "embed": |
- type = "OBJECT"; |
- break; |
- case "script": |
- type = "SCRIPT"; |
- break; |
- case "link": |
- if (/\bstylesheet\b/i.test(event.target.rel)) |
- type = "STYLESHEET"; |
- break; |
- } |
- |
- if (!safari.self.tab.canLoad( |
- event, { |
- category: "webRequest", |
- url: event.url, |
- type: type, |
- documentId: documentId})) |
- { |
- event.preventDefault(); |
- |
- // Safari doesn't dispatch the expected events for elements that have |
- // been prevented from loading by having their "beforeload" event |
- // cancelled. That is a "load" event for blocked frames, and an "error" |
- // event for other blocked elements. We need to dispatch those events |
- // manually here to avoid breaking element collapsing and pages that |
- // rely on those events. |
- setTimeout(function() |
- { |
- var evt = document.createEvent("Event"); |
- evt.initEvent(eventName, false, false); |
- event.target.dispatchEvent(evt); |
- }); |
- } |
- }, true); |
- } |
- |
- |
- /* Context menus */ |
- |
- document.addEventListener("contextmenu", function(event) |
- { |
- var element = event.srcElement; |
- safari.self.tab.setContextMenuEventUserInfo(event, { |
- documentId: documentId, |
- tagName: element.localName |
- }); |
- }); |
- |
- |
- /* Background page */ |
- |
- ext.backgroundPage = { |
- sendMessage: function(message, responseCallback) |
- { |
- messageProxy.sendMessage(message, responseCallback, |
- {documentId: documentId}); |
- }, |
- sendMessageSync: function(message) |
- { |
- return safari.self.tab.canLoad( |
- beforeLoadEvent, |
- { |
- category: "request", |
- documentId: documentId, |
- payload: message |
- } |
- ); |
- } |
- }; |
- |
- |
- /* Message processing */ |
- |
- var messageProxy = new ext._MessageProxy(safari.self.tab); |
- |
- safari.self.addEventListener("message", function(event) |
- { |
- if (event.name == "requestDocumentId" && isTopLevel) |
- { |
- safari.self.tab.dispatchMessage("documentId", { |
- pageId: event.message.pageId, |
- documentId: documentId |
- }); |
- } |
- else if (event.message.targetDocuments.indexOf(documentId) != -1) |
- { |
- switch (event.name) |
- { |
- case "request": |
- messageProxy.handleRequest(event.message, {}); |
- break; |
- case "response": |
- messageProxy.handleResponse(event.message); |
- break; |
- } |
- } |
- }); |
- |
- |
- /* Detecting extension reload/disable/uninstall (not supported on Safari) */ |
- |
- ext.onExtensionUnloaded = { |
- addListener: function() {}, |
- removeListener: function() {} |
- }; |
-})(); |