(FFOS Gecko)

当我们实现了一个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++ 实现:

  同下文WebIDL 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

原文地址:https://www.cnblogs.com/code-4-fun/p/4654850.html