Browse Source

Firefox: implement content scripts

pull/2/head
Deathamns 10 years ago
committed by gorhill
parent
commit
24163694f4
  1. 71
      platform/firefox/frameScript.js

71
platform/firefox/frameScript.js

@ -5,8 +5,8 @@
'use strict'; 'use strict';
var var
app_name = 'ublock',
app_baseURI = 'chrome://' + app_name + '/content/js/',
appName = 'ublock',
contentBaseURI = 'chrome://' + appName + '/content/js/',
listeners = {}, listeners = {},
_addMessageListener = function(id, fn) { _addMessageListener = function(id, fn) {
_removeMessageListener(id); _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);
})(); })();
Loading…
Cancel
Save