2015-04-06 3 views
1

Я пытался использовать наблюдателей какое-то время, но похоже, что я не могу заставить их работать. Я поместил функцию наблюдения в разные модули моего расширения, а также различные части моего кода. Регистрировать его повсюду, но кажется, что каждый способ, который я пробовал, был просто заглушен. Я не могу заставить его работать. Моя цель - слушать, когда пользователь выходит из Firefox, поэтому я могу очистить объекты настроек моего аддона. На данный момент мой наблюдатель находится в bootstrap.js, и именно так я его реализовал. Я реализовал функцию наблюдения таким образом, потому что в статье this stackoverflow указано, что это правильный способ наблюдения за уведомлением о выходе из приложения. На боковой ноте наблюдатели, зарегистрированные в печатном виде, печатаются в консольном журнале, но «oh observing» этого не делает.firefox addon: наблюдатель не работает

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(); 
    } 

ответ

2

Самый простой способ:

https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Services.jsm

let observer = { 
    observe: function() { 
     dump("oh observing") 
    } 
}; 

function startup(data, reason) 
{ 
    Services.obs.addObserver(observer, "*", false); 
    observer.observe(); 
} 

Предлагаю создать файл журнала с настройками; вместо этого вывести вызовы дампа в файл, установите browser.dom.window.dump.file в место назначения файла, где должен быть создан журнал и перезапустить приложение.

https://developer.mozilla.org/en-US/docs/Mozilla/Preferences/Preference_reference/browser.dom.window.dump.file

Смежные вопросы