一. 扩展单对象
要在页面上使用我们自定义的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
{
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中。