自定義protocol之newChannel

前面對實現新的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文件,並顯示其中的圖片了。如下圖:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章