我在Mac OS上使用Firefox插件,我想在用户禁用插件时通知我的XPCOM组件。这是有效的,除了事件发布多次(等于FF Windows打开的数量) ),这是自AddonManager.addAddonListener(nsListener)以来发生的;在onload上调用(window.addEventListener(“load”,function(e){TopWnd.onLoad(e);},false);)在所有窗口的浏览器覆盖js中,并在每个窗口中调用事件“onDisabling” 。
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 :(得分:0)
我认为这种做法是错误的。您不应该在每个窗口中注册此侦听器,它应该只在中心位置注册一次。您可以避免多个窗口的问题以及有时没有打开窗口的问题(可能在Mac OS X上)。在XPCOM组件中直接注册该侦听器是有意义的。但是,如果由于某种原因这是不可能的 - 您仍然可以使用JavaScript module每个窗口将导入并注册此侦听器(JavaScript模块只加载一次,无论它导入的频率如何,因此只会注册一个听众。)
附注:不要使用像ext-disabled
这样的通用主题名称(假设这实际上是您正在使用的主题),其他扩展可能会决定使用相同的名称,并且会出现大问题。使用与您的扩展名相关的内容,以便其他开发人员不会选择它。另外,使用观察者服务与您自己的XPCOM组件进行通信很奇怪,为什么不直接获取该XPCOM组件的实例并调用其方法?