中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在Gecko2.0中XPCOM的變化

發布時間:2020-08-05 15:34:45 來源:網絡 閱讀:519 作者:huang19015 欄目:web開發

在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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安宁市| 聂拉木县| 泸定县| 宁津县| 永吉县| 和静县| 高雄市| 怀集县| 五峰| 临桂县| 香港| 德州市| 基隆市| 郯城县| 若尔盖县| 体育| 镇赉县| 南岸区| 化隆| 元阳县| 六盘水市| 无极县| 康保县| 霍州市| 大同市| 图片| 和田市| 鄯善县| 美姑县| 舞阳县| 青州市| 凌海市| 志丹县| 南城县| 长阳| 临澧县| 高邑县| 庐江县| 隆化县| 沅江市| 威远县|