从扩展中读取moz-icon内容

时间:2012-10-13 01:08:10

标签: javascript firefox-addon

我正在编写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上发布了同样的问题,如果我在那里得到答案,我会更新这个帖子,反之亦然)。

2 个答案:

答案 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]”表达式中会引发错误。