/* * This file is part of Adblock Plus , * 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 . */ (function(global) { const Cu = Components.utils; let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); if (!global.ext) global.ext = {}; var wrapperSymbol = Symbol("ext-wrapper"); function wrapFrames(frames) { if (!frames.length) return null; // 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) }); Object.defineProperty(frames, "parent", { enumerable: true, get: () => wrapFrames(frames.slice(1)) }); return frames; } var EventTarget = global.ext._EventTarget = function(port, windowID) { this._port = port; this._windowID = windowID; this.addListener((payload, sender, resolve) => { if (payload.type) { let result = this._port._dispatch(payload.type, payload, sender); if (typeof result != "undefined") resolve(result); } }); }; EventTarget.prototype = { addListener: function(listener) { var wrapper = (message, sender) => { if (this._windowID && this._windowID != message.targetID) return undefined; 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); }); }; listener[wrapperSymbol] = wrapper; this._port.on("ext_message", wrapper); }, removeListener: function(listener) { if (listener[wrapperSymbol]) this._port.off("ext_message", listener[wrapperSymbol]); } }; let pageName = "global"; if (typeof location !== "undefined") pageName = location.pathname.replace(/.*\//, "").replace(/\..*?$/, ""); let stringBundle = Services.strings.createBundle( "chrome://adblockplus/locale/" + pageName + ".properties?" + Math.random()); 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 ""; } } }; if (typeof exports == "object") exports = global.ext; })(this);