-3

この質問は、 IE に関するこの StackOverflow の質問を Opera 12 ブラウザーに拡張したものです。

根本的な問題は、kmz (圧縮された kml) ファイルを処理する geoxml3の問題です。

Opera 12 で失敗する例

バイナリ データは、変更されたバージョンの ZipFile.complete.js でTypedArrays を使用して処理されています。

バイナリ ファイルが転送された後、Uint8Array は Opera 12 で正しく設定されず、あたかもデータが 16 ビット要素としてインポートされているかのようになります。

リクエストは次のように構成されます。

this.req.responseType = 'arraybuffer';
this.req.overrideMimeType('text/plain; charset=x-user-defined');

返される値は次のように処理されます。

var fileContents = binStream.req.response;
binStream.length = fileContents.byteLength;
binStream.array = new Uint8Array(fileContents);

最初の 8 バイトは、Opera 12 では次のように入力されます。

0x004B0050; 4915280 の 10 進値を与える

ただし、次のようにする必要があります。

0x4034B50; 67324752 の 10 進数値。

これは、Firefox、Chrome、および IE で正しく機能します (回避策あり)。

Uint8Array を正しく設定するように Opera 12 を説得する方法を知っている人はいますか? または、それが機能するようにするための回避策(16ビットバイトの配列を8ビットバイトの配列に変換し、不要な上位8ビットをできるだけ効率的に破棄する方法)?これは Opera 12 の TypedArray/XmlHttpRequest の最近の実装における既知のバグですか?

4

2 に答える 2

8

Opera 12.00 ではresponseType;のサポートが導入されました。残念ながら、MIME タイプを指定すると、ファイルが 16 ビット ワードになってしまうというバグがありtext/*ます。12.01 で修正されましたが、最も簡単な修正はオーバーライド タイプを に設定することapplication/octet-streamです。(これは、閉じられたバグトラッカーをストーカーしたい人のための CORE-46938 です。)

于 2012-07-04T04:34:52.593 に答える
2

この「パッチ」は次のように機能します。

var fileContents = binStream.req.response;
binStream.length = fileContents.byteLength;
binStream.array = new Uint8Array(fileContents);

/* patch for Opera */
if (/opera/i.test(navigator.userAgent) && 
    // make sure it is still broken,
    // the first 4 bytes will contain the zip file signature
    // for the geoxml3 use case (so bytes 1 & 3 will not be 0)
    (binStream.array[1] == 0) && (binStream.array[3] == 0))
{    
    fixedArray = new Uint8Array(binStream.length/2);
    for (var i=0; i<binStream.length; i+=2) {
        fixedArray[i/2]=binStream.array[i];
    }
    binStream.array = fixedArray;
    binStream.length = binStream.length/2;
}
/* end patch for Opera */

これを行うより効率的な方法はありますか?ブラウザ固有のテストを行わずにそれを行う方法を知っている人はいますか?

編集:動作がまだ壊れていることを確認するためのチェックを追加しました(バグであり、修正された場合)。一般的なケースでは機能しない可能性がありますが、geoxml3 のユース ケースでは、最初の 4 バイトに zip ファイルの署名が含まれます。正しく機能する場合、上位バイトに 0 は含まれません。

于 2012-07-01T21:20:21.470 に答える