Created
February 27, 2014 05:17
-
-
Save yajd/9244811 to your computer and use it in GitHub Desktop.
_template-ff-addon-BootstrapWatchHostEventListener - A template for bootstrapped Firefox addon that uses event listeners to watch for page loads and when a page load matches host that you specify it will inject to it.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const {interfaces: Ci, utils: Cu} = Components; | |
Cu.import('resource://gre/modules/Services.jsm'); | |
const ignoreFrames = true; | |
function addDiv(theDoc) { | |
Cu.reportError('addDiv host = ' + theDoc.location.host); | |
if (!theDoc) { Cu.reportError('no doc!'); return; } //document not provided, it is undefined likely | |
if(!(theDoc.location && theDoc.location.host.indexOf('github.com') > -1)) { Cu.reportError('location not match host:' + theDoc.location.host); return; } | |
//if (!theDoc instanceof Ci.nsIDOMHTMLDocument) { Cu.reportError('not html doc'); return; } //not html document, so its likely an xul document //you probably dont need this check, checking host is enought | |
Cu.reportError('host pass'); | |
//add your stuff here | |
} | |
function removeDiv(theDoc, skipChecks) { | |
//Cu.reportError('removeDiv'); | |
if (!skipChecks) { | |
if (!theDoc) { Cu.reportError('no doc!'); return; } //document not provided, it is undefined likely | |
if(!(theDoc.location && theDoc.location.host.indexOf('github.com') > -1)) { Cu.reportError('location not match host:' + theDoc.location.host); return; } | |
//if (!theDoc instanceof Ci.nsIDOMHTMLDocument) { Cu.reportError('not html doc'); return; } //not html document, so its likely an xul document //you probably dont need this check, checking host is enought | |
} | |
var alreadyThere = false; //change this to some test to see if the stuff needing adding is already there | |
if (alreadyThere) { | |
Cu.reportError('stuff found in document'); | |
//run to remove the stuff | |
} | |
//else its not there so no need to do anything | |
} | |
function listenPageLoad(event) { | |
var win = event.originalTarget.defaultView; | |
var doc = win.document; | |
Cu.reportError('page loaded loc = ' + doc.location); | |
if (win.frameElement) { | |
//its a frame | |
Cu.reportError('its a frame'); | |
if (ignoreFrames) { | |
return;//dont want to watch frames | |
} | |
} | |
addDiv(doc); | |
} | |
/*start - windowlistener*/ | |
var windowListener = { | |
//DO NOT EDIT HERE | |
onOpenWindow: function (aXULWindow) { | |
// Wait for the window to finish loading | |
let aDOMWindow = aXULWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowInternal || Ci.nsIDOMWindow); | |
aDOMWindow.addEventListener("load", function () { | |
aDOMWindow.removeEventListener("load", arguments.callee, false); | |
windowListener.loadIntoWindow(aDOMWindow, aXULWindow); | |
}, false); | |
}, | |
onCloseWindow: function (aXULWindow) {}, | |
onWindowTitleChange: function (aXULWindow, aNewTitle) {}, | |
register: function () { | |
// Load into any existing windows | |
let XULWindows = Services.wm.getXULWindowEnumerator(null); | |
while (XULWindows.hasMoreElements()) { | |
let aXULWindow = XULWindows.getNext(); | |
let aDOMWindow = aXULWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowInternal || Ci.nsIDOMWindow); | |
windowListener.loadIntoWindow(aDOMWindow, aXULWindow); | |
} | |
// Listen to new windows | |
Services.wm.addListener(windowListener); | |
}, | |
unregister: function () { | |
// Unload from any existing windows | |
let XULWindows = Services.wm.getXULWindowEnumerator(null); | |
while (XULWindows.hasMoreElements()) { | |
let aXULWindow = XULWindows.getNext(); | |
let aDOMWindow = aXULWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowInternal || Ci.nsIDOMWindow); | |
windowListener.unloadFromWindow(aDOMWindow, aXULWindow); | |
} | |
//Stop listening so future added windows dont get this attached | |
Services.wm.removeListener(windowListener); | |
}, | |
//END - DO NOT EDIT HERE | |
loadIntoWindow: function (aDOMWindow, aXULWindow) { | |
if (!aDOMWindow) { | |
return; | |
} | |
if (aDOMWindow.gBrowser) { | |
aDOMWindow.gBrowser.addEventListener('DOMContentLoaded', listenPageLoad, false); | |
if (aDOMWindow.gBrowser.tabContainer) { | |
//has tabContainer | |
//start - go through all tabs in this window we just added to | |
var tabs = aDOMWindow.gBrowser.tabContainer.childNodes; | |
for (var i = 0; i < tabs.length; i++) { | |
Cu.reportError('DOING tab: ' + i); | |
var tabBrowser = tabs[i].linkedBrowser; | |
var win = tabBrowser.contentWindow; | |
loadIntoContentWindowAndItsFrames(win); | |
} | |
//end - go through all tabs in this window we just added to | |
} else { | |
//does not have tabContainer | |
var win = aDOMWindow.gBrowser.contentWindow; | |
loadIntoContentWindowAndItsFrames(win); | |
} | |
} else { | |
//window does not have gBrowser | |
} | |
}, | |
unloadFromWindow: function (aDOMWindow, aXULWindow) { | |
if (!aDOMWindow) { | |
return; | |
} | |
if (aDOMWindow.gBrowser) { | |
aDOMWindow.gBrowser.removeEventListener('DOMContentLoaded', listenPageLoad, false); | |
if (aDOMWindow.gBrowser.tabContainer) { | |
//has tabContainer | |
//start - go through all tabs in this window we just added to | |
var tabs = aDOMWindow.gBrowser.tabContainer.childNodes; | |
for (var i = 0; i < tabs.length; i++) { | |
Cu.reportError('DOING tab: ' + i); | |
var tabBrowser = tabs[i].linkedBrowser; | |
var win = tabBrowser.contentWindow; | |
unloadFromContentWindowAndItsFrames(win); | |
} | |
//end - go through all tabs in this window we just added to | |
} else { | |
//does not have tabContainer | |
var win = aDOMWindow.gBrowser.contentWindow; | |
unloadFromContentWindowAndItsFrames(win); | |
} | |
} else { | |
//window does not have gBrowser | |
} | |
} | |
}; | |
/*end - windowlistener*/ | |
function loadIntoContentWindowAndItsFrames(theWin) { | |
var frames = theWin.frames; | |
var winArr = [theWin]; | |
for (var j = 0; j < frames.length; j++) { | |
winArr.push(frames[j].window); | |
} | |
Cu.reportError('# of frames in tab: ' + frames.length); | |
for (var j = 0; j < winArr.length; j++) { | |
if (j == 0) { | |
Cu.reportError('**checking win: ' + j + ' location = ' + winArr[j].document.location); | |
} else { | |
Cu.reportError('**checking frame win: ' + j + ' location = ' + winArr[j].document.location); | |
} | |
var doc = winArr[j].document; | |
//START - edit below here | |
addDiv(doc); | |
if (ignoreFrames) { | |
break; | |
} | |
//END - edit above here | |
} | |
} | |
function unloadFromContentWindowAndItsFrames(theWin) { | |
var frames = theWin.frames; | |
var winArr = [theWin]; | |
for (var j = 0; j < frames.length; j++) { | |
winArr.push(frames[j].window); | |
} | |
Cu.reportError('# of frames in tab: ' + frames.length); | |
for (var j = 0; j < winArr.length; j++) { | |
if (j == 0) { | |
Cu.reportError('**checking win: ' + j + ' location = ' + winArr[j].document.location); | |
} else { | |
Cu.reportError('**checking frame win: ' + j + ' location = ' + winArr[j].document.location); | |
} | |
var doc = winArr[j].document; | |
//START - edit below here | |
removeDiv(doc); | |
if (ignoreFrames) { | |
break; | |
} | |
//END - edit above here | |
} | |
} | |
function startup(aData, aReason) { | |
windowListener.register(); | |
} | |
function shutdown(aData, aReason) { | |
if (aReason == APP_SHUTDOWN) return; | |
windowListener.unregister(); | |
} | |
function install() {} | |
function uninstall() {} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
README
Rev1
addDiv
function is where you want to edit to add, be sure to editremoveDiv
function to remove the stuff you added to the documentskipChecks
parameter of removeDiv is meant only for if running removeDiv in addDiv function. For example you want to ensure that the old stuff is removed before adding the new stuff so you runremoveDiv(theDoc,true)
before adding