2012-10-13 20 views
1

我正在編寫Firefox擴展,需要閱讀'moz-icon'(例如moz-icon://.img?size=16)URI的內容。從擴展中讀取moz圖標內容

我有下面的代碼:

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上發佈了相同的問題,如果我在那裏得到答案,我會更新此線程,反之亦然)。

回答

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); 
+0

感謝您的回答,不幸的是,我得到以下錯誤(試圖幾乎逐字運行它):「組件不可用」 nsresult:「0x80040111(NS_ERROR_NOT_AVAILABLE)」。 您上面給出的代碼是否適合您? –

+0

@SunilAgrawal:呵呵,你爲什麼不引用你的消息中的錯誤信息? 'NS_ERROR_NOT_AVAILABLE'表示圖標查找失敗 - Firefox不知道要顯示什麼圖標,無法爲您下載。 –

+0

我嘗試了下面的moz-icon:'moz-icon:// stock/gtk-dialog-warning?size = dialog',並在Firefox中(通過放置地址欄)測試它確實存在。 對於我的生活無法弄清楚我做錯了什麼,現在我的onload根本不會被調用。在我的最後肯定有一些問題,但不知道是什麼。我必須將新XMLHttpRequest更改爲'Components.classes ['@ mozilla.org/xmlextras/xmlhttprequest;1'].createInstance(Components.interfaces.nsIXMLHttpRequest);'如果這有任何關聯。 –