如何为nsIBrowserSearchService添加观察者

时间:2014-11-18 23:14:14

标签: javascript firefox firefox-addon firefox-addon-sdk observers

我无法添加观察者来观察firefox搜索引擎的变化。我阅读Mozilla Developer Site上的nsIBrowserSearchService页面,该页面建议使用Services.search对象的init()方法。

void init([optional] in nsIBrowserSearchInitObserver observer);

我试过了,我设法让它在启动时执行一次,但是当我添加或删除或重新排序搜索引擎时,它再也没有调用它。所以我做错了什么。

我有观察员的经验,但只使用一般偏好,我通常使用添加它们并使用下面的代码删除它们。我不确定如何使用nsIBrowserSearchService。我想以相同或类似的方式观察nsIBrowserSearchService,但我不确定我会为此做些什么

branch = Services.prefs.getBranch("preferenceNameHere");

我没有观察到Services.prefs,而是Services.search我认为,据我所知,它没有getBranch方法。

这就是我通常在Chrome.js中添加和删除观察者的方式

const {Ci, Cu} = require("chrome");
const {Services} = Cu.import("resource://gre/modules/Services.jsm", {});

branch = Services.prefs.getBranch("preferenceNameHere");
branch.addObserver("", observe, false);

function observe(subject, topic, data) {
// instanceof actually also "casts" subject
    if (!(subject instanceof Ci.nsIPrefBranch)) {
        return;
    }
    //do stuff here
};

exports.onUnload = function(reason) {
    // Need to remove our observer again! This isn't automatic and will leak
    // otherwise.

    branch.removeObserver("", observe);
    if(reason == "disable" || reason == "uninstall"){
        //restore changes made by addon
   }
};

任何人都可以告诉我如何执行此操作,以便我可以观察更改并确保使用搜索对象正确删除观察者。感谢

1 个答案:

答案 0 :(得分:2)

你在上面尝试的是尝试在非prefs上使用pref观察者,这是不可能的。你必须使用像这样的常规观察者服务。

当用户更改引擎时,会通知您。

Cu.import('resource://gre/modules/Services.jsm'); 

var observers = {
    'browser-search-engine-modified': {
        aTopic: 'browser-search-engine-modified',
        observe: function (aSubject, aTopic, aData) {
            if (aData == 'engine-current') {
                console.log('current engine was changed!');
                //console.log('aSubject on change:', aSubject.name, 'same as Services.search.currentEngine.name:', Services.search.currentEngine.name); //aSubject is the engine
                //console.log('aTopic on change:', aTopic); //aTopic is obviously `browser-search-engine-modified`
            }
        },
        reg: function () {
            Services.obs.addObserver(observers[this.aTopic], this.aTopic, false);
        },
        unreg: function () {
            Services.obs.removeObserver(observers[this.aTopic], this.aTopic);
        }
    }
};

要开始聆听,请执行以下操作:

for (var o in observers) {
    observers[o].reg();
}

要停止聆听,请执行以下操作:

for (var o in observers) {
    observers[o].unreg();
}

我不确定当用户添加新引擎但是选择它时会发生什么。或者如果他移除引擎。当用户这样做时,请告诉我这些消息是什么。