我尝试使用观察者已经有一段时间了,但似乎我无法让他们工作。我将观察函数放在扩展的不同模块中,以及代码的不同部分中。从任何地方注册它,但似乎我尝试的每一种方式,只是一个死了。我不能让它起作用。我的目标是监听用户何时退出Firefox,这样我就可以清除我的评论中的首选项对象。到目前为止,我的观察者在bootstrap.js中,我就是这样实现它的。我以这种方式实现了我的观察功能,因为在this堆栈溢出帖子中提到,这是为退出应用程序通知进行观察的正确方式。在另一个注释中,注册的观察者会在控制台日志中打印,但是“哦观察”不会。
function myObserver()
{
this.register();
}
myObserver.prototype = {
observe: function(subject, topic, data) {
console.log("oh observing!!");
if (topic == "app-startup" || topic == "profile-after-change") {
var observerService = Components.classes["@mozilla.org/observer-service;1"]
.getService(Components.interfaces.nsIObserverService);
observerService.addObserver(this, "quit-application", false);
}
else if (topic == "quit-application-requested" || topic == "quit-application")
{
console.log("browser closing");
alert('hello');
myextension.Utils.prefService.clearUserPref("questionType");
myextension.Utils.prefService.clearUserPref("clickThrough");
this.unregister();
}
},
register: function() {
var observerService = Components.classes["@mozilla.org/observer-service;1"]
.getService(Components.interfaces.nsIObserverService);
observerService.addObserver(this, "quit-application-requested",false);
observerService.addObserver(this, "quit-application",false);
observerService.addObserver(this, "app-startup", false);
observerService.addObserver(this, "profile-after-change", false);
console.log("observers registered");
},
unregister: function() {
var observerService = Components.classes["@mozilla.org/observer-service;1"]
.getService(Components.interfaces.nsIObserverService);
observerService.removeObserver(this, "quit-application-requested");
console.log("unregistering obs");
}
}这是我的启动功能:
function startup(data, reason) {
Components.utils.import("chrome://ext/content/commons.jsm");
let wm = Cc["@mozilla.org/appshell/window-mediator;1"].
getService(Ci.nsIWindowMediator);
let windows = wm.getEnumerator("navigator:browser");
while (windows.hasMoreElements()) {
let domWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow);
WindowListener.setupBrowserUI(domWindow);
}
// Wait for any new browser windows to open
wm.addListener(WindowListener);
}这是我的setupBrowserUI函数,我在其中注册了观察者:
setupBrowserUI: function(domWindow) {
extension.onLoad(domWindow.gBrowser);
observer = new myObserver();
}发布于 2015-04-07 03:32:35
简单的方法:
let observer = {
observe: function() {
dump("oh observing")
}
};
function startup(data, reason)
{
Services.obs.addObserver(observer, "*", false);
observer.observe();
}我的建议是创建带有首选项的日志文件;要将转储调用输出到文件,将browser.dom.window.dump.file设置为应该创建日志的文件目的地,并重新启动应用程序。
https://stackoverflow.com/questions/29467362
复制相似问题