наблюдатель "sessionstore-state-read" не работает - PullRequest
0 голосов
/ 13 февраля 2012

В настоящее время я создаю расширение для Firefox, которое позволит вам выбирать, какие вкладки вы хотите открыть после запуска, вместо того, чтобы открывать все (открывается примерно: страница сеанса восстановления).Мой код 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, потому что я не хочу редактировать то, что записывает на диск.Проблема в том, что когда я переключаюсь на событие чтения, мой наблюдатель перестает работать.Я предполагаю, что я зарегистрировал наблюдателя слишком поздно (после того, как сессия прочитана), поэтому я попытался зарегистрировать его как можно скорее (когда расширение загружается впервые, установлено событие загрузки окна), но оно все равно не будет работать.Любая идея, как заставить это работать?

1 Ответ

0 голосов
/ 13 февраля 2012

Вам нужно записать свое расширение как компонент XPCOM, который прослушивает уведомление о профиле после изменения ( first уведомление о том, что расширениям разрешено слушать расширения). Тогда ваш компонент сможет прослушивать уведомление о состоянии сеанса чтения-чтения.

...