您好,登錄后才能下訂單哦!
在Gecko2.0中XPCOM發(fā)生了一些變化從而影響了其兼容性,這篇文章詳述這些變化,同時(shí)為升級你的代碼提供一些建議。
1、不在擁有不變的接口(frozen interface)
這里不在擁有任何不變的接口,從現(xiàn)在開始,所有的接口都可能發(fā)生變化。文檔將會(huì)被更新,允許刪除對“frozen”和“unfrozen”接口的引用。
2、組件注冊
在Gecko2.0中XPCOM組件注冊的方式發(fā)生了改變。在Gecko2.0以前,組件注冊過程中,所有的二進(jìn)制組件和javascript組件都會(huì)被加載和調(diào)用,要求它們自己去注冊自己。如果你使用XPCOMUtils.jsm,這個(gè)過程對你來說被隱藏了,但事實(shí)上它還存在。
然而從Gecko2.0開始,組件注冊使用manifest文件,類似于chrome注冊。實(shí)際上,同樣的chrome.manifest文件也用來注冊組件。
所有已有的XPCOM組件都需要升級來支持這點(diǎn)。不管怎樣,這個(gè)很容易實(shí)現(xiàn),而且你能同時(shí)支持這兩種注冊類型以實(shí)現(xiàn)向后兼容。
3、Component manifest
所有組件注冊現(xiàn)在都是通過manifest文件來處理。對于擴(kuò)展,和現(xiàn)在注冊chrome使用的是一樣的chrome.manifest文件。
3.1、XPT文件
任何XPT文件的路徑都必須顯式用interfaces的標(biāo)示列在manifest文件中:
interfaces components/mycomponent.xpt
3.2、Javascript 組件
Javascript 組件的注冊信息不再放在組件內(nèi)部,相反放在manifest文件。組件只有當(dāng)XPCOM組件管理器需要?jiǎng)?chuàng)建組件的時(shí)候才會(huì)被加載。
chrome.manifest
# The {classID} here must match the classID in mycomponent.js component {e6b866e3-41b2-4f05-a4d2-3d4bde0f7ef8} components/mycomponent.js contract @foobar/mycomponent;1 {e6b866e3-41b2-4f05-a4d2-3d4bde0f7ef8} category profile-after-change MyComponent @foobar/mycomponent;1
JavaScript代碼不再導(dǎo)出NSGetModule()函數(shù),現(xiàn)在它需要導(dǎo)出NSGetFactory()函數(shù),這個(gè)函數(shù)接受CID作為參數(shù)。
例如,在你的組件中javascript代碼:
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); function myComponent() { } myComponent.prototype = { // this must match whatever is in chrome.manifest! classID: Components.ID("{e6b866e3-41b2-4f05-a4d2-3d4bde0f7ef8}"), QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIMyComponent]), /* nsIMyComponent implementation goes here */ ... }; // The following line is what XPCOM uses to create components. Each component prototype // must have a .classID which is used to create it. const NSGetFactory = XPCOMUtils.generateNSGetFactory([myComponent]);
組件通過動(dòng)態(tài)檢測XPCOMUtils.jsm導(dǎo)出的符號來實(shí)現(xiàn)向后兼容Gecko1.9.2,并且導(dǎo)出正確的函數(shù):
/** * XPCOMUtils.generateNSGetFactory was introduced in Mozilla 2 (Firefox 4, SeaMonkey 2.1). * XPCOMUtils.generateNSGetModule was introduced in Mozilla 1.9 (Firefox 3.0). */ if (XPCOMUtils.generateNSGetFactory) var NSGetFactory = XPCOMUtils.generateNSGetFactory([myComponent]); else var NSGetModule = XPCOMUtils.generateNSGetModule([myComponent]);
3.3、二進(jìn)制組件
二進(jìn)制組件必須顯式的用binary-component標(biāo)識列在manifest文件中
binary-component components/mycomponent.dll
C++組件必須改變:二進(jìn)制組件不再導(dǎo)出NSGetModule()函數(shù),相反,它導(dǎo)出一個(gè)指向mozilla::Module結(jié)構(gòu)的NSModule數(shù)據(jù)符號,關(guān)于mozilla:module結(jié)構(gòu)的更多信息,看Module.h文件,對于最新的動(dòng)態(tài)模塊實(shí)例,看nsSampleModule.cpp。
注意nsIGenericFactory.h已經(jīng)被移除,對nsIGenericFactory.h的引用應(yīng)該被替換成mozilla/ModuleUtils.h。
通過使用額外的宏定義NS_IMPL_MOZILLA192_NSGETMODULE使二進(jìn)制組件兼容Gecko1.9.2和mozilla 2.0成為可能,詳細(xì)看nsSampleModule.cpp
注意:從Firefox4開始,針對每一個(gè)Firefox主要發(fā)行版二進(jìn)制XPCOM組件必須被重新編譯。如果你使用js-ctypes開發(fā)你會(huì)覺得更簡單些。
同時(shí)使用二進(jìn)制的擴(kuò)展現(xiàn)在必須在install.manifest中使用unpack屬性。
原文地址:https://developer.mozilla.org/en-US/docs/Mozilla/XPCOM/XPCOM_changes_in_Gecko_2.0
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。