webkit中采用binding方式进行JS的本地扩展详细步骤是什么?尤其是最后加入CMakeLists.txt之后的操作 谢谢

发布网友 发布时间:2022-03-28 16:37

我来回答

2个回答

热心网友 时间:2022-03-28 18:06

通过binding方式
要扩展一个全局JS对象除了要为webkit添加这个对象的头文件和cpp文件外,还需要为这个对象写一个idl文件以便webkit自动生成相应的代码;另外,还需要修改DOMWindow.*以便把新对象注册上去。下面以MyObject对象为例介绍具体步骤。
WebCore/page/
1.添加MyObject.h文件
view plain#ifndef MyObject_h #define MyObject_h #include <wtf/PassRefPtr.h> #include <wtf/RefCounted.h> #include <wtf/RefPtr.h> namespace WebCore { class Frame; class String; class MyObject : public RefCounted<MyObject> { public: static PassRefPtr<MyObject> create(Frame* frame) { return adoptRef(new MyObject(frame)); } ~MyObject(); void disconnectFrame(); Frame* frame() const { return m_frame; } String description() const; private: MyObject(Frame*); Frame* m_frame; }; } #endif
2.添加MyObject.cpp文件
view plain#include "MyObject.h" #include "PlatformString.h" namespace WebCore { MyObject::MyObject(Frame* frame) : m_frame(frame) { } MyObject::~MyObject() { disconnectFrame(); } void MyObject::disconnectFrame() { m_frame = 0; } String MyObject::description() const //对象的属性 { return "Hello World!"; } }
3.添加MyObject.idl文件
view plainmole window { interface MyObject { readonly attribute DOMString description; }; }
4.修改DOMWindow.h文件
添加如下声明:
view plainpublic: MyObject* myObject() const; MyObject* optionalMyObject() const { return m_myObject.get(); } private: mutable RefPtr<MyObject> m_myObject;
5.修改DOMWindow.cpp文件
添加接口实现
view plainMyObject* DOMWindow::myObject() const { if (!m_myObject) m_myObject = MyObject::create(m_frame); return m_myObject.get(); }
修改部分函数实现
void DOMWindow::clear()函数中添加:
view plainif (m_myObject) m_myObject->disconnectFrame(); m_myObject = 0;
6.修改DOMWindow.idl文件
添加:
view plainattribute [Replaceable] MyObject MyObject;
7.修改CMakeLists.txt
将MyObject.cpp、MyObject.idl加入编译。
OK。以上步骤就添加了一个自定义的全局对象。这是单实例的,有时间了再把多实例的过程写下,也就是可以new了。
小弟新手,有问题请大家多多指教。
本文的内容主要参考网上收集的资料,不过在Android 4.0 webkit上做扩展时,碰到一些问题,觉得有必要记录下来。所谓扩展JavaScript对象,就是增加一个JS对象,但它并没有定义在标准的JS对象集合中。如果网页中包含了扩展的JS对象,使用普通的浏览器就会报JS错误。下面以添加HelloObject对象为例说明具体步骤,该对象具有description属性:1. 添加HelloObject.h, HelloObject.cpp, HelloObject.idl文件,简单起见,将这三个文件放到Source/WebCore/page目录下。#ifndef HelloObject_h
#define HelloObject_h#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>#include "PlatformString.h"namespace WebCore { class HelloObject : public RefCounted<HelloObject> {
public:
static PassRefPtr<HelloObject> create() { return adoptRef(new HelloObject()); } String description() const;
private:
HelloObject();
};} // namespace WebCore#endif // HelloObject_hHelloObject.h#include "config.h"
#include "HelloObject.h"namespace WebCore {HelloObject::HelloObject()
{
}String HelloObject::description() const
{
return "Hello Object";
}} // namespace WebCoreHelloObject.cppmole window { interface [OmitConstructor] HelloObject {
readonly attribute DOMString description;
};}HelloObject.idl2. 修改Source/WebCore/page/下的DOMWindow.h文件,添加如下声明:class HelloObject;…public: HelloObject* helloObject() const; HelloObject* optionalHelloObject() const { return m_helloObject.get(); }private: mutable RefPtr<HelloObject> m_helloObject;3. 修改Source/WebCore/page/下的DOMWindow.cpp文件,添加接口实现:HelloObject* DOMWindow::helloObject() const
{
if (!m_helloObject)
m_helloObject = HelloObject::create();
return m_helloObject.get();
}在DOMWindow::clear()函数中添加一行语句:m_helloObject = 0;4. 修改DOMWindow.idl文件,添加:attribute [Replaceable] HelloObject helloObject;5. 接下来需要修改编译系统,让android编译系统编译新增的文件:首先修改Source/WebCore/Android.mk,增加page/HelloObject.cpp到LOCAL_SRC_FILES变量,其次需要修改Source/WebCore/Android.derived.v8bindings.mk,增加$(intermediates)/bindings/V8HelloObject.h到GEN变量。(注:这个是必须的,否则就不会根据HelloObject.idl生成V8HelloObject.h文件,在编译时会出错,这也是折腾了半天得出的成果)至此,工作基本上完成,待webkit重新编译后,可以用如下的网页进行验证:<html>
<body>
<script type="text/javascript">
document.write("<p> This is from HelloObject: ");
document.write(helloObject.description + "</p>");
</script>
</body>

目前极大多数的嵌入式设备上都配有上网功能且对上网的要求极高用户有9 成以上的上网行为靠浏览器来完成的。浏览器逐渐成为嵌入式设备丌可或缺的组成部分是用户查看网络信息、获取网络资源的一个极为重要的工具。选取WebKit浏览器引擎在浏览器开发中带来很多便利。Apple公司基于WebKit引擎的Safari for Win的推出给用户带来了超乎寻常的用户体验。随着Google公司基于WebKit引擎的Chrome浏览器的成功开发及推出WebKit引擎的关注度空前高涨尤其是WebKit方便快捷的优点更让用户极为青睐。目前国内外已经推出了几款基于WebKit引擎的嵌入式浏览器如iPhone和Android的内置浏览器。 1 Webkit本地扩展技术 在嵌入式设备中浏览器作用广泛。通过浏览器来完成用户不应用程序之间的交互可以很大程度上降低应用程序的开发和移植难度。为强化对基于浏览器的应用程序的支持现代的浏览器提供了扩展机制来加载本地代码以实现相应的功能和操作比如ActiveX和NPAPI插件的方式Google提出了Native Client技术。对浏览器迚行本地扩展成为一种有效的解决方案对JavaScript的功能迚行扩充同时这样还很好的保证了安全性。这就是本文将主要介绍基于WebKit内核浏览器的本地JS扩展方法即改造WebKit将JavaScript对象不本地对象映射使JS对象本地化实现浏览器对本地JavaScript对象的调用以拓宽JavaScript的功能领域。 2 WebKit本地js扩展方法及调用流程 2.1 WebKit本地js扩展方法 2.1.1 标题 1) 在WebKit源码路径下的WebCore/page/ 下DOMWindow.cpp、DOMWindow.h、DOMWindow.idl添加PlayTool类 DOMWindow.h中添加PlayTools类以及类的函数指针 playtools()以及类的对象m_PlayTools DOMWindow.cpp中添加PlayTools类的函数指针追问谢谢~不过你说的这些都是网上现有的帖子,我都看过了,我问的是添加CMakeLists.txt之后的具体步骤,怎么添加,添加哪些文件,是否还需要在别处添加?并不是这种在网上搜过来的大众步骤,还是谢谢你!

热心网友 时间:2022-03-28 19:24

东方不败 成本豆腐干
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com