如何在Firefox-Extension中观察指定的Firefox事件?

时间:2011-03-03 16:01:33

标签: firefox firefox-addon

我想等待Firefox-Browser-Events(sessionstore-windows-restoreduser-interaction-inactive,..)以清除历史记录。我的扩展程序现在可以清除快捷方式的历史记录,但我不知道如何监听此类事件。我已经在observer notification有一个情绪,但我尝试的任何东西似乎都没有用。

到目前为止我的扩展程序代码在这里:

   (function() {

    (window.myObj =
    {
        myObserver : function()
        {
          this.register();
        },

        init : function()
        {
            try {

                myObserver.prototype = {
                    observe: function(subject, topic, data){

                        switch (topic) {
                          case 'sessionstore-windows-restored':
                            Firebug.Console.log('sessionstore-windows-restored observed');
                            myObj.clearHistory();
                            break;
                          case 'user-interaction-inactive':
                            Firebug.Console.log('user-interaction-inactive');
                            break;
                          case 'user-interaction-active':
                            Firebug.Console.log('user-interaction-active');
                            break;
                        }

                        Firebug.Console.log('HUI :' + subject + ','+topic+','+data);
                    },
                    register: function(){
                        var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
                        observerService.addObserver(this, "readyToClearHistory", false);
                    },
                    unregister: function(){
                        var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
                        observerService.removeObserver(this, "readyToClearHistory");
                    }
                }
            }
            catch (e) {
                Firebug.Console.log('MIST :' + e);
            }

            observer = new myObserver();
         },
         clearHistory : function(){
            var globalHistory = Components.classes["@mozilla.org/browser/global-history;2"].getService(Components.interfaces.nsIBrowserHistory);
            var now = Date.now();

            // clear one hour
            globalHistory.removeVisitsByTimeframe(now - 3600, now);

            try {
                var os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
                os.notifyObservers(null, "browser:purge-session-history", "");
            } 
            catch (e) {

                // Clear last URL of the Open Web Location dialog
                var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch2);
                try {
                    prefs.clearUserPref("general.open_location.last_url");
                } 
                catch (e) {
                }
            }
              } 
  }
}

一些示例代码会很好。我需要解决这个问题?

1 个答案:

答案 0 :(得分:7)

我发现代码中特定于nsIObserver的部分没有任何问题,这意味着您的问题很可能出现在其他地方。这个完整的例子有效:

var ObserverTest = {

    register: function() {
        var observerService = Components.classes["@mozilla.org/observer-service;1"]
            .getService(Components.interfaces.nsIObserverService);
        observerService.addObserver(ObserverTest, "user-interaction-active", false);
    },

    observe: function(subject, topic, data) {
        switch (topic) {
            case 'sessionstore-windows-restored':
                // do stuff
                break;
            case 'user-interaction-inactive':
                // do stuff
                break;
            case 'user-interaction-active':
                // every 5 seconds and immediately when user becomes active
                alert("active"); 
                break;
        }
    },

    unregister: function() {
        var observerService = Components.classes["@mozilla.org/observer-service;1"]
            .getService(Components.interfaces.nsIObserverService);
        observerService.removeObserver(ObserverTest, "user-interaction-active");
    }
}

window.addEventListener("load", ObserverTest.register, false);
window.addEventListener("unload", ObserverTest.unregister, false);

总的来说,我发现在第一次尝试使用不熟悉的组件时,从非常简单的事情开始是很有帮助的,就像我上面所做的那样,这样我就可以将它与特定于应用程序的代码隔离开来并验证我正确使用它。在我知道它正在工作之前,我不会把它拉进更大的应用程序。

相关问题