在Mozilla中使用XPCom组件

ZDNet软件频道 时间:2004-04-05 作者:Builder.com |  我要评论()
本文关键词:
很多浏览器靠Java applet增加其功能,基于Mozilla的浏览器现在可以通过使用跨平台组件对象模块组件添加它们自己的功能。
本文译自Builder.com,未经许可请勿转载

IE支持初始化和执行ActiveX组件脚本来提供额外的功能;很多其它浏览器靠Java applet增加其功能,基于Mozilla的浏览器现在可以通过使用跨平台组件对象模块(Cross Platform Component Object Module,XPCOM)组件添加它们自己的功能。

XPCOM是一个框架,它允许对项目进行模块化设计,将整个开发划分为多个组件。组件然后在运行时期重新装配,创建出组件的克隆共同创建一个应用程序。

XPCOM有点像微软的COM,但是它们的实现有点不同。微软的COM组件是注册在系统注册表中的,而XPCOM组件是通过Mozilla自己的注册表注册的。这个信息存在于两个文件中:comreg.dat和xpti.dat。在comreg.dat中你会发现很多信息。

你没有必要知道XPCOM技术的所有复杂的细节就能够获益于XPCOM。感谢XPCOM,你可以在JavaScript中使用XPCOM组件,并且还可以在JavaScript中开发XPCOM组件。这样就向需要快速解决方案但又不想用C或者C++编写本地XPCOM组件的开发人员打开了创建XPCOM组件的大门。

nsDictionary对象

Mozilla已经发行了能够使用JavaScript编写XPCOM组件的版本。里面其中一个是nsDictionary对象,它重新组装了IE中的ActiveX组件Scripting.Dictionary。它暴露了下面的方法:hasKey()、getKeys()、getValue()、setValue()、deleteValue()、and clear()。

  • hasKey()接受收一个字符串参数,返回一个Boolean值表示一个键是否存在。
  • getKeys()没有参数,返回键名的一个数组。
  • getValue()接受一个字符串参数,返回基于所传入的键的一个ISupports对象。
  • setValue()接受两个参数,key(string)和value(ISupports),创建一个key-value对。
  • deleteValue()接受一个字符串参数(key),从nsDictionary组件中删除一个key-value对。
  • clear()不带参数,清除nsDictionary组件的内容。

下面是实际使用nsDictionary的例子:

<html>
<head>
<script language="JavaScript">
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var oDict = Components.classes['@mozilla.org/dictionary;1'].
            createInstance(Components.interfaces.nsIDictionary);
function btnSetValue_onclick() {
    netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
    try {
        var key = document.thisForm.txtKey.value;
        var cString = Components.classes['@mozilla.org/supports-cstring;1'].
                        createInstance(Components.interfaces.nsISupportsCString);
        cString.data = document.thisForm.txtValue.value;
        oDict.setValue(key, cString);
    } catch(e) {
        alert(e);
    }
}
function btnGetValue_onclick() {
    netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
    try {
        var iSupports = oDict.getValue(document.thisForm.txtKey.value);
        var cString =
iSupports.QueryInterface(Components.interfaces.nsISupportsCString);
        document.thisForm.txtValue.value = cString.data;
    } catch(e) {
        alert(e);
    }
}
function btnDelValue_onclick() {
    netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
    try {
        oDict.deleteValue(document.thisForm.txtKey.value);
    } catch(e) {
        alert(e);
    }
}
function btnGetKeys_onclick() {
    netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
    try {
        var i = {};
        var keys = oDict.getKeys(i).join(",");
        alert("Keys: {" + keys + "} Length: " + i.value);
    } catch(e) {
        alert(e);
    }
}
function btnClearAll_onclick() {
    netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
    try {
        oDict.clear();
    } catch(e) {
        alert(e);
    }
}
</script>
</head>
<body>
This is a test.
<form name="thisForm" id="thisForm">
Key: <input type="text" name="txtKey" id="txtKey" size=10><br>
Value: <input type="text" name="txtValue" id="txtValue" size=25><br>
<input type="button" value="Set Value" name="btnSetValue"
onclick="btnSetValue_onclick()">&nbsp;
<input type="button" value="Get Value" name="btnGetValue"
 onclick="btnGetValue_onclick()">&nbsp;
<input type="button" value="Delete Value" name="btnDelValue"
 onclick="btnDelValue_onclick()">&nbsp;
<input type="button" value="Get Keys" name="btnGetKeys"
 onclick="btnGetKeys_onclick()">&nbsp;
<input type="button" value="Clear All" name="btnClearAll"
 onclick="btnClearAll_onclick()"><br>
</form>
</body>
</html>

 

这段代码看起来有点怪,尤其是如果你习惯于微软的代码,但是事实不是那样不可能。其实只是包含两个类型为“text”的<INPUT>标记的一个简单HTML页面。有五个按钮显示nsDictionary对象不同的任务。用户在txtKey文本框中输入一个值,然后txtValue文本框中的值就会创建一个key-value对。用户还能够在txtKey文本框中输入一个键名,然后提取存储在那个键中的值。

当页面进入时,脚本会通过Privilege Manager询问使用XPConnect的权限。然后它使用内嵌的Components.classes集合在注册表中查询“@mozilla.org/dictionary”Contract ID返回ISupports接口,从而设置oDict变量指向nsDictionary。相反,ISupports接口多多少少是用来返回IDictionary接口的。

当用户按下Set Value按钮时,将会向Privilege Manager查询使用XPConnect的权限。(Privilege Mnager在每个方法调用中使用。)nsDictionary对象的setValue()方法带有两个参数:key(一个字符串值)和value(一个ISupport对象)。所有组件都实现了ISupports接口。有一组用于指定数据类型数据的基于ISupports的组件。有一个特殊的接口nsISupportsCString允许一个组件以一种通用类型存储和传递字符串数据。ISupportsXXX类型的集合暴露一个叫做“data”的属性。ISupportsCString组件的一个实例被创建,然后其参数被设置。然后这又作为setValue()的第二个参数传入。

当用户按下Get Value按钮时,会从相应的键返回一个ISupports接口。ISupports接口然后查询ISupportsCString接口。在返回之后,data参数就用来设置txtValue文本框的值。

代码的其它部分都是相当好的自说明,但是要注意的最主要的事就是XPCOM组件的实现。为了能使该例能够正常工作,你需要把这段代码在你的本地计算机上保存为一个HTML文件。在Mozilla浏览器中,使用“file:///. . .”打开这个文件,Privilege Manager就会授权你的脚本使用XPConnect。其它的解决安全问题的方法是使用Netscape Signing Toole数字签名你的脚本。



责任编辑:李宁

欢迎评论投稿

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134