2011-08-26 40 views
0

我正在使用Mac OS上的Firefox附件,当用户禁用附加组件时,我想通知我的XPCOM组件。事件发布不止一次(等于FF Windows打开的次数),这是因为AddonManager.addAddonListener(nsListener);在所有窗口的浏览器覆盖js上的onload(window.addEventListener(“load”,function(e){TopWnd.onLoad(e);},false);)以及在每个窗口中调用事件“onDisabling” 。Firefox附加组件:查找当前页面是否为附件页

var nsListener = { 
    onDisabling: function(addon, needsRestart) 
{ 
     if (addon.id.toLowerCase() == "XXXXXXX") 
{ 
     var observerService = Components.classes["@mozilla.org/observer-service;1"] 
          .getService(Components.interfaces.nsIObserverService); 
      if (observerService) { 
       observerService.notifyObservers(null, "ext-disable", "Ext is disabled"); 
      } 

     } 
    } 

} 

为了避免所有窗口通知XPCOM组件,我要确定当前打开的选项卡/窗口是附加页面,然后才加入AddonManager.addAddonListener(nsListener);或仅通知该页面。确定当前窗口/选项卡是否为附加页面的最佳方式是什么?

请帮助。

回答

0

我认为这种方法是错误的。你不应该在每个窗口中注册这个监听器,它只能在一个中心位置注册一次。您避免了多个窗口的问题,并且还解决了有时没有打开窗口的问题(可能在Mac OS X上)。将这个监听器直接注册到XPCOM组件中是有意义的。但是,如果出于某种原因,这是不可能的 - 您仍然可以获得每个窗口将导入的JavaScript module,并且将注册此侦听器(JavaScript模块只加载一次,无论导入的频率如何,因此只有一个侦听器将会被注册)。注意:不要使用像ext-disabled这样的通用主题名称(假设这真的是您正在使用的主题),其他扩展名可能会决定使用相同的名称,并且会有大量的混乱。使用与您的扩展名相关的内容,以使其不会被其他开发者选择。另外,使用观察者服务与自己的XPCOM组件进行通信很奇怪,为什么不直接调用XPCOM组件的实例并直接调用它的方法?

+0

您正在捕获附加组件被禁用的事件 - 哪些*可能*是用户单击按钮或另一个扩展程序来执行其作业,甚至是未来Firefox版本中的内置兼容性检查。所以“没有窗户”是一种可能的情况。 –

相关问题