Javascript 在firefox扩展中压缩字符串

Javascript 在firefox扩展中压缩字符串,javascript,firefox-addon,Javascript,Firefox Addon,从这个博客上看,这似乎是可能的,但我在实现上遇到了困难(基本上就是这样) 我的代码是 function Accumulator() { this.buffer = ""; }; Accumulator.prototype = { buffer: null, onStartRequest: function(request, context) {}, onStopRequest: function(request, context, statusCode) {},

从这个博客上看,这似乎是可能的,但我在实现上遇到了困难(基本上就是这样)

我的代码是

function Accumulator() {
    this.buffer = "";
};

Accumulator.prototype = {
    buffer: null,
    onStartRequest: function(request, context) {},
    onStopRequest: function(request, context, statusCode) {},
    onDataAvailable: function(request, context, inputStream, offset, count) {
        var stream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream);
        stream.setInputStream(inputStream);
        var input = stream.readByteArray(count);
        this.buffer += String.fromCharCode.apply(input);
    }
};

function compress(string) {
    var accumulator = new Accumulator();
    var converter = Components.classes["@mozilla.org/streamconv;1?from=uncompressed&to=gzip"].createInstance(Components.interfaces.nsIStreamConverter);
    // More respecifying input/output types.
    converter.asyncConvertData("uncompressed", "gzip", accumulator, null);
    // Oh, that method doesn't actually convert anything, it just prepares
    // the instance for doing conversion.
    var stream = Components.classes["@mozilla.org/io/string-input-stream;1"].createInstance(Components.interfaces.nsIStringInputStream);
    stream.data = string;
    converter.onStartRequest(null, null);
    converter.onDataAvailable(null, null, stream, 0, string.length);
    converter.onStopRequest(null, null, 201 /* 417 */);
    return accumulator.buffer;
};
但是当我使用它时,我得到一个错误,converter.onRequestStart不是一个函数

想知道我是不是做错了什么

编辑:

1) 修正一些明显的错误。我最初没有捕捉到的Ci是Components.interfaces

2) 原始代码似乎有onRequestStart/Stop向后,它们应该是onStartRequest/onStopRequest

通过这些更改,不再抛出任何错误,但也会返回一个空字符串,因此似乎什么也没有发生(

我想我已经修好了(似乎可以使用我的基本测试,包括像espn这样的大型网站)


谢谢,非常好的解决方案…你能提供一个等价的uncompress()函数吗?
function Accumulator() {
    this.buffer = "";
};

Accumulator.prototype = {
    buffer: null,
    onStartRequest: function(request, context) {},
    onStopRequest: function(request, context, statusCode) {},
    onDataAvailable: function(request, context, inputStream, offset, count) {
        var stream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream);
        stream.setInputStream(inputStream);
        var input = stream.readByteArray(count);

        this.buffer += String.fromCharCode.apply(null, input);
    }
};

function compress(string) {
    var accumulator = new Accumulator();
    var converter = Components.classes["@mozilla.org/streamconv;1?from=uncompressed&to=gzip"].createInstance(Components.interfaces.nsIStreamConverter);
    // More respecifying input/output types.
    converter.asyncConvertData("uncompressed", "gzip", accumulator, null);
    // Oh, that method doesn't actually convert anything, it just prepares
    // the instance for doing conversion.
    var stream = Components.classes["@mozilla.org/io/string-input-stream;1"].createInstance(Components.interfaces.nsIStringInputStream);
    stream.data = string;
    converter.onStartRequest(null, null);
    converter.onDataAvailable(null, null, stream, 0, string.length);
    converter.onStopRequest(null, null, 201 /* 417 */);
    return accumulator.buffer;
};