2011-08-26 62 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版本中的內置兼容性檢查。所以「沒有窗戶」是一種可能的情況。 –

相關問題