2

私は Firefox 拡張機能を作成しており、'moz-icon' (例: moz-icon://.img?size=16) URI のコンテンツを読み取る必要があります。

私は次のコードを持っています:

const Cc = Components.classes; 
const Ci = Components.interfaces; 

var iOService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); 

var mozUri = iOService.newURI('moz-icon://.img?size=16', null, null); 
var channel = iOService.newChannelFromURI(mozUri); 
var inputStream = channel.open(), 
binaryInputStream =
    Cc["@mozilla.org/binaryinputstream;1"].createInstance(Ci["nsIBinaryInputStream"]); 

binaryInputStream.setInputStream(inputStream); 

var data = []; 
try { 
    while ((avail = binaryInputStream.available()) > 0) 
        data = data.concat(binaryInputStream.readByteArray(avail)); 
    binaryInputStream.close(); inputStream.close(); 
} catch(e) { 
} 

Windows と Mac では動作しますが、Linux (Ubuntu 12.0 32 ビット) では動作しません。newChannelFromURI を作成しようとすると失敗します (実装されていないと言います)。

moz-icon URI からチャネルを作成する以外に、moz-icon URI の内容を読み取る方法はありますか?

(私は Mozillazine に同じ質問を投稿しました。そこで回答が得られたら、このスレッドを更新します。その逆も同様です)。

4

2 に答える 2

1

newChannelFromURI()がスローできないことは確かです。NS_ERROR_NOT_IMPLEMENTEDこのエラーは、 を呼び出そうとしたときにスローされる可能性が最も高いですchannel.open()。その理由は、すべてのチャネルが同期読み取りをサポートしているわけではなく、同期読み取りも一般的に推奨されていないためです。また、以下を使用してバイナリ データを取得するXMLHttpRequest方が簡単です。

var request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
                .createInstance(Ci.nsIXMLHttpRequest);
request.open("GET", "moz-icon://.img?size=16", true);
request.responseType = "arraybuffer";

request.addEventListener("load", function(event)
{
  var arrayBuffer = request.response;
  if (arrayBuffer) {
    var data = String.fromCharCode.apply(null, new Uint8Array(arrayBuffer));
    // Do something with the data here
  }
}, false);

request.send(null);
于 2012-10-14T12:48:15.180 に答える
0

関連性について推測するだけですが、オブジェクトがマウスイベントである「for prop in object」を実行すると、 NS_ERROR_NOT_IMPLEMENTED が発生します。「for/in」によって生成される存在しないプロパティ「end」および「windowHref」の「object[prop]」式でエラーが発生します。

于 2018-12-02T03:17:21.187 に答える