0

このブログhttp://blog.mozilla.org/nfroyd/2012/01/26/compressing-strings-in-js/からは可能であるように思われますが、実装に問題があります(基本的にはそのまま)。

私のコードは

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である必要があります。

これらの変更により、エラーがスローされなくなりましたが、空の文字列も返されるため、何も起きていないようです。:(

4

1 に答える 1

1

私はそれを修正したと思います(espnのような大規模なサイトを含む、私の基本的なテストで動作するようです)

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;
};
于 2012-08-19T03:59:51.690 に答える