我无法添加观察者来观察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
}
};
任何人都可以告诉我如何执行此操作,以便我可以观察更改并确保使用搜索对象正确删除观察者。感谢
答案 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();
}
我不确定当用户添加新引擎但是选择它时会发生什么。或者如果他移除引擎。当用户这样做时,请告诉我这些消息是什么。