0

軽量テーマ リストが変更されたときに通知する FF 拡張機能があります。コードは次のとおりです。

var PesonaSwitcherObserver = {

    register: function() {
        PersonaSwitcher.log ("in register");
        var observerService =
            Components.classes["@mozilla.org/observer-service;1"]
            .getService(Components.interfaces.nsIObserverService);
        observerService.addObserver(PesonaSwitcherObserver,
            "lightweight-theme-list-change", false);
    },

    observe: function (subject, topic, data) {
        PersonaSwitcher.log ("in observe");
        switch (topic) {
            case 'lightweight-theme-list-change':
                PersonaSwitcher.subMenu();
                break;
        }
    },

    unregister: function() {
        PersonaSwitcher.log ("in unregister");
        var observerService =
            Components.classes["@mozilla.org/observer-service;1"]
            .getService(Components.interfaces.nsIObserverService);
        observerService.removeObserver(PesonaSwitcherObserver,
            "lightweight-theme-list-change");
    }
}

window.addEventListener("load", PesonaSwitcherObserver.register, false);
window.addEventListener("unload", PesonaSwitcherObserver.unregister, false);

ペルソナを追加または削除すると、ログは「登録中」を受け取りますが、「監視中」は受け取りません。私もLightweightThemeManager.jsmを見てきました

function _updateUsedThemes(aList) {

通話

Services.obs.notifyObservers(null, "lightweight-theme-list-changed", null);

理由やヒントを知っている人はいますか?

4

1 に答える 1

0

の呼び出しは失敗したと思いobserverService.addObserver()ます。エラーコンソールを確認してください(Ctrl-Shift-Jを押して開きます)。オブザーバーはQueryInterface関数を実装しておらず、オブザーバーサービスは実装されているかどうかを明示的にチェックnsIObserverします。この関数は、XPCOMUtils.jsmを使用して実装するのが最も簡単です。グローバルスコープにインポートしたくない場合(コードはオーバーレイから実行されているように見えるため、おそらくインポートしません)、次のように行うことができます。

var PesonaSwitcherObserver = {
    QueryInterface: Components.utils.import("resource://gre/modules/XPCOMUtils.jsm", null)
                              .XPCOMUtils
                              .generateQI([Components.interfaces.nsIObserver]),
    ...
于 2012-05-05T16:23:10.200 に答える