Das Browserfenster hat <command>
Elemente die ausgelöst werden, wenn der Nutzer ein Lesezeichen setzt oder eine Seite herunterlädt. Ersteres hat die ID Browser:AddBookmarkAs
letztere Browser:SavePage
. Das Add-on-SDK selbst gibt Ihnen keinen Zugang zu ihnen, daher müssen Sie das chrome
Paket um direkt auf XPCOM zuzugreifen. Etwa so:
// Add listener to all existing browser windows
var {Cc, Ci} = require("chrome");
var mediator = Cc["@mozilla.org/appshell/window-mediator;1"]
.getService(Ci.nsIWindowMediator);
var enumerator = mediator.getEnumerator("navigator:browser");
while (enumerator.hasMoreElements())
listenToWindow(enumerator.getNext().QueryInterface(Ci.nsIDOMWindow));
// Get notified when new browser windows open
var observers = require("observer-service");
observers.add("chrome-document-global-created", function(window)
{
if (window instanceof Ci.nsIDOMWindow && window.location.href == "chrome://browser/content/browser.xul")
listenToWindow(window);
});
function listenToWindow(window)
{
window.document
.getElementById("Browser:AddBookmarkAs")
.addEventListener("command", onBookmark, false);
window.document
.getElementById("Browser:SavePage")
.addEventListener("command", onSavePage, false);
}
Dieser Code ist nicht getestet, so dass es kleinere Probleme geben könnte, aber das Gesamtkonzept sollte korrekt sein.
bearbeiten : Tatsächlich scheint das Gleiche einfacher zu sein, wenn Sie die interne window-utils
Paket. Ich bin mir jedoch nicht sicher, ob die von diesem Paket bereitgestellte API stabil ist.
var windows = require("window-utils");
for (window in windows.browserWindowIterator)
listenToWindow(window);
var observers = require("observer-service");
observers.add("chrome-document-global-created", function(window)
{
if (window instanceof Ci.nsIDOMWindow && windows.isBrowser(window))
listenToWindow(window);
});