我开始构建一个无需重启的 Firefox 插件,但在设置 bootstrap.js 时遇到了问题。每个人似乎都同意 bootstrap.js 的核心几乎是样板代码,大致如下:
const Cc = Components.classes;
const Ci = Components.interfaces;
function startup() {
let wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
let windows = wm.getEnumerator("navigator:browser");
while (windows.hasMoreElements()) {
let domWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow);
// then can control what happens with domWindow.document
}
}
function shutdown() {}
function install() {}
function uninstall() {}
此代码有效,我可以控制现有窗口中的内容。例如,domWindow.alert("text")
在当前打开的每个窗口上成功创建一个标准警报,显示“文本”。
但是,我找不到任何可以让我在新窗口中执行操作的代码;即脚本运行后创建的那些。处理新窗口的创建并获得对它们的控制的正确方法是什么,以至于我可以在创建新窗口时获得另一个“文本”警报?
编辑:使用 nsWindowMediator 类和来自 MDN 的代码示例,我现在有了这个:
var windowListener = {
onOpenWindow: function (aWindow) {
try {
let domWindow = aWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowInternal || Ci.nsIDOMWindow);
domWindow.addEventListener("load", function () {
domWindow.removeEventListener("load", arguments.callee, false);
//window has now loaded now do stuff to it
domWindow.alert("text");
}, false);
} catch (err) {
Services.prompt.alert(null, "Error", err);
}
},
onCloseWindow: function (aWindow) {},
onWindowTitleChange: function (aWindow, aTitle) {}
};
function startup(aData, aReason) {
// Load into any existing windows
try {
let wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
let windows = wm.getEnumerator("navigator:browser");
while (windows.hasMoreElements()) {
let domWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow);
loadIntoWindow(domWindow);
}
} catch (err) {
Services.prompt.alert(null, "Error", err);
}
Services.wm.addListener(windowListener);
}
但是,onOpenWindow 调用仍然没有输出——“文本”警报没有出现,catch 块中的错误警报也没有出现。我可以确认实际上正在输入 onOpenWindow;如果我Services.prompt.alert()
在 onOpenWindow 的开头加上 a,我会在创建新窗口时收到警报。不幸的是,我收到了无限循环的警报,我不知道为什么。