您可以针对Firefox的用户界面从插件执行任意代码,但正如你说,做所有的XUL相关的东西是有点无趣:-)
进入“自举”扩展!
1部分:
A“自举”(或重新startless)扩展仅需要一个install.rdf的文件,以确定该附加组件,和一个bootstrap.js文件以实现自举接口。
引导程序接口,可以非常简单地实现:
function install() {}
function uninstall() {}
function shutdown(data, reason) {}
function startup(data, reason) { /* YOUR ARBITRARY CODE HERE! */ }
你可以通过把install.rdf
编译扩展和bootstrap.js
放入新zip文件的顶层,并将zip文件扩展名重命名为.xpi。
第2部分:
你的代码是特权,并且可以使用任何Mozilla平台的API。但是有一个时间问题。执行“启动”功能的时间点是尚未存在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);