覆盖nsIWindowWatcher组件

时间:2013-08-08 11:26:25

标签: javascript firefox firefox-addon xpcom

我正在编写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");

感谢所有可能的提示。

1 个答案:

答案 0 :(得分:2)

只是为了不需要浏览评论:

无法在javascript组件中重新实现(包装)@mozilla.org/embedcomp/window-watcher;1组件,因为需要实现不可编写脚本的nsPIWindowWatcher接口。

可以在C ++组件中重新实现(包装)它,但是在附加组件的上下文中不太可行,因为需要为所有支持的OS /平台编译,并且需要重新编译对于每个版本的Gecko,因为二进制组件是版本标记的,如果Gecko版本不匹配则不会加载。