android 4.0.1 webkit 基于JSC的JS 扩展

一. 扩展单对象

要在页面上使用我们自定义的SingleObject对象。

需要作如下修改:

webkit/Source/WebCore/Android.mk

SingleObject.h

SingleObject.cpp

以上两个文件是SingleObject在webkit中的具体实现,修改webkit的Android.mk把实现文件编译进webkit.

webkit/Source/WebCore/Android.derived.jscbindings.mk

webkit/Source/WebCore/page/DOMWindow.idl

SingleObject.idl

webkit 的对象暴露给JSC的方式是定义一个idl文件,webkit 通过专门的perl 脚本解析这个idl文件生成对应的JSObject.h和JSObject.cpp.
JSC处理的对象就是生成的JSObject。JSObject是webkit中实际实现类的影子类

所以我们需要实现SingleObject.idl 在这个idl文件中把需要提供给页面使用的属性和接口添加进去。
调用perl脚本解析idl生成JSObject的过程在Android.derived.jscbindings.mk中。
解析DOMWindow.idl生成的JSDOMWindow是整个DOM的入口,SingleObject是单对象不需要提供Constructor,以DOMWindow的只读属性方式出现,所以我们需要在DOMWindow.idl中添加SingleObject.

webkit/Source/WebCore/page/DOMWindow.h

webkit/Source/WebCore/page/DOMWindow.cpp

DOMWindow.idl中将SingleObject声明成了DOMWindow的只读属性,所以扩展对象需要在DOMWindow.h中声明,创建过程在DOMWindow.cpp中。

二. 扩展多对象

要在页面上使用new 操作符创建自定义的MultiObject对象。

需要作如下修改。

webkit/Source/WebCore/Android.mk
webkit/Source/WebCore/ccdt/media/MultiObject.cpp
webkit/Source/WebCore/ccdt/media/MultiObject.h

以上两个文件是MultiObject在webkit中的具体实现,修改webkit的Android.mk把实现文件编译进webkit.

webkit/Source/WebCore/Android.derived.jscbindings.mk

webkit/Source/WebCore/page/DOMWindow.idl

MultiObject.idl

webkit 的对象暴露给JSC的方式是定义一个idl文件,webkit 通过专门的perl 脚本解析这个idl文件生成对应的JSObject.h和JSObject.cpp.
JSC处理的对象就是生成的JSObject。JSObject是webkit中实际实现类的影子类

所以我们需要实现SingleObject.idl 在这个idl文件中把需要提供给页面使用的属性和接口添加进去。
调用perl脚本解析idl生成JSObject的过程在Android.derived.jscbindings.mk中。
解析DOMWindow.idl生成的JSDOMWindow是整个DOM的入口,SingleObject是多对象需要提供Constructor,所以我们需要在DOMWindow.idl中添加SingleObject.

DOMWindow.idl中声明MultiObject的方式的不同决定了JSMultiObjectConstructor来源的不同。

1. attribute MultiObjectContructor  MultiObject; 

这种声明方式表示使用的是perl 解析MultiObject.idl自动生成的JSMultiObjectConstructor。

2. attribute [JSCCustomGetter] MultiObject;

这种声明方式表示使用的是我们自定义的JSMultiObjectConstructor。

采用第二种声明方式,表明我们要自己实现JSMultiObjectConstructor。

所以需要额外改动如下文件:

webkit/Source/WebCore/Android.jscbindings.mk
webkit/Source/WebCore/bindings/js/JSDOMWindowCustom.cpp
JSMultiObjectConstructor.cpp

JSDOMWindowCustom.cpp中添加如下内容:

JSValue JSDOMWindow::MultiObject(ExecState* exec) const

{

 return getDOMConstructor<JSMultiObjectConstructor>(exec, this);
}

JSMultiObjectConstructor.cpp是JSMultiObjectContructor的具体实现文件,在webkit/Source/WebCore/Android.jscbindings.mk中添加JSMultiObjectConstructor.cpp将其编译到webkit中。

另外,在MultiObject.idl中也可以指定MultiObject的属性实现是采用perl脚本自动生成,还是我们自定义。

1.readyonly attribute  propertyName;

2. attribute [Reflect]  propertyName;

这两种方式表明是采用JSMultiObject.cpp中自动生成的方法实现属性。

3.attribute [Custom]  propertyName;

这种声明方式表明是采用我们自定义的方法。

所以需要额外改动如下文件:

webkit/Source/WebCore/Android.jscbindings.mk

JSMultiObjectCustom.cpp

JSMultiObjectCustom.cpp是我们自定义方法的具体实现文件,在webkit/Source/WebCore/Android.jscbindings.mk中添加JSMultiObjectCustom.cpp将其编译到webkit中。




你可能感兴趣的:(android 4.0.1 webkit 基于JSC的JS 扩展)