アドオンから Firefox UI に対して任意のコードを実行できますが、あなたが言うように、XUL 関連のすべてのことを行うのは少し退屈です :-)
「ブートストラップ」拡張機能を入力してください!
パート1:
「Bootstrapped」(または re-startless) 拡張機能には、アドオンを識別するための install.rdf ファイルと、ブートストラップ インターフェースを実装するための bootstrap.js ファイルのみが必要です。
ブートストラップ インターフェイスは非常に簡単に実装できます。
function install() {}
function uninstall() {}
function shutdown(data, reason) {}
function startup(data, reason) { /* YOUR ARBITRARY CODE HERE! */ }
install.rdf
新しい zip ファイルのトップレベルにandを配置して拡張機能をコンパイルしbootstrap.js
、zip ファイル拡張子の名前を .xpi に変更します。
パート2:
あなたのコードには特権が与えられており、Mozilla プラットフォーム API のいずれかを使用できます。ただし、タイミングの問題があります。「スタートアップ」関数が実行される瞬間は、Chrome ウィンドウ オブジェクトがまだ存在しない瞬間です!
コードにとって Chrome ウィンドウがあることが重要な場合は、それが表示されるまで待つ必要があります。
// useful services.
Cu.import("resource://gre/modules/Services.jsm");
var loader = Cc["@mozilla.org/moz/jssubscript-loader;1"]
.getService(Ci.mozIJSSubScriptLoader);
var wmSvc = Cc["@mozilla.org/appshell/window-mediator;1"]
.getService(Ci.nsIWindowMediator);
var logSvc = Cc["@mozilla.org/consoleservice;1"]
.getService(Ci.nsIConsoleService);
// get the first gBrowser
var done_startup = 0;
var windowListener;
function do_startup(win) {
if (done_startup) return;
done_startup = 1;
wmSvc.removeListener(windowListener);
var browserEnum = wmSvc.getEnumerator("navigator:browser");
var browserWin = browserEnum.getNext();
var tabbrowser = browserWin.gBrowser;
/* your code goes here! */
}
// window listener implementation
windowListener = {
onWindowTitleChange: function(aWindow, aTitle) {},
onCloseWindow: function(aWindow) {},
onOpenWindow: function(aWindow) {
var win = aWindow.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindowInternal || Ci.nsIDOMWindow);
win.addEventListener("load", function(aEvent) {
win.removeEventListener("load", arguments.callee, false);
if (aEvent.originalTarget.nodeName != "#document") return;
do_startup();
}
};
// CODE ENTRY POINT (put this in bootstrap "startup" function)
wmSvc.addListener(windowListener);