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 的内容吗?

(我在 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 回答