| Index: ext/common.js | 
| diff --git a/ext/common.js b/ext/common.js | 
| index 445dc73ad58621eae3adf7a5170a687e093707bd..e3fbdc16d29aae9d0e71dd1d29ec4ec10ed80668 100644 | 
| --- a/ext/common.js | 
| +++ b/ext/common.js | 
| @@ -18,7 +18,9 @@ | 
| "use strict"; | 
|  | 
| { | 
| +  /* eslint-disable no-var */ | 
| var ext = {}; | 
| +  /* eslint-enable no-var */ | 
|  | 
| let EventTarget = ext._EventTarget = function() | 
| { | 
| @@ -36,15 +38,45 @@ | 
| if (idx != -1) | 
| this._listeners.splice(idx, 1); | 
| }, | 
| -    _dispatch() | 
| +    _dispatch(...args) | 
| { | 
| let results = []; | 
| let listeners = this._listeners.slice(); | 
|  | 
| for (let listener of listeners) | 
| -        results.push(listener.apply(null, arguments)); | 
| +        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; | 
| } | 
|  |