diff options
Diffstat (limited to 'data/extensions/spyblock@gnu.org/lib/appSupport.js')
-rw-r--r-- | data/extensions/spyblock@gnu.org/lib/appSupport.js | 851 |
1 files changed, 0 insertions, 851 deletions
diff --git a/data/extensions/spyblock@gnu.org/lib/appSupport.js b/data/extensions/spyblock@gnu.org/lib/appSupport.js deleted file mode 100644 index ba8fdd1..0000000 --- a/data/extensions/spyblock@gnu.org/lib/appSupport.js +++ /dev/null @@ -1,851 +0,0 @@ -/* - * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2017 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/>. - */ - -/** - * @fileOverview Various application-specific functions. - */ - -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -Cu.import("resource://gre/modules/Services.jsm"); -Cu.import("resource://gre/modules/AddonManager.jsm"); - -/** - * Checks whether an application window is known and should get Adblock Plus - * user interface elements. - * @result Boolean - */ -exports.isKnownWindow = (/**Window*/ window) => false; - -/** - * HACK: In some applications the window finishes initialization during load - * event processing which makes an additional delay necessary. This flag - * indicates that. - * @type Boolean - */ -exports.delayInitialization = false; - -/** - * Retrieves the browser element for an application window. - * @type function(window) - */ -exports.getBrowser = null; - -/** - * Adds a new browser tab in the given application window. - * @type function(window, url, event) - */ -exports.addTab = null; - -/** - * Retrieves the current browser location for an application window. - */ -exports.getCurrentLocation = function getCurrentLocation(/**Window*/ window) /**nsIURI|String*/ -{ - let browser = (exports.getBrowser ? exports.getBrowser(window) : null); - return (browser ? browser.currentURI : null); -} - - -/** - * The ID (or a list of possible IDs) of the content area context menu. - * @type String|String[] - */ -exports.contentContextMenu = null; - -/** - * Determines the default placement of the toolbar icon via object properties - * parent, before and after. - * @type Object - */ -exports.defaultToolbarPosition = null; - -/** - * The properties parent, before, after determine the placement of the status - * bar icon. - * @type Object - */ -exports.statusbarPosition = null; - -/** - * The properties parent, before, after determine the placement of the Tools - * submenu. - * @type Object - */ -exports.toolsMenu = null; - -/** - * Maps windows to their bottom bar info. - */ -let bottomBars = new WeakMap(); - -/** - * Adds a bottom bar to the application window. - * @type function(window, element) - */ -exports.addBottomBar = null; - -function _addBottomBar(window, parent, element) -{ - if (bottomBars.has(window) || !parent) - return null; - - let bar = {elements: []}; - for (let child = element.firstElementChild; child; child = child.nextElementSibling) - { - let clone = child.cloneNode(true); - parent.appendChild(clone); - bar.elements.push(clone); - } - - bottomBars.set(window, bar); - return bar; -}; - -/** - * Removes the bottom bar from the application window. - * @type function(window) - */ -exports.removeBottomBar = null; - -function _removeBottomBar(window) -{ - if (!bottomBars.has(window)) - return null; - - let bar = bottomBars.get(window); - for (let i = 0; i < bar.elements.length; i++) - if (bar.elements[i].parentNode) - bar.elements[i].parentNode.removeChild(bar.elements[i]); - - bottomBars.delete(window); - return bar; -}; - -/** - * Maps windows to a list of progress listeners. - */ -let progressListeners = new WeakMap(); - -/** - * Makes sure that a function is called whenever the displayed browser location changes. - */ -exports.addBrowserLocationListener = function addBrowserLocationListener(/**Window*/ window, /**Function*/ callback, /**Boolean*/ ignoreSameDoc) -{ - let browser = (exports.getBrowser ? exports.getBrowser(window) : null); - if (browser) - { - let dummy = function() {}; - let progressListener = - { - callback: callback, - onLocationChange: function(progress, request, uri, flags) - { - if (!ignoreSameDoc || !flags || !(flags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT)) - this.callback(); - }, - onProgressChange: dummy, - onSecurityChange: dummy, - onStateChange: dummy, - onStatusChange: dummy, - QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference]) - }; - browser.addProgressListener(progressListener); - - if (progressListeners.has(window)) - progressListeners.get(window).push(progressListener); - else - progressListeners.set(window, [progressListener]); - } -}; - -/** - * Removes a location listener registered for a window. - */ -exports.removeBrowserLocationListener = function removeBrowserLocationListener(/**Window*/ window, /**Function*/ callback) -{ - if (!progressListeners.has(window)) - return; - - let browser = (exports.getBrowser ? exports.getBrowser(window) : null); - let listeners = progressListeners.get(window); - for (let i = 0; i < listeners.length; i++) - { - if (listeners[i].callback == callback) - { - if (browser) - browser.removeProgressListener(listeners[i]); - listeners.splice(i--, 1); - } - } -}; - -/** - * Removes all location listeners registered for a window, to be called on - * cleanup. - */ -exports.removeBrowserLocationListeners = function removeBrowserLocationListeners(/**Window*/ window) -{ - if (!progressListeners.has(window)) - return; - - let browser = (exports.getBrowser ? exports.getBrowser(window) : null); - if (browser) - { - let listeners = progressListeners.get(window); - for (let i = 0; i < listeners.length; i++) - browser.removeProgressListener(listeners[i]); - } - progressListeners.delete(window); -}; - -let {application} = require("info"); -switch (application) -{ - case "firefox": - { - exports.isKnownWindow = function ff_isKnownWindow(window) - { - return (window.document.documentElement.getAttribute("windowtype") == "navigator:browser"); - }; - - exports.getBrowser = (window) => window.gBrowser; - - exports.addTab = function ff_addTab(window, url, event) - { - if (event) - window.openNewTabWith(url, null, null, event, false); - else - window.gBrowser.loadOneTab(url, {inBackground: false}); - }; - - exports.contentContextMenu = "contentAreaContextMenu"; - - exports.defaultToolbarPosition = { - parent: "nav-bar" - }; - - exports.toolsMenu = { - parent: "menu_ToolsPopup" - }; - - exports.addBottomBar = function fx_addBottomBar(window, element) - { - let bar = _addBottomBar(window, window.document.getElementById("appcontent"), element); - if (bar) - { - let display = window.document.getElementById("statusbar-display"); - bar.changedFixed = display && !display.hasAttribute("fixed"); - if (bar.changedFixed) - display.setAttribute("fixed", "true"); - } - }; - - exports.removeBottomBar = function fx_removeBottomBar(window) - { - let bar = _removeBottomBar(window); - if (bar && bar.changedFixed) - window.document.getElementById("statusbar-display").removeAttribute("fixed"); - }; - - break; - } - - case "seamonkey": - { - exports.isKnownWindow = function sm_isKnownWindow(window) - { - let type = window.document.documentElement.getAttribute("windowtype"); - return (type == "navigator:browser" || type == "mail:3pane" || type == "mail:messageWindow"); - }; - - exports.addTab = function sm_addTab(window, url, event) - { - if (event || !("gBrowser" in window)) - window.openNewTabWith(url, null, null, event, false); - else - window.gBrowser.loadOneTab(url, {inBackground: false}); - }; - - exports.getBrowser = function sm_getBrowser(window) - { - if ("gBrowser" in window) - return window.gBrowser; - else if ("getMessageBrowser" in window) - return window.getMessageBrowser(); - else - return null; - }; - - exports.getCurrentLocation = function sm_getCurrentLocation(window) - { - if ("currentHeaderData" in window && "content-base" in window.currentHeaderData) - { - // This is a blog entry - return window.currentHeaderData["content-base"].headerValue; - } - else if ("currentHeaderData" in window && "from" in window.currentHeaderData) - { - // This is a mail/newsgroup entry - try - { - let headerParser = Cc["@mozilla.org/messenger/headerparser;1"].getService(Ci.nsIMsgHeaderParser); - let emailAddress = headerParser.extractHeaderAddressMailboxes(window.currentHeaderData.from.headerValue); - return "mailto:" + emailAddress.replace(/^[\s"]+/, "").replace(/[\s"]+$/, "").replace(/\s/g, "%20"); - } - catch(e) - { - return null; - } - } - else - { - let browser = exports.getBrowser(window); - return (browser ? browser.currentURI : null); - } - }; - - // for Seamonkey we have to ignore same document flag because of - // bug #1035171 (https://bugzilla.mozilla.org/show_bug.cgi?id=1035171) - let origAddBrowserLocationListener = exports.addBrowserLocationListener; - exports.addBrowserLocationListener = function sm_addBrowserLocationListener(window, callback, ignoreSameDoc) - { - origAddBrowserLocationListener(window, callback, false); - }; - - exports.contentContextMenu = ["contentAreaContextMenu", "mailContext"]; - - exports.defaultToolbarPosition = { - parent: ["PersonalToolbar", "msgToolbar"], - before: ["bookmarks-button", "button-junk"] - }; - - exports.statusbarPosition = { - parent: "status-bar" - }; - - exports.toolsMenu = { - parent: "taskPopup", - after: "downloadmgr" - }; - - exports.addBottomBar = function sm_addBottomBar(window, element) - { - _addBottomBar(window, window.document.getElementById("appcontent") || window.document.getElementById("messagepanebox"), element); - }; - - exports.removeBottomBar = _removeBottomBar; - - break; - } - - case "thunderbird": - { - exports.isKnownWindow = function tb_isKnownWindow(window) - { - let type = window.document.documentElement.getAttribute("windowtype"); - return (type == "mail:3pane" || type == "mail:messageWindow"); - }; - - exports.delayInitialization = true; - - exports.getBrowser = (window) => window.getBrowser(); - - exports.addTab = function tb_addTab(window, url, event) - { - let tabmail = window.document.getElementById("tabmail"); - if (!tabmail) - { - let wnd = Services.wm.getMostRecentWindow("mail:3pane"); - if (window) - tabmail = wnd.document.getElementById("tabmail"); - } - - if (tabmail) - tabmail.openTab("contentTab", {contentPage: url}); - else - { - window.openDialog("chrome://messenger/content/", "_blank", - "chrome,dialog=no,all", null, - { - tabType: "contentTab", - tabParams: {contentPage: url} - }); - } - }; - - exports.contentContextMenu = ["mailContext", "pageContextMenu"]; - - exports.defaultToolbarPosition = { - parent: "header-view-toolbar", - before: "hdrReplyButton", - addClass: "msgHeaderView-button" - }; - - exports.statusbarPosition = { - parent: "status-bar" - }; - - exports.toolsMenu = { - parent: "taskPopup", - after: "javaScriptConsole" - }; - - exports.getCurrentLocation = function getCurrentLocation(window) - { - let browser = exports.getBrowser(window); - if (!browser) - return null; - - if (browser.id == "messagepane" && "currentHeaderData" in window && "content-base" in window.currentHeaderData) - { - // This is a blog entry - return window.currentHeaderData["content-base"].headerValue; - } - else if (browser.id == "messagepane" && "currentHeaderData" in window && "from" in window.currentHeaderData) - { - // This is a mail/newsgroup entry - try - { - let headerParser = Cc["@mozilla.org/messenger/headerparser;1"].getService(Ci.nsIMsgHeaderParser); - let emailAddress = headerParser.extractHeaderAddressMailboxes(window.currentHeaderData.from.headerValue); - return "mailto:" + emailAddress.replace(/^[\s"]+/, "").replace(/[\s"]+$/, "").replace(/\s/g, "%20"); - } - catch(e) - { - return null; - } - } - else - return browser.currentURI; - } - - exports.addBottomBar = function tb_addBottomBar(window, element) - { - let browser = exports.getBrowser(window); - if (!browser) - return; - - let parent = window.document.getElementById("messagepanebox"); - if (!parent || !(parent.compareDocumentPosition(browser) & Ci.nsIDOMNode.DOCUMENT_POSITION_CONTAINED_BY)) - parent = browser.parentNode; - - _addBottomBar(window, parent, element); - }; - - exports.removeBottomBar = _removeBottomBar; - - let BrowserChangeListener = function(window, callback) - { - this.window = window; - this.callback = callback; - this.onSelect = this.onSelect.bind(this); - this.attach(); - }; - BrowserChangeListener.prototype = { - window: null, - callback: null, - currentBrowser: null, - - setBrowser: function(browser) - { - if (browser != this.currentBrowser) - { - let oldBrowser = this.currentBrowser; - this.currentBrowser = browser; - this.callback(oldBrowser, browser); - } - }, - - onSelect: function() - { - this.setBrowser(exports.getBrowser(this.window)); - }, - - attach: function() - { - this.onSelect(); - - let tabmail = this.window.document.getElementById("tabmail"); - if (tabmail) - tabmail.tabContainer.addEventListener("select", this.onSelect, false); - }, - detach: function() - { - let tabmail = this.window.document.getElementById("tabmail"); - if (tabmail) - tabmail.tabContainer.removeEventListener("select", this.onSelect, false); - - this.setBrowser(null); - } - }; - - exports.addBrowserLocationListener = function(/**Window*/ window, /**Function*/ callback, /**Boolean*/ ignoreSameDoc) - { - if (progressListeners.has(window)) - { - progressListeners.get(window).locationCallbacks.push(callback); - return; - } - - let callbacks = [callback]; - let dummy = function() {}; - let progressListener = - { - onLocationChange: function(progress, request, uri, flags) - { - if (!ignoreSameDoc || !flags || !(flags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT)) - for (let i = 0; i < callbacks.length; i++) - callbacks[i](); - }, - onProgressChange: dummy, - onSecurityChange: dummy, - onStateChange: dummy, - onStatusChange: dummy, - QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference]) - }; - let messageListener = - { - onStartHeaders: dummy, - onEndHeaders: function() - { - let browser = exports.getBrowser(window); - if (browser.id == "messagepane") - for (let i = 0; i < callbacks.length; i++) - callbacks[i](); - }, - onEndAttachments: dummy, - onBeforeShowHeaderPane: dummy - }; - - let listener = new BrowserChangeListener(window, function(oldBrowser, newBrowser) - { - if (oldBrowser) - oldBrowser.removeProgressListener(progressListener); - if (newBrowser) - newBrowser.addProgressListener(progressListener); - progressListener.onLocationChange(); - }); - listener.locationCallbacks = callbacks; - - if ("gMessageListeners" in window) - window.gMessageListeners.push(messageListener); - listener.messageListener = messageListener; - - progressListeners.set(window, listener); - }; - - exports.removeBrowserLocationListener = function(/**Window*/ window, /**Function*/ callback) - { - if (!progressListeners.has(window)) - return; - - let callbacks = progressListeners.get(window).locationCallbacks; - for (let i = 0; i < callbacks.length; i++) - if (callbacks[i] == callback) - callbacks.splice(i--, 1); - }; - - exports.removeBrowserLocationListeners = function(/**Window*/ window) - { - if (!progressListeners.has(window)) - return; - - let listener = progressListeners.get(window); - - let messageListener = listener.messageListener; - let index = ("gMessageListeners" in window ? window.gMessageListeners.indexOf(messageListener) : -1); - if (index >= 0) - window.gMessageListeners.splice(index, 1); - - listener.detach(); - progressListeners.delete(window); - }; - - // Make sure to close/reopen list of blockable items when the user changes tabs - let {WindowObserver} = require("windowObserver"); - new WindowObserver({ - listeners: new WeakMap(), - applyToWindow: function(window) - { - if (!exports.isKnownWindow(window) || this.listeners.has(window)) - return; - - let {Utils} = require("utils"); - Utils.runAsync(function() - { - let listener = new BrowserChangeListener(window, function(oldBrowser, newBrowser) - { - if (bottomBars.has(window)) - { - let {UI} = require("ui") - UI.toggleBottombar(window); - UI.toggleBottombar(window); - } - }); - this.listeners.set(window, listener); - }.bind(this)); - }, - removeFromWindow: function(window) - { - if (!this.listeners.has(window)) - return; - - let listener = this.listeners.get(window); - listener.detach(); - this.listeners.delete(window); - } - }); - - break; - } - - case "fennec2": - case "adblockbrowser": - { - exports.isKnownWindow = (window) => window.document.documentElement.id == "main-window"; - - exports.getBrowser = (window) => window.BrowserApp.selectedBrowser; - - exports.addTab = (window, url, event) => window.BrowserApp.addTab(url, {selected: true}); - - let BrowserChangeListener = function(window, callback) - { - this.window = window; - this.callback = callback; - this.onSelect = this.onSelect.bind(this); - this.attach = this.attach.bind(this); - if (window.BrowserApp.deck) - this.attach(); - else - window.addEventListener("UIReady", this.attach, false); - }; - BrowserChangeListener.prototype = { - window: null, - callback: null, - currentBrowser: null, - - setBrowser: function(browser) - { - if (browser != this.currentBrowser) - { - let oldBrowser = this.currentBrowser; - this.currentBrowser = browser; - this.callback(oldBrowser, browser); - } - }, - - onSelect: function() - { - let {Utils} = require("utils"); - Utils.runAsync(function() - { - this.setBrowser(exports.getBrowser(this.window)); - }.bind(this)); - }, - - attach: function() - { - this.window.removeEventListener("UIReady", this.attach, false); - this.onSelect(); - this.window.BrowserApp.deck.addEventListener("TabSelect", this.onSelect, false); - }, - detach: function() - { - this.window.BrowserApp.deck.removeEventListener("TabSelect", this.onSelect, false); - - this.setBrowser(null); - } - }; - - exports.addBrowserLocationListener = function ffn_addBrowserLocationListener(/**Window*/ window, /**Function*/ callback, /**Boolean*/ ignoreSameDoc) - { - if (progressListeners.has(window)) - { - progressListeners.get(window).locationCallbacks.push(callback); - return; - } - - let callbacks = [callback]; - let dummy = function() {}; - let progressListener = - { - onLocationChange: function(progress, request, uri, flags) - { - if (!ignoreSameDoc || !flags || !(flags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT)) - for (let i = 0; i < callbacks.length; i++) - callbacks[i](); - }, - onProgressChange: dummy, - onSecurityChange: dummy, - onStateChange: dummy, - onStatusChange: dummy, - QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference]) - }; - - let listener = new BrowserChangeListener(window, function(oldBrowser, newBrowser) - { - if (oldBrowser && typeof oldBrowser.removeProgressListener == "function") - oldBrowser.removeProgressListener(progressListener); - if (newBrowser && typeof newBrowser.removeProgressListener == "function") - newBrowser.addProgressListener(progressListener); - progressListener.onLocationChange(); - }); - listener.locationCallbacks = callbacks; - - progressListeners.set(window, listener); - }; - - exports.removeBrowserLocationListener = function ffn_removeBrowserLocationListener(/**Window*/ window, /**Function*/ callback) - { - if (!progressListeners.has(window)) - return; - - let callbacks = progressListeners.get(window).locationCallbacks; - for (let i = 0; i < callbacks.length; i++) - if (callbacks[i] == callback) - callbacks.splice(i--, 1); - }; - - exports.removeBrowserLocationListeners = function ffn_removeBrowserLocationListeners(/**Window*/ window) - { - if (!progressListeners.has(window)) - return; - - let listener = progressListeners.get(window); - listener.detach(); - progressListeners.delete(window); - }; - - let {Filter} = require("filterClasses"); - let {Prefs} = require("prefs"); - let {Policy} = require("contentPolicy"); - let {UI} = require("ui"); - let {Utils} = require("utils"); - - let toggleWhitelist = function(window) - { - if (!Prefs.enabled) - { - Prefs.enabled = true; - return; - } - - let location = exports.getCurrentLocation(window); - let host = null; - if (location instanceof Ci.nsIURL && Policy.isBlockableScheme(location)) - { - try - { - host = location.host.replace(/^www\./, ""); - } catch (e) {} - } - - if (!host) - return; - - if (Policy.isWhitelisted(location.spec)) - UI.removeWhitelist(window); - else - UI.toggleFilter(Filter.fromText("@@||" + host + "^$document")); - }; - - let menuItem = null; - onShutdown.add(function() - { - let window = null; - for (window of UI.applicationWindows) - break; - - if (window && menuItem) - window.NativeWindow.menu.remove(menuItem); - }); - - UI.updateIconState = function fmn_updateIconState(window, icon) - { - if (menuItem !== null) - { - window.NativeWindow.menu.remove(menuItem); - menuItem = null; - } - - let action; - let host = null; - if (Prefs.enabled) - { - let location = exports.getCurrentLocation(window); - if (location instanceof Ci.nsIURL && Policy.isBlockableScheme(location)) - { - try - { - host = location.host.replace(/^www\./, ""); - } catch (e) {} - } - if (!host) - return; - - if (host && Policy.isWhitelisted(location.spec)) - action = "enable_site"; - else if (host) - action = "disable_site"; - } - else - action = "enable"; - - let actionText = Utils.getString("mobile_menu_" + action); - if (host) - actionText = actionText.replace(/\?1\?/g, host); - - let iconUrl = require("info").addonRoot + "icon64.png"; - menuItem = window.NativeWindow.menu.add(actionText, iconUrl, toggleWhitelist.bind(null, window)); - }; - - UI.openSubscriptionDialog = function(window, url, title, mainURL, mainTitle) - { - let dialogTitle = this.overlay.attributes.subscriptionDialogTitle; - let dialogMessage = this.overlay.attributes.subscriptionDialogMessage.replace(/\?1\?/, title).replace(/\?2\?/, url); - if (Utils.confirm(window, dialogMessage, dialogTitle)) - this.setSubscription(url, title); - }; - - UI.openFiltersDialog = function() - { - let window = UI.currentWindow; - if (!window) - return - - let browser = exports.addTab(window, "about:addons").browser; - browser.addEventListener("load", function openAddonPrefs(event) - { - browser.removeEventListener("load", openAddonPrefs, true); - Utils.runAsync(function() - { - // The page won't be ready until the add-on manager data is loaded so we call this method - // to know when the data will be ready. - AddonManager.getAddonsByTypes(["extension", "theme", "locale"], function() - { - let event = new Event("Event"); - event.initEvent("popstate", true, false); - event.state = {id: require("info").addonID}; - browser._contentWindow.dispatchEvent(event); - }); - }); - }, true); - }; - - break; - } -} |