diff options
author | Ruben Rodriguez <ruben@gnu.org> | 2017-09-01 16:35:50 -0400 |
---|---|---|
committer | Ruben Rodriguez <ruben@gnu.org> | 2017-09-01 16:35:50 -0400 |
commit | e8730f68798f173bd4d1c2f9b7ce02985e3fd771 (patch) | |
tree | 711132ed84ef8ae9e0621de5436a6818a5fa1e12 /data/extensions/spyblock@gnu.org/chrome/content/ui/ext | |
parent | edde38bbb0e0afb9b8a78c002996c758fb6023b6 (diff) |
SpyBlock updated to 2.9.1
Diffstat (limited to 'data/extensions/spyblock@gnu.org/chrome/content/ui/ext')
-rw-r--r-- | data/extensions/spyblock@gnu.org/chrome/content/ui/ext/common.js | 187 | ||||
-rw-r--r-- | data/extensions/spyblock@gnu.org/chrome/content/ui/ext/content.js | 116 |
2 files changed, 124 insertions, 179 deletions
diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/ext/common.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/ext/common.js index 129f232..296c00f 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/ext/common.js +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/ext/common.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * 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 @@ -17,140 +17,105 @@ (function(global) { - const Ci = Components.interfaces; + const Cu = Components.utils; + + let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); if (!global.ext) global.ext = {}; - var holder = { - get Page() - { - delete this.Page; - this.Page = (typeof require == "function" ? - require("ext_background").Page : - function() {}); - return this.Page; - } - }; + var wrapperSymbol = Symbol("ext-wrapper"); - var getSender = global.ext._getSender = function(origin) + function wrapFrames(frames) { - if (origin instanceof Ci.nsIDOMXULElement) - return origin.messageManager; - else if (origin instanceof Ci.nsIMessageSender) - return origin; - else + if (!frames.length) return null; - }; - var MessageProxy = global.ext._MessageProxy = function(messageManager, messageTarget) - { - this._messageManager = messageManager; - this._messageTarget = messageTarget; - this._callbacks = new Map(); - this._responseCallbackCounter = 0; + // We have frames as an array, non-Firefox code expects url and parent + // properties however. + Object.defineProperty(frames, "url", { + enumerable: true, + get: () => new URL(frames[0].location) + }); - this._handleRequest = this._handleRequest.bind(this); - this._handleResponse = this._handleResponse.bind(this); - this._messageManager.addMessageListener("AdblockPlus:Message", this._handleRequest); - this._messageManager.addMessageListener("AdblockPlus:Response", this._handleResponse); - }; - MessageProxy.prototype = { - _disconnect: function() - { - this._messageManager.removeMessageListener("AdblockPlus:Message", this._handleRequest); - this._messageManager.removeMessageListener("AdblockPlus:Response", this._handleResponse); - }, + Object.defineProperty(frames, "parent", { + enumerable: true, + get: () => wrapFrames(frames.slice(1)) + }); - _sendResponse: function(sender, callbackId, message) - { - var response = { - callbackId: callbackId - }; - if (typeof response != "undefined") - response.payload = message; - sender.sendAsyncMessage("AdblockPlus:Response", response); - }, + return frames; + } - _handleRequest: function(message) + var EventTarget = global.ext._EventTarget = function(port, windowID) + { + this._port = port; + this._windowID = windowID; + this.addListener((payload, sender, resolve) => { - var sender = getSender(message.target); - var request = message.data; - - var sent = false; - var sendResponse; - if (sender && "callbackId" in request) + if (payload.type) { - sendResponse = function(message) - { - this._sendResponse(sender, request.callbackId, message); - sent = true; - }.bind(this); + let result = this._port._dispatch(payload.type, payload, sender); + if (typeof result != "undefined") + resolve(result); } - else - sendResponse = function() {}; - - var results = this._messageTarget._dispatch(request.payload, { - page: new holder.Page(sender) - }, sendResponse); - if (!sent && results.indexOf(true) == -1) - sendResponse(undefined); - }, - - _handleResponse: function(message) + }); + }; + EventTarget.prototype = { + addListener: function(listener) { - var response = message.data; - var callback = this._callbacks.get(response.callbackId); - if (callback) + var wrapper = (message, sender) => { - this._callbacks.delete(response.callbackId); - if ("payload" in response) - callback(response.payload); - } - }, + if (this._windowID && this._windowID != message.targetID) + return undefined; - sendMessage: function(message, responseCallback) - { - if (!(this._messageManager instanceof Ci.nsIMessageSender)) - throw new Error("Not implemented"); - - var request = { - payload: message + return new Promise((resolve, reject) => + { + var sender = {}; + if (message.senderID) + { + // We will only get here on the background side so we can access + // the Page object. + const Page = require("ext_background").Page; + sender.page = new Page(message.senderID); + } + if (message.frames) + sender.frame = wrapFrames(message.frames); + if (!listener(message.payload, sender, resolve)) + resolve(undefined); + }); }; - if (responseCallback) - { - request.callbackId = ++this._responseCallbackCounter; - this._callbacks.set(request.callbackId, responseCallback); - } + listener[wrapperSymbol] = wrapper; + this._port.on("ext_message", wrapper); + }, - this._messageManager.sendAsyncMessage("AdblockPlus:Message", request); + removeListener: function(listener) + { + if (listener[wrapperSymbol]) + this._port.off("ext_message", listener[wrapperSymbol]); } }; - var EventTarget = global.ext._EventTarget = function() - { - this._listeners = []; - }; - EventTarget.prototype = { - addListener: function(listener) - { - if (this._listeners.indexOf(listener) == -1) - this._listeners.push(listener); - }, - removeListener: function(listener) - { - var idx = this._listeners.indexOf(listener); - if (idx != -1) - this._listeners.splice(idx, 1); - }, - _dispatch: function() - { - var results = []; + let pageName = "global"; + if (typeof location !== "undefined") + pageName = location.pathname.replace(/.*\//, "").replace(/\..*?$/, ""); - for (var i = 0; i < this._listeners.length; i++) - results.push(this._listeners[i].apply(null, arguments)); + let stringBundle = Services.strings.createBundle( + "chrome://adblockplus/locale/" + pageName + ".properties?" + Math.random()); - return results; + global.ext.i18n = { + getMessage(key, args) + { + try { + return stringBundle.GetStringFromName(key); + } + catch(e) + { + // Don't report errors for special strings, these are expected to be + // missing. + if (key[0] != "@") + Cu.reportError(e); + return ""; + } } }; diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/ext/content.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/ext/content.js index db2d7e1..366325a 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/ext/content.js +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/ext/content.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * 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 @@ -17,86 +17,66 @@ (function(global) { + const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; - if (!global.ext) - global.ext = {}; - - /* Message passing */ - global.ext.onMessage = new global.ext._EventTarget(); + var Services = Cu.import("resource://gre/modules/Services.jsm", {}).Services; - global.ext.backgroundPage = new global.ext._MessageProxy( - window.QueryInterface(Ci.nsIInterfaceRequestor) - .getInterface(Ci.nsIDocShell) - .QueryInterface(Ci.nsIInterfaceRequestor) - .getInterface(Ci.nsIContentFrameMessageManager), - global.ext.onMessage); - window.addEventListener("unload", function() + function require(/**String*/ module) { - global.ext.backgroundPage._disconnect(); - }, false); + var result = {}; + result.wrappedJSObject = result; + Services.obs.notifyObservers(result, "adblockplus-require", module); + return result.exports; + } - /* i18n */ - global.ext.i18n = (function() + function getOuterWindowID() { - var Services = Cu.import("resource://gre/modules/Services.jsm", null).Services; - var pageName = location.pathname.replace(/.*\//, "").replace(/\..*?$/, ""); - - // Randomize URI to work around bug 719376 - var stringBundle = Services.strings.createBundle("chrome://adblockplus/locale/" + pageName + - ".properties?" + Math.random()); - - function getI18nMessage(key) + if (!getOuterWindowID.result) { - return { - "message": stringBundle.GetStringFromName(key) - }; + getOuterWindowID.result = window.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDOMWindowUtils) + .outerWindowID; } + return getOuterWindowID.result; + } - function getText(message, args) - { - var text = message.message; - var placeholders = message.placeholders; - - if (!args || !placeholders) - return text; - - for (var key in placeholders) - { - var content = placeholders[key].content; - if (!content) - continue; + const Port = require("messaging").Port; - var index = parseInt(content.slice(1), 10); - if (isNaN(index)) - continue; + if (!global.ext) + global.ext = {}; - var replacement = args[index - 1]; - if (typeof replacement === "undefined") - continue; + /* Message passing */ + var port = new Port(Cc["@mozilla.org/childprocessmessagemanager;1"] + .getService(Ci.nsIMessageSender)); + window.addEventListener("unload", function() + { + try + { + port.emit("ext_disconnect", getOuterWindowID()); + } + catch (e) + { + // This is expected to fail if Adblock Plus was disabled/uninstalled with + // the page still open. + } + port.disconnect(); + }, false); - text = text.split("$" + key + "$").join(replacement); - } - return text; + global.ext.onMessage = new global.ext._EventTarget(port, getOuterWindowID()); + global.ext.backgroundPage = { + sendMessage: function(payload, responseCallback) + { + var message = { + senderID: getOuterWindowID(), + payload + }; + if (typeof responseCallback == "function") + port.emitWithResponse("ext_message", message).then(responseCallback); + else + port.emit("ext_message", message); } + }; - return { - getMessage: function(key, args) - { - try{ - var message = getI18nMessage(key); - return getText(message, args); - } - catch(e) - { - // Don't report errors for special strings, these are expected to be - // missing. - if (key[0] != "@") - Cu.reportError(e); - return ""; - } - } - }; - })(); })(this); |