【问题标题】:"sessionstore-state-read" observer not working“sessionstore-state-read”观察者不工作
【发布时间】:2012-02-15 03:00:50
【问题描述】:

我目前正在制作一个 Firefox 扩展程序,它可以让您选择启动后要重新打开的选项卡,而不是打开所有内容(它打开 about:sessionrestore 页面)。我的 JS 代码如下所示:

编辑:使用工作版本更新代码

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

components/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 事件来做,因为我不想编辑它写入磁盘的内容。问题是,当我更改为读取事件时,我的观察者停止工作。我的猜测是我注册观察者太晚了(在读取会话之后),所以我尝试尽快注册它(当第一次加载扩展时,插入窗口加载事件),但它仍然无法工作。知道如何让它工作吗?

【问题讨论】:

    标签: firefox firefox-addon observer-pattern


    【解决方案1】:

    您需要将您的扩展程序编写为一个 XPCOM 组件,以侦听配置文件更改后通知(允许扩展程序侦听的 first 通知)。然后您的组件将能够监听 sessionstore-state-read 通知。

    【讨论】:

      猜你喜欢
      • 2014-03-24
      • 2011-04-14
      • 2013-01-30
      • 2017-12-04
      • 1970-01-01
      • 2015-02-14
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多