2012-02-12 64 views
0

我目前正在製作一個Firefox擴展,讓您選擇啓動後要重新打開哪些選項卡,而不是打開所有選項(它打開about:sessionrestore頁面)。我的JS代碼如下所示:「sessionstore-state-read」觀察者無法正常工作

編輯:

chrome.manifest用於

component {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} components/myextension.js 
contract @example.com/MyExtension;1 {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} 
category profile-after-change MyExtension @example.com/MyExtension;1 

組件/ myextension.js

Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); 
const CI = Components.interfaces, CC = Components.classes, CR = Components.results; 

// class declaration 
function MyExtension() {} 

MyExtension.prototype = { 

    classDescription: "My Firefox Extension", 
    classID:   Components.ID("{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"), 
    contractID:  "@example.com/MyExtension;1", 
    QueryInterface: XPCOMUtils.generateQI([CI.nsIObserver]), 

    // add to category manager 
    _xpcom_categories: [{ 
     category: "profile-after-change" 
    }], 

    observe: function(aSubject, aTopic, aData) 
    { 
     var obs = CC["@mozilla.org/observer-service;1"].getService(CI.nsIObserverService); 

     switch (aTopic) 
     { 
      case "profile-after-change": 
       obs.addObserver(this, "sessionstore-state-read", false); 
       break; 
      case "sessionstore-state-read": 
       aSubject.QueryInterface(CI.nsISupportsString); 
       let newData = { windows: [{ tabs: [{ entries: [{ 
        url: "about:sessionrestore", 
        formdata: { "#sessionData": aSubject.data } 
       }] }] }] }; 
       aSubject.data = JSON.stringify(newData); 
       break; 
      default: 
       throw Components.Exception("Unknown topic: " + aTopic); 
     } 
    } 
}; 

if (XPCOMUtils.generateNSGetFactory) 
    var NSGetFactory = XPCOMUtils.generateNSGetFactory([EmbarrassedObserver]); 
else 
    var NSGetModule = XPCOMUtils.generateNSGetModule([EmbarrassedObserver]); 

更新與工作版本的代碼它工作正常sessionstore-state-write(註釋行),但我想用sessionstore-state-read事件來做,因爲我不想編輯wh在它寫入磁盤。問題是,當我更改爲閱讀事件時,我的觀察者停止工作。我的猜測是我註冊觀察者的時間太晚(在會話被讀取後),所以我試圖儘快註冊它(當擴展第一次加載時,內置窗口加載事件),但它仍然不會工作。任何想法如何讓它工作?

回答

0

您需要將您的擴展程序編寫爲偵聽更改後配置文件通知(允許擴展程序允許偵聽的first通知)的XPCOM組件。然後你的組件將能夠監聽sessionstore-state-read通知。