前面對實現新的protocol進行了研究,本文描述一下在實現protocolhandler時遇到的newChannel方法的實現。研究得不是很透徹,希望有人能與我進行交流。
前面研究得到的結論是newURI方法中返回一個nsIURI類型的uri。這個uri的protocol如果不是firefox可以直接處理的protocol,而是我們實現的protocol,那麼就會調用我們實現的protocol中的newChannel進行處理。經研究發現,newChannel的參數aURI就是前面newURI返回的uri。newChannel可以很簡單的僅僅產生一個channel也可以在裏面實現很複雜的數據處理,然後將處理完的數據返回,並創建一個firefox可以處理的channel。例如,我實現了一個protocol其名稱爲rm。編寫了一個html文件(1.htm),內容如下:
<!doctype html>
<html>
<body>
<img src="rm:///1_files/01.gif">
</body>
</html>
我將這個文件放到C:\HTML\1目錄下,而01.gif文件則在C:\HTML\1\1_files文件夾裏面,顯然這個htm文件用一般的瀏覽器是無法正常顯示我這個圖片的。我在newURI中我返回的uri是rm:///C:/HTML/1/1_files/01.gif。代碼如下: newURI:function(aSpec, aOriginCharset,aBaseURI){
var ioService = Cc["@mozilla.org/network/io-service;1"]
.getService(Ci.nsIIOService);
var base = aBaseURI.path;
base = base.substring(1 , base.lastIndexOf('/') + 1);
var spec = aSpec.substring( schlen+4 );//去掉":///"故+4
spec = mScheme+":///"+base + spec;
var uri = Cc["@mozilla.org/network/simple-uri;1"].createInstance(Ci.nsIURI);
uri.spec=spec;
// rm:///C:/HTML/1/1_files/01.gif
return uri;
},
然後在newChannel中的代碼是:
newChannel:function(aURI){
let ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
var uri = aURI.spec.replace("rm","file");
let channel = ios.newChannel(uri, null, null);
return channel;
}
就這樣簡單的實現了這個newChannel。然後用安裝了該協議的firefox就可以正常的打開我創建的htm文件,並顯示其中的圖片了。如下圖: