分享

什么是XPCOM?(zt) - Mozilla-Based 开发 - Mozilla 社区 Supported by Sociz

 xiaoqdu 2008-11-24
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 + "}\nLength: " + 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()"> 
<input type="button" value="Get Value" name="btnGetValue"
onclick="btnGetValue_onclick()"> 
<input type="button" value="Delete Value" name="btnDelValue"
onclick="btnDelValue_onclick()"> 
<input type="button" value="Get Keys" name="btnGetKeys"
onclick="btnGetKeys_onclick()"> 
<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数字签名你的脚本。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多