| Index: ext/common.js |
| =================================================================== |
| --- a/ext/common.js |
| +++ b/ext/common.js |
| @@ -1,6 +1,6 @@ |
| /* |
| * This file is part of Adblock Plus <https://adblockplus.org/>, |
| - * Copyright (C) 2006-2016 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,37 +17,65 @@ |
| "use strict"; |
| +(function() |
| { |
| // Both Edge and Mozilla Web Extensions use the namespace 'browser' instead of 'chrome' |
| if (typeof browser != 'undefined') |
| window.chrome = window.browser; |
| window.ext = {}; |
| + |
| let EventTarget = ext._EventTarget = function() |
| { |
| - this._listeners = []; |
| + this._listeners = new Set(); |
| }; |
| EventTarget.prototype = { |
| addListener(listener) |
| { |
| - if (this._listeners.indexOf(listener) == -1) |
| - this._listeners.push(listener); |
| + this._listeners.add(listener); |
| }, |
| removeListener(listener) |
| { |
| - let idx = this._listeners.indexOf(listener); |
| - if (idx != -1) |
| - this._listeners.splice(idx, 1); |
| + this._listeners.delete(listener); |
| }, |
| - _dispatch() |
| + _dispatch(...args) |
| { |
| let results = []; |
| - let listeners = this._listeners.slice(); |
| - for (let listener of listeners) |
| - results.push(listener.apply(null, arguments)); |
| + for (let listener of this._listeners) |
| + results.push(listener(...args)); |
| return results; |
| } |
| }; |
| -} |
| + |
| + // Workaround since HTMLCollection and NodeList didn't have iterator support |
| + // before Chrome 51. |
| + // https://bugs.chromium.org/p/chromium/issues/detail?id=401699 |
| + let arrayIterator = Array.prototype[Symbol.iterator]; |
| + if (!(Symbol.iterator in HTMLCollection.prototype)) |
| + HTMLCollection.prototype[Symbol.iterator] = arrayIterator; |
| + if (!(Symbol.iterator in NodeList.prototype)) |
| + NodeList.prototype[Symbol.iterator] = arrayIterator; |
| + |
| + /* Message passing */ |
| + |
| + ext.onMessage = new ext._EventTarget(); |
| + |
| + |
| + /* Background page */ |
| + |
| + ext.backgroundPage = { |
| + sendMessage: chrome.runtime.sendMessage, |
| + getWindow() |
| + { |
| + return chrome.extension.getBackgroundPage(); |
| + } |
| + }; |
| + |
| + |
| + /* Utils */ |
| + |
| + ext.getURL = chrome.extension.getURL; |
| + ext.i18n = chrome.i18n; |
| +}()); |