1

我正在尝试使用代码

// This is an active module of the goelvivek (8) Add-on
exports.main = function() {
  var httpRequestObserver =  
  {  
    observe: function(subject, topic, data)   
    { 
      if (topic == "http-on-examine-response") {  
        if(console)
          console.log(data);
      }  
    }  
  }; 
  var {Cc, Ci, Cr} = require("chrome");
  var observer = require("observer-service");   
  observerService = Components.classes["@mozilla.org/observer-service;1"].  
    getService(Components.interfaces.nsIObserverService);  
    observerService.addObserver(httpRequestObserver, "http-on-examine-response", false);
};

但是行console.log(data);没有在控制台日志中打印任何东西。为什么 ?

4

2 回答 2

4

除了 Nickolay 指出的问题之外,观察者还需要实现一个QueryInterface()函数(通常通过XPCOMUtils.generateQI())。以下是使用附加 SDK 的方法:

var {Cc, Ci, Cr, Cu} = require("chrome");
var {XPCOMUtils} = Cu.import("resource://gre/modules/XPCOMUtils.jsm");
var httpRequestObserver =
{
  QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
  ...
};

但是,由于您已经需要observer-servicepackage,因此使用它会更容易:

var observer = require("observer-service");
observer.add("http-on-examine-response", onHttpRequest);

function onHttpRequest(subject, data)
{
  ...
}

这种方法的缺点是它observer-service是一个内部包,它的 API 可能会在未来的附加 SDK 版本中发生变化。

于 2011-10-19T07:17:43.820 回答
0

这是真正的片段吗?您应该Components会在错误控制台中看到有关未定义的错误。从 中获取require('chrome')或使用对象require("observer-service")

于 2011-10-18T23:20:42.850 回答