我正在编写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上发布了同样的问题,如果我在那里得到答案,我会更新这个帖子,反之亦然)。
答案 0 :(得分:1)
我非常确定newChannelFromURI()
无法抛出NS_ERROR_NOT_IMPLEMENTED
- 当您尝试呼叫channel.open()
时,很可能会抛出此错误。原因是并非所有通道都支持同步读取和同步读取通常也是不鼓励的。此外,get binary data using 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);
答案 1 :(得分:0)
只是相关性的猜测,但是当我执行“针对对象中的道具”(其中对象是鼠标事件)时,对我提出了NS_ERROR_NOT_IMPLEMENTED。对于由“ for / in”生成的不存在的属性“ end”和“ windowHref”,在“ object [prop]”表达式中会引发错误。