如何为 nsIBrowserSearchService 添加观察器

How to add observer for nsIBrowserSearchService

本文关键字:观察 添加 nsIBrowserSearchService      更新时间:2023-09-26

我在添加观察者来监视Firefox搜索引擎的变化时遇到了麻烦。我阅读了Mozilla开发人员网站上的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
   }
};

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

您上面尝试的是尝试在非首选项上使用 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();
}

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