【发布时间】:2015-03-21 01:14:59
【问题描述】:
我开始构建一个无需重启的 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;如果我在 onOpenWindow 的开头放置一个Services.prompt.alert(),我会在创建新窗口时收到警报。不幸的是,我收到了无限循环的警报,我不知道为什么。
【问题讨论】:
-
这显示了一个关于如何弄乱窗口的简单演示:github.com/Noitidart/_ff-addon-demo-BootstrapHotkey 这个为所有窗口添加了一个热键
-
你为什么要使用那些
alerts?我们生活在 21 世纪,我们有console.log或dump()。 -
您所做的编辑大大改变了问题的要求(从“我如何在新窗口打开时运行代码?”更改为“With此处包含的代码,为什么我会有一个无限循环的警报?”。另外一次,问一个 new 问题而不是将您的问题更改为有意义的问题会更合适不同。鉴于它们是相关的,从新问题链接到这个问题是合适的。
标签: javascript firefox-addon firefox-addon-restartless