如何为 nsIBrowserSearchService 添加观察器
How to add observer for nsIBrowserSearchService
我在添加观察者来监视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();
}
我不确定当用户添加新引擎但不选择它时会发生什么。或者如果他移除了引擎。当用户这样做时,请让我知道这些消息是什么。
相关文章:
- 如何观察在 Sails .js 中添加到模型中的新记录
- 动态地向可观察数组中的特定项添加绑定(例如hasfocus)
- 如何在运行时向计算可观察量添加其他数组项
- 使用挖空 JS 映射选项将可观察属性添加到映射的可观察数组
- 突变观察者 - 未检测到添加的某些节点
- Knockout.js:将元素添加到可观察数组
- 观察通过 chrome devtools 添加/删除节点时的 DOM 突变
- 挖空 - 添加了可观察的不更新新对象
- 如何观察数组更改并查看添加了哪个新元素
- 单击添加图像,并可观察到挖空
- 挖空添加计算中断可观察数组
- 将通过原型计算的可观察对象添加到构造函数中
- 如何为 nsIBrowserSearchService 添加观察器
- 如何将计算可观察量添加到 KNOCKOUTJS 映射中
- 如何将操作函数添加到从可观察量订阅返回的一次性
- 将新对象添加到挖空可观察数组
- 在knockout.js中为可观察对象添加属性后为什么出现TypeError
- 浏览器中的观察者模式javascript:订阅事件"添加了Dom元素“;并处理这个元素
- KnockoutJS-将计算值添加到可观察数组中
- 我可以观察添加到一个数组与rx.js