我正在编写Firefox Addon,而不是在新窗口中打开内容可以在新标签或侧边栏中打开内容。
有several ways打开窗口:
window.open()
window.openDialog()
或...... openWindow()
函数从nsIWindowWatcher interface @mozilla.org/embedcomp/window-watcher;1
组件
我覆盖window.open和window.openDialog,它似乎工作但我在窗口监视器组件中覆盖openWindow()
函数时遇到问题。
我覆盖整个组件,因为我不知道如何仅覆盖指定函数。现在我实现组件的所有功能,并以类似这个函数的方式将它们重定向到内部原始组件this._WindowWatcher=Cc["@mozilla.org/embedcomp/window-watcher;1"].getService(Ci.nsIWindowWatcher)
:
getWindowByName : function(/* in wstring */ aTargetName, /* in nsIDOMWindow */ aCurrentWindow) // --> nsIDOMWindow;
{
var all_args = Array.prototype.slice.call(arguments); // convert to Array
return this._WindowWatcher.getWindowByName.apply(this._WindowWatcher, all_args);
},
然后我使用XPCOMUtils.jsm和nsIComponentRegistrar注册组件:
var NSGetFactory = XPCOMUtils.generateNSGetFactory([WindowWatcher]);
var WindowWatcherFactory = NSGetFactory(WindowWatcher.prototype.classID);
var nsIComponentRegistrar = Components.manager
.QueryInterface(Ci.nsIComponentRegistrar);
var oldCID = nsIComponentRegistrar
.contractIDToCID("@mozilla.org/embedcomp/window-watcher;1");
nsIComponentRegistrar.registerFactory(
WindowWatcher.prototype.classID,
null,
"@mozilla.org/embedcomp/window-watcher;1",
WindowWatcherFactory
);
当我在JavaScript中直接使用Window Watcher时,这似乎有用:
ww = Cc["@mozilla.org/embedcomp/window-watcher;1"]
.getService(Ci.nsIWindowWatcher)
var win = ww.openWindow(null, "about:home",
"_blank", "chrome,centerscreen", null);
但是当Firefox希望在内部使用覆盖组件时(例如,在控制台中单击错误项上的链接;可能是Firefox正在使用nsGlobalWindow::OpenDialog),则会导致错误:
NS_ERROR_UNEXPECTED: Component returned failure code: 0x8000ffff
(NS_ERROR_UNEXPECTED) [nsIDOMJSWindow.openDialog]
我的扩展程序为here(覆盖modules\window-watcher.jsm
中的组件模块)
对于测试,我在Chrome上下文或Developer Assistant插件中的JavaScript Shell上使用Firebug控制台并导入我的组件模块Components.utils.import("resource://moreICUIPlus/window-watcher.jsm");
感谢所有可能的提示。
答案 0 :(得分:2)
只是为了不需要浏览评论:
无法在javascript组件中重新实现(包装)@mozilla.org/embedcomp/window-watcher;1
组件,因为需要实现不可编写脚本的nsPIWindowWatcher
接口。
可以在C ++组件中重新实现(包装)它,但是在附加组件的上下文中不太可行,因为需要为所有支持的OS /平台编译,并且需要重新编译对于每个版本的Gecko,因为二进制组件是版本标记的,如果Gecko版本不匹配则不会加载。