问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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
大伙说说洗衣机要不要带烘干好 热烘干洗衣机怎么样 ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 介绍几款2500元以前的手机 像素一定要高 其他的不做要求 近期想入手一部安卓手机,价格2200到2500左右…买HTC desire Z还是 三星... 笔记本忘记开机密码怎么办急死了 浏览器的内核WebKit是什么公司开发的?这个内核好不好? wifi怎么用? wifi怎么查看 新买的无线路由器!怎么设置wifi! WIFI怎么用啊? 怎么使用wifi? wifi怎么登陆认证 电脑wifi怎样开启 wifi联网怎么连 WiFi怎么开呢? wifi连不上怎么处理 wifi咋设置 wifi怎么使用 易语言调用webkit内核的浏览器怎么设置宽和高的 电脑屏幕的比例变宽了,怎么办? 电脑桌面图标变宽了怎么办 电脑屏幕突然变宽,桌面图标变大,看什么都变宽了... 电脑桌面变宽了怎么办? 电脑桌面变宽了怎么调?具体一下、很急 lg电脑桌面很宽怎么调 4脳400绫虫帴鍔涘睘浜庡摢绉嶆瘮璧涳紵 一个草字头一个虫子,念什么?什么? 绫绢扇的制作工序? 虫之歌的虫原型介绍 模拟人生4虫子有什么用 什么男装面料比较好? 端午节的日期、风俗、由来 中国五大名扇指的是哪五种扇子? 剑灵瘟疫彩绫怎么得 文字:蛋字去掉个虫,有这个字吗??读什么 请推荐好养活不容易生虫的盆栽植物? 一木根有两条虫猜成语 推荐几部好的动漫 帮我重复: 金丝香木嵌蝉玉珠 、 一色宫妆千叶攒金... 《天工开物》上篇乃服原文是什么 我国的四大名扇是?哪几个省? 刚出上女孩求名字,最好是火属性的字带艹、金、玉... 死神护庭13队每一队的作用, 丝绸分多少种?? transition、-moz-transition、-webkit-transition、-o-transition是什么意思?怎样用?