ffos (gecko):如何在gecko 中编写XPCOM组件(一)--javascript 实现方式

本文档介绍了如何在Gecko中使用JavaScript编写XPCOM组件,详细阐述了组件的目录结构、idl接口定义、实现文件、注册清单文件的创建过程,并提供了开发环境和依赖工具的信息。内容包括组件的编译和调用方法,旨在为FFOS开发者提供参考资料。
摘要由CSDN通过智能技术生成

记录与分享,鉴于gecko中编写XPCOM组件的文档都极度过时(基本是基于2006年版的变体),我搬砖尝试好久才写出两个组件。老文档代码部分参考价值不高,下面将自己写xpcom组件的成果分享如下,

一篇写js实现的,一篇写c++实现的。

ffos (gecko):如何在gecko 中编写XPCOM组件(一)--javascript 实现方式

ffos (gecko):如何在gecko 中编写XPCOM组件(二)--C++ 实现方式

xpcom refference links XPCM相关

供有需要的搬砖同道参考,有错误的地方,欢迎指正。

关于XPCOM的扫盲材料可参考MDN,或者


说明:

开发环境,ubuntu + FFOS 源码。

uuid 用uuidgen 命令生成。


涉及到的目录及文件及其作用原理:

ffos 源码中:

一.组件编写

1.js 组件最终目录结构:

gecko/dom/simplejs/

simplejs
├── moz.build
├── nsISimplejs.idl
├── nsIUseComponent.idl
├── Simplejs.js
├── Simplejs.manifest
├── UseComponent.js
└── UseComponent.manifest

2.组件实现:

(1)nsISimplejs.idl 接口定义文件

#include "nsISupports.idl"
[scriptable, uuid(ce32e3ff-36f8-425f-94be-d85b26e634ee)]
interface nsISimpleComponent : nsISupports
{
    attribute string yourName;
    void write();
    void changejs(in string aValue);
};

(2)Simplejs.js nsISimplejs.idl的实现文件

"use strict";

const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
const Cr = Components.results;

Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");

function SimpleComponentImpl() {
    debug("yahaha,constructor SimpleComponentImpl constructor in simplecomponent.js################");
}

//dump("yahaha,dump,im SimpleComponentImpl in simplecomponent.js######################### before prototype");

SimpleComponentImpl.prototype = {

    contractID : "@mozilla.org/simplejs;1",
    classID: Components.ID("{cc587afa-0696-469f-9eff-9dac0dd727fe}"),
    QueryInterface: XPCOMUtils.generateQI([Ci.nsISimpleComponent]),

    get yourName(){ 
        return this.mName; 
    },
    set yourName(aName){ 
        return this.mName = aName;
    },
    write: function(){ 
        dump("yahaha,SimpleComponentImpl.write()");
        dump("Hello " + this.mName + "\n");
    },
    changejs: function(aValue){ 
        this.mName = aValue;
        dump("Hello " + this.mName + "\n");

    },
    mName: "Anonymous!",
};//the implement of interfaces in .idl

//dump("yahaha,dump,in simplecomponent.js###############before generateNSGetFactory");
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([SimpleComponentImpl]);//get factory
//dump("yahaha SimpleComponent.js ooooooooooooooooooooooooooooooooooooooooo");

(3)Simplejs.manifest 组件注册清单文件

# Simplejs.js
component {cc587afa-0696-469f-9eff-9dac0dd727fe} Simplejs.js
contract @mozilla.org/simplejs;1 {cc587afa-0696-469f-9eff-9dac0dd727fe}
category profile-after-change simplecomponent @mozilla.org/simplejs;1

(4)在gecko/b2g/installer/package-manifest.in

dom_simplejs.xpt是moz.build 指定生成的xpt模块。见moz.build部分。

添加:

@RESPATH@/components/dom_simplejs.xpt
@RESPATH@/components/Simplejs.js
@RESPATH@/components/Simplejs.manifest

(5)moz.build

编译文件。写法如下:

# vim: set filetype=python:

XPIDL_MODULE = 'dom_simplejs'

XPIDL_SOURCES += [
        '
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值