【问题标题】:How can I compile this extension for firefox?如何为 Firefox 编译这个扩展?
【发布时间】:2012-08-31 16:24:21
【问题描述】:

如何将它编译成 Firefox 插件?我曾尝试使用位于https://builder.addons.mozilla.org 的firefox 插件构建器,但是当我单击测试时,它显示“XPI 未构建”。谁能告诉我如何将这段代码变成一个函数 firefox 扩展?谢谢你。

//create an nsIObserver implementor
  var listener = {
observe : function(aSubject, aTopic, aData) {
      var httpChannel = aSubject.QueryInterface(Components.interfaces.nsIHttpChannel);


      if (aTopic == "http-on-modify-request") {

        var channel= aSubject.QueryInterface(Components.interfaces.nsIHttpChannel);

        if(channel.requestMethod == "POST")
        {

            channel=channel.QueryInterface(Components.interfaces.nsIUploadChannel);  
            channel = channel.uploadStream;  
            channel.QueryInterface(Components.interfaces.nsISeekableStream)
                            .seek(Components.interfaces.nsISeekableStream.NS_SEEK_SET,    0);  
            var stream = Components.classes["@mozilla.org/binaryinputstream;1"]
                                .createInstance(Components.interfaces.nsIBinaryInputStream);  
            stream.setInputStream(channel);  
            var postBytes = stream.readByteArray(stream.available());  
            poststr = String.fromCharCode.apply(null, postBytes);  

            //change the poststr

            // poststr=poststr.replace(....);  

            // ERROR HERE - stringStream is not defined
            stringStream.setData(poststr, poststr.length);  
            //changing the postdata  
            channel = channel.QueryInterface(Components.interfaces.nsIUploadChannel);  
            channel = channel.uploadStream;  
            channel = channel.QueryInterface(Components.interfaces.nsISeekableStream)
                      .seek(Components.interfaces.nsISeekableStream.NS_SEEK_SET, 0);  
                channel.uploadStream.QueryInterface(Components.interfaces.nsIMIMEInputStream);  
            channel.uploadStream.setData(stringStream);  
            channel.requestMethod = "POST";

        }

      }

},

QueryInterface : function(aIID) {
   if (aIID.equals(Components.interfaces.nsISupports) ||
        aIID.equals(Components.interfaces.nsIObserver))
     return this;
   throw Components.results.NS_NOINTERFACE;
}
 };

 var observerService = null;

var Init = {
addObserver : function(){
  observerService = Components.classes["@mozilla.org/observer-    service;1"].getService(Components.interfaces.nsIObserverService);
  observerService.addObserver(listener, "http-on-modify-request", false);
},

removeObserver : function(){
  observerService.removeObserver(listener, "http-on-modify-request");
}
};

Init.addObserver();
  • 编辑:我已经阅读了官方的 Firefox 文档,但它令人困惑,它主要处理基于 gui 的插件,并且没有提供太多示例如何为此创建扩展。

【问题讨论】:

    标签: firefox build firefox-addon firefox-addon-sdk


    【解决方案1】:

    您的示例适用于经典(基于 XUL)扩展,而不适用于附加 SDK。您仍然可以使用low-level observer-service API 添加该观察者。此外,基于 SDK 的扩展通常无法访问 Components 对象,它需要 chrome authority。将以下代码添加到您的 main.js 文件中:

    var observer = require("observer-service");
    var {Cc, Ci} = require("chrome");
    
    observer.add("http-on-modify-request", function(subject, data)
    {
      var channel= subject.QueryInterface(Ci.nsIHttpChannel);
    
      if (channel.requestMethod == "POST")
      {
        channel = channel.QueryInterface(Ci.nsIUploadChannel);  
        channel = channel.uploadStream;
        channel.QueryInterface(Ci.nsISeekableStream)
               .seek(Ci.nsISeekableStream.NS_SEEK_SET, 0);
        var stream = Cc["@mozilla.org/binaryinputstream;1"]
                       .createInstance(Ci.nsIBinaryInputStream);  
        stream.setInputStream(channel);  
        var postBytes = stream.readByteArray(stream.available());  
        poststr = String.fromCharCode.apply(null, postBytes);  
    
        //change the poststr
    
        // poststr=poststr.replace(....);  
    
        // ERROR HERE - stringStream is not defined
        stringStream.setData(poststr, poststr.length);  
        //changing the postdata  
        channel = channel.QueryInterface(Ci.nsIUploadChannel);  
        channel = channel.uploadStream;  
        channel.QueryInterface(Ci.nsISeekableStream)
               .seek(Ci.nsISeekableStream.NS_SEEK_SET, 0);  
        channel.uploadStream.QueryInterface(Ci.nsIMIMEInputStream);  
        channel.uploadStream.setData(stringStream);  
        channel.requestMethod = "POST";
      }
    });
    

    请注意,我只是在您提供的代码中将 Components.classes 替换为 CcComponents.interfaces 替换为 Ci - 我不确定这段代码应该做什么,但我很确定它不会没用。

    【讨论】:

    • 非常感谢,这帮助我理解了一些事情,所以我现在可以改进我想做的事情,而不必担心构建它。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2017-03-21
    • 1970-01-01
    相关资源
    最近更新 更多