自定义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文件,并显示其中的图片了。如下图:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章