当我们实现了一个module,并且通过navigator.mozCustomModule访问
根据module的实现方式的不同,有几种不同的做法。
1. XPCOM component(Javascript实现):
在chrome.manifest中配置(加粗部分):
component {ComponentID} CustomModule.js contract ContractID {ComponentID} category JavaScript-navigator-property mozCustomModule ContractID
以TCPSocket为例:
component {cda91b22-6472-11e1-aa11-834fec09cd0a} TCPSocket.js contract @mozilla.org/tcp-socket;1 {cda91b22-6472-11e1-aa11-834fec09cd0a} category JavaScript-navigator-property mozTCPSocket @mozilla.org/tcp-socket;1
2. XPCOM C/C++ 实现:
3. WebIDL Javascript实现:
在定义webidl时,通过NavigatorProperty来指定(加粗部分):
[NavigatorProperty="mozCustomModule"] interface CustomModule { // methods and properties definition };
以Alarms为例:
[NavigatorProperty="mozAlarms", JSImplementation="@mozilla.org/alarmsManager;1", CheckPermissions="alarms", Pref="dom.mozAlarms.enabled"] interface AlarmsManager { DOMRequest getAll(); DOMRequest add(any date, DOMString respectTimezone, optional any data); void remove(unsigned long id); };
4. WebIDL C/C++ 实现:
此中情形略微复杂,需要手动写一些code。
(1)在gecko/dom/webidl/Navigator.webidl中添加一个属性:
partial interface Navigator { readonly attribute CustomModule mozCustomModule; };
(2)在gecko/dom/base/Navigator.h中声明一个方法:
// 注意方法名:Get + 属性名(第一个字母大写)CustomModule* GetMozCustomModule(ErrorResult& aRv);
(3)在gecko/dom/base/Navigator.cpp中实现上一步声明的方法:
CustomModule* GetMozCustomModule(ErrorResult& aRv) { return new CustomModule(); }
TODO:
sample code
时间: 2024-11-08 00:34:03