From ac201e2f8e5ce0e9eca0d0852db23706f2e31b55 Mon Sep 17 00:00:00 2001 From: Deathamns Date: Tue, 2 Dec 2014 08:35:25 +0100 Subject: [PATCH] Firefox: partial vAPI.tabs implementation --- platform/firefox/frameScript.js | 163 ++++++++++++++++---------------- 1 file changed, 81 insertions(+), 82 deletions(-) diff --git a/platform/firefox/frameScript.js b/platform/firefox/frameScript.js index c94f260..a27022f 100644 --- a/platform/firefox/frameScript.js +++ b/platform/firefox/frameScript.js @@ -4,96 +4,95 @@ 'use strict'; -let - appName = 'ublock', - contentBaseURI = 'chrome://' + appName + '/content/js/', - listeners = {}, - _addMessageListener = function(id, fn) { - _removeMessageListener(id); - listeners[id] = function(msg) { - fn(msg.data); - }; - addMessageListener(id, listeners[id]); - }, - _removeMessageListener = function(id) { - if (listeners[id]) { - removeMessageListener(id, listeners[id]); - } - - delete listeners[id]; - }; +let appName = 'ublock'; +let contentBaseURI = 'chrome://' + appName + '/content/js/'; +let listeners = {}; + +let _addMessageListener = function(id, fn) { + _removeMessageListener(id); + listeners[id] = function(msg) { + fn(msg.data); + }; + addMessageListener(id, listeners[id]); +}; + +let _removeMessageListener = function(id) { + if (listeners[id]) { + removeMessageListener(id, listeners[id]); + } + + delete listeners[id]; +}; addMessageListener('µBlock:broadcast', function(msg) { - for (var id in listeners) { - listeners[id](msg); - } + for (let id in listeners) { + listeners[id](msg); + } }); -var observer = { - unload: function(e) { - Services.obs.removeObserver(observer, 'content-document-global-created'); - observer = listeners = null; - }, - onDOMReady: function(e) { - var win = e.target.defaultView; - - if (win.location.protocol === 'chrome:' && win.location.host === appName) { - win.sendAsyncMessage = sendAsyncMessage; - win.addMessageListener = _addMessageListener; - win.removeMessageListener = _removeMessageListener; - } - }, - observe: function(win) { - if (!win || win.top !== content) { - return; - } - - // baseURI is more reliable - var location = Services.io.newURI( - win.location.protocol === 'data:' ? 'data:text/plain,' : win.document.baseURI, - null, - null - ); - - if (!(win.document instanceof win.HTMLDocument - && (/^https?$/.test(location.scheme)))) { - return; - } - - win = Components.utils.Sandbox([win], { - sandboxPrototype: win, - wantComponents: false, - wantXHRConstructor: false - }); - - win.sendAsyncMessage = sendAsyncMessage; - win.addMessageListener = _addMessageListener; - win.removeMessageListener = _removeMessageListener; - - var lss = Services.scriptloader.loadSubScript; - - lss(contentBaseURI + 'vapi-client.js', win); - lss(contentBaseURI + 'contentscript-start.js', win); - - if (win.document.readyState === 'loading') { - let docReady = function(e) { - this.removeEventListener(e.type, docReady, true); - lss(contentBaseURI + 'contentscript-end.js', win); - }; - - win.document.addEventListener('DOMContentLoaded', docReady, true); - } - else { - lss(contentBaseURI + 'contentscript-end.js', win); - } - } +let initContext = function(win, sandbox) { + if (sandbox) { + win = Components.utils.Sandbox([win], { + sandboxPrototype: win, + wantComponents: false, + wantXHRConstructor: false + }); + } + + win.sendAsyncMessage = sendAsyncMessage; + win.addMessageListener = _addMessageListener; + win.removeMessageListener = _removeMessageListener; + + return win; +}; + +let observer = { + observe: function(win) { + if (!win || win.top !== content) { + return; + } + + if (!(win.document instanceof win.HTMLDocument + && (/^https?:$/.test(win.location.protocol)))) { + return; + } + + let lss = Services.scriptloader.loadSubScript; + win = initContext(win, true); + + lss(contentBaseURI + 'vapi-client.js', win); + lss(contentBaseURI + 'contentscript-start.js', win); + + if (win.document.readyState === 'loading') { + let docReady = function(e) { + this.removeEventListener(e.type, docReady, true); + lss(contentBaseURI + 'contentscript-end.js', win); + }; + + win.document.addEventListener('DOMContentLoaded', docReady, true); + } + else { + lss(contentBaseURI + 'contentscript-end.js', win); + } + } }; Services.obs.addObserver(observer, 'content-document-global-created', false); -addEventListener('unload', observer.unload, false); +let DOMReady = function(e) { + let win = e.target.defaultView; + + // inject the message handlers for the options page + if (win.location.protocol === 'chrome:' && win.location.host === appName) { + initContext(win); + } +}; + +addEventListener('DOMContentLoaded', DOMReady, true); -// for the Options page -addEventListener('DOMContentLoaded', observer.onDOMReady, true); +addEventListener('unload', function() { + Services.obs.removeObserver(observer, 'content-document-global-created'); + observer = listeners = null; +}, false); })(); \ No newline at end of file