diff options
Diffstat (limited to 'data/extensions/spyblock@gnu.org/lib/ext_common.js')
-rw-r--r-- | data/extensions/spyblock@gnu.org/lib/ext_common.js | 187 |
1 files changed, 76 insertions, 111 deletions
diff --git a/data/extensions/spyblock@gnu.org/lib/ext_common.js b/data/extensions/spyblock@gnu.org/lib/ext_common.js index 129f232..296c00f 100644 --- a/data/extensions/spyblock@gnu.org/lib/ext_common.js +++ b/data/extensions/spyblock@gnu.org/lib/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 ""; + } } }; |