小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

什么是XPCOM?(zt) - Mozilla-Based 開(kāi)發(fā) - Mozilla 社區(qū) Supported by Sociz

 xiaoqdu 2008-11-24
IE支持初始化和執(zhí)行ActiveX組件腳本來(lái)提供額外的功能;很多其它瀏覽器靠Java applet增加其功能,基于Mozilla的瀏覽器現(xiàn)在可以通過(guò)使用跨平臺(tái)組件對(duì)象模塊(Cross Platform Component Object Module,XPCOM)組件添加它們自己的功能。



XPCOM是一個(gè)框架,它允許對(duì)項(xiàng)目進(jìn)行模塊化設(shè)計(jì),將整個(gè)開(kāi)發(fā)劃分為多個(gè)組件。組件然后在運(yùn)行時(shí)期重新裝配,創(chuàng)建出組件的克隆共同創(chuàng)建一個(gè)應(yīng)用程序。

XPCOM 有點(diǎn)像微軟的COM,但是它們的實(shí)現(xiàn)有點(diǎn)不同。微軟的COM組件是注冊(cè)在系統(tǒng)注冊(cè)表中的,而XPCOM組件是通過(guò)Mozilla自己的注冊(cè)表注冊(cè)的。這個(gè) 信息存在于兩個(gè)文件中:comreg.dat和xpti.dat。在comreg.dat中你會(huì)發(fā)現(xiàn)很多信息。

你沒(méi)有必要知道XPCOM 技術(shù)的所有復(fù)雜的細(xì)節(jié)就能夠獲益于XPCOM。感謝XPCOM,你可以在JavaScript中使用XPCOM組件,并且還可以在JavaScript中 開(kāi)發(fā)XPCOM組件。這樣就向需要快速解決方案但又不想用C或者C++編寫(xiě)本地XPCOM組件的開(kāi)發(fā)人員打開(kāi)了創(chuàng)建XPCOM組件的大門(mén)。

nsDictionary對(duì)象
Mozilla 已經(jīng)發(fā)行了能夠使用JavaScript編寫(xiě)XPCOM組件的版本。里面其中一個(gè)是nsDictionary對(duì)象,它重新組裝了IE中的ActiveX組 件Scripting.Dictionary。它暴露了下面的方法:hasKey()、getKeys()、getValue()、 setValue()、deleteValue()、and clear()。

hasKey()接受收一個(gè)字符串參數(shù),返回一個(gè)Boolean值表示一個(gè)鍵是否存在。
getKeys()沒(méi)有參數(shù),返回鍵名的一個(gè)數(shù)組。
getValue()接受一個(gè)字符串參數(shù),返回基于所傳入的鍵的一個(gè)ISupports對(duì)象。
setValue()接受兩個(gè)參數(shù),key(string)和value(ISupports),創(chuàng)建一個(gè)key-value對(duì)。
deleteValue()接受一個(gè)字符串參數(shù)(key),從nsDictionary組件中刪除一個(gè)key-value對(duì)。
clear()不帶參數(shù),清除nsDictionary組件的內(nèi)容。
下面是實(shí)際使用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>



這 段代碼看起來(lái)有點(diǎn)怪,尤其是如果你習(xí)慣于微軟的代碼,但是事實(shí)不是那樣不可能。其實(shí)只是包含兩個(gè)類型為“text”的<INPUT>標(biāo)記的一 個(gè)簡(jiǎn)單HTML頁(yè)面。有五個(gè)按鈕顯示nsDictionary對(duì)象不同的任務(wù)。用戶在txtKey文本框中輸入一個(gè)值,然后txtValue文本框中的值 就會(huì)創(chuàng)建一個(gè)key-value對(duì)。用戶還能夠在txtKey文本框中輸入一個(gè)鍵名,然后提取存儲(chǔ)在那個(gè)鍵中的值。

當(dāng)頁(yè)面進(jìn)入時(shí),腳本會(huì) 通過(guò)Privilege Manager詢問(wèn)使用XPConnect的權(quán)限。然后它使用內(nèi)嵌的Components.classes集合在注冊(cè)表中查詢 “@mozilla.org/dictionary”Contract ID返回ISupports接口,從而設(shè)置oDict變量指向nsDictionary。相反,ISupports接口多多少少是用來(lái)返回 IDictionary接口的。

當(dāng)用戶按下Set Value按鈕時(shí),將會(huì)向Privilege Manager查詢使用XPConnect的權(quán)限。(Privilege Mnager在每個(gè)方法調(diào)用中使用。)nsDictionary對(duì)象的setValue()方法帶有兩個(gè)參數(shù):key(一個(gè)字符串值)和value(一個(gè) ISupport對(duì)象)。所有組件都實(shí)現(xiàn)了ISupports接口。有一組用于指定數(shù)據(jù)類型數(shù)據(jù)的基于ISupports的組件。有一個(gè)特殊的接口 nsISupportsCString允許一個(gè)組件以一種通用類型存儲(chǔ)和傳遞字符串?dāng)?shù)據(jù)。ISupportsXXX類型的集合暴露一個(gè)叫做“data”的 屬性。ISupportsCString組件的一個(gè)實(shí)例被創(chuàng)建,然后其參數(shù)被設(shè)置。然后這又作為setValue()的第二個(gè)參數(shù)傳入。

當(dāng)用戶按下Get Value按鈕時(shí),會(huì)從相應(yīng)的鍵返回一個(gè)ISupports接口。ISupports接口然后查詢ISupportsCString接口。在返回之后,data參數(shù)就用來(lái)設(shè)置txtValue文本框的值。

代 碼的其它部分都是相當(dāng)好的自說(shuō)明,但是要注意的最主要的事就是XPCOM組件的實(shí)現(xiàn)。為了能使該例能夠正常工作,你需要把這段代碼在你的本地計(jì)算機(jī)上保存 為一個(gè)HTML文件。在Mozilla瀏覽器中,使用“file:///. . .”打開(kāi)這個(gè)文件,Privilege Manager就會(huì)授權(quán)你的腳本使用XPConnect。其它的解決安全問(wèn)題的方法是使用Netscape Signing Toole數(shù)字簽名你的腳本。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多