您好,登錄后才能下訂單哦!
在Gecko2.0中XPCOM發生了一些變化從而影響了其兼容性,這篇文章詳述這些變化,同時為升級你的代碼提供一些建議。
1、不在擁有不變的接口(frozen interface)
這里不在擁有任何不變的接口,從現在開始,所有的接口都可能發生變化。文檔將會被更新,允許刪除對“frozen”和“unfrozen”接口的引用。
2、組件注冊
在Gecko2.0中XPCOM組件注冊的方式發生了改變。在Gecko2.0以前,組件注冊過程中,所有的二進制組件和javascript組件都會被加載和調用,要求它們自己去注冊自己。如果你使用XPCOMUtils.jsm,這個過程對你來說被隱藏了,但事實上它還存在。
然而從Gecko2.0開始,組件注冊使用manifest文件,類似于chrome注冊。實際上,同樣的chrome.manifest文件也用來注冊組件。
所有已有的XPCOM組件都需要升級來支持這點。不管怎樣,這個很容易實現,而且你能同時支持這兩種注冊類型以實現向后兼容。
3、Component manifest
所有組件注冊現在都是通過manifest文件來處理。對于擴展,和現在注冊chrome使用的是一樣的chrome.manifest文件。
3.1、XPT文件
任何XPT文件的路徑都必須顯式用interfaces的標示列在manifest文件中:
interfaces components/mycomponent.xpt
3.2、Javascript 組件
Javascript 組件的注冊信息不再放在組件內部,相反放在manifest文件。組件只有當XPCOM組件管理器需要創建組件的時候才會被加載。
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代碼不再導出NSGetModule()函數,現在它需要導出NSGetFactory()函數,這個函數接受CID作為參數。
例如,在你的組件中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]);
組件通過動態檢測XPCOMUtils.jsm導出的符號來實現向后兼容Gecko1.9.2,并且導出正確的函數:
/** * 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、二進制組件
二進制組件必須顯式的用binary-component標識列在manifest文件中
binary-component components/mycomponent.dll
C++組件必須改變:二進制組件不再導出NSGetModule()函數,相反,它導出一個指向mozilla::Module結構的NSModule數據符號,關于mozilla:module結構的更多信息,看Module.h文件,對于最新的動態模塊實例,看nsSampleModule.cpp。
注意nsIGenericFactory.h已經被移除,對nsIGenericFactory.h的引用應該被替換成mozilla/ModuleUtils.h。
通過使用額外的宏定義NS_IMPL_MOZILLA192_NSGETMODULE使二進制組件兼容Gecko1.9.2和mozilla 2.0成為可能,詳細看nsSampleModule.cpp
注意:從Firefox4開始,針對每一個Firefox主要發行版二進制XPCOM組件必須被重新編譯。如果你使用js-ctypes開發你會覺得更簡單些。
同時使用二進制的擴展現在必須在install.manifest中使用unpack屬性。
原文地址:https://developer.mozilla.org/en-US/docs/Mozilla/XPCOM/XPCOM_changes_in_Gecko_2.0
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。