From 98e5645ab594c0c358b1309bfd800fb3d721e804 Mon Sep 17 00:00:00 2001 From: Deathamns Date: Mon, 24 Nov 2014 20:47:32 +0100 Subject: [PATCH] Firefox: implement content scripts --- platform/firefox/frameScript.js | 71 ++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/platform/firefox/frameScript.js b/platform/firefox/frameScript.js index 30dd94acb..12644490b 100644 --- a/platform/firefox/frameScript.js +++ b/platform/firefox/frameScript.js @@ -5,8 +5,8 @@ 'use strict'; var - app_name = 'ublock', - app_baseURI = 'chrome://' + app_name + '/content/js/', + appName = 'ublock', + contentBaseURI = 'chrome://' + appName + '/content/js/', listeners = {}, _addMessageListener = function(id, fn) { _removeMessageListener(id); @@ -29,4 +29,71 @@ addMessageListener('µBlock:broadcast', function(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); + } + } +}; + +Services.obs.addObserver(observer, 'content-document-global-created', false); + +addEventListener('unload', observer.unload, false); + +// for the Options page +addEventListener('DOMContentLoaded', observer.onDOMReady, true); + })(); \ No newline at end of file