一、介绍

谷歌浏览器和CEF使用V8JavaScript Engine作为内容的JavaScript实现。在浏览器中的每个窗口都有它自己在的JS上下文提供作用域和在窗口中安全的执行JS代码。CEF暴露大量JS功能集成在客户端应用程序。
CEF3的Webkit和JS在单独的渲染进程中运行。在渲染进程的主线程中使用TID_RENDERER 作为唯一标识。所有V8的执行必须放置在这个线程中。
与JS执行相关的回调函数被暴露是通过CefRenderProcessHandler接口实现。当一个新的渲染进程被初始化时通过CefApp::GetRenderProcessHandler()函数获取这个接口。

二、执行JavaScript

在客户端应用程序中简单的方式执行JS使用CefFrame::ExecuteJavaScript()函数,这个函数在浏览进程一和渲染进程中都可用。在一个JS上下文外可安全使用。

CefRefPtr<CefBrowser> browser = ...;
CefRefPtr<CefFrame> frame = browser->GetMainFrame(); 
frame->ExecuteJavaScript("alert('ExecuteJavaScript works!');", frame->GetURL(), 0);

上面的引起alert('ExecuteJavaScript works!')在浏览器的主窗口中执行。

在窗口的JS上下文中ExecuteJavaScript函数可用于函数和变量交互。是为了从JS到客户端应用程序返回值使用窗口绑定和扩展。

三、窗口绑定

窗口绑定允许客户端应用程序系上一个值到窗口的window对象上,窗口绑定的实现使用CefRenderProcessHandler::OnContextCreated()函数。

如:

void MyRenderProcessHandler::OnContextCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context) { // Retrieve the context's window object. CefRefPtr<CefV8Value> object = context->GetGlobal(); // Create a new V8 string value. See the "Basic JS Types" section below. CefRefPtr<CefV8Value> str = CefV8Value::CreateString("My Value!"); // Add the string to the window object as "window.myval". See the "JS Objects" section below. object->SetValue("myval", str, V8_PROPERTY_ATTRIBUTE_NONE); }

JavaScript框架可以与之交互的窗口绑定。

<script language="JavaScript">
alert(window.myval); // Shows an alert box with "My Value!"
</script>

窗口绑定是每次重新加载一个框架加载给客户端应用程序在必要时更改绑定的机会。例如,不同的框架通过修改绑定框架的窗口对象值可以访问不同的特性。

四、扩展

扩展像window绑定一样除了为每个框架 加载到上下文之外,一旦加载就不能修改,当一个扩展已经加载并试图在扩展加载中访问DOM就会出现DOM不存在的crash。扩展应该在CefRenderProcessHandler::OnWebKitInitialized()函数中使用CefRegisterExtension函数注册。

void MyRenderProcessHandler::OnWebKitInitialized() { // Define the extension contents. std::string extensionCode = "var test;" "if (!test)" " test = {};" "(function() {" " test.myval = 'My Value!';" "})();"; // Register the extension. CefRegisterExtension("v8/test", extensionCode, NULL); }

通过extensionCode描述的字符串可以是任何有效的代码,JS框架可以和扩展代码进行交互

<script language="JavaScript">
alert(test.myval); // Shows an alert box with "My Value!"
</script>

五、基本JS类型

CEF支持基本数据类型的创建,包括:undefined, null, bool, int, double, date 和 string.这些基本数据类型使用CefV8Value::Create*()系列静态函数创建。如创建一个JS字符串:CefRefPtr<CefV8Value> str = CefV8Value::CreateString("My Value!");

基本数据类型可在任何地方创建和在所关联的上下文中不用初始化。如:

CefRefPtr<CefV8Value> val = ...;
if (val.IsString())
{ // The value is a string. }

使用Get*Value()系列函数获取值:CefString strVal = val.GetStringValue();

六、JS数组

使用CefV8Value::CreateArray()静态函数并传递一个长度作为参数创建数组。数组只能在上下文内部创建并使用。如:

CefRefPtr<CefV8Value> arr = CefV8Value::CreateArray(2);

值赋给一个数组使用SetValue()方法的变体,以一个索引作为第一个参数。
arr->SetValue(0, CefV8Value::CreateString("My First String!"));
arr->SetValue(1, CefV8Value::CreateString("My Second String!"));

IsArray()函数测试CefV8Value是否为数组,GetArrayLength()函数获取数据的长度,从数组中获取一个值使用GetValue()变体函数。

七、JS对象

使用CefV8Value::CreateObject静态函数可带一个可选的CefV8Accessor参数创建JS对象。对象也只能在js上下文中创建并使用。

CefRefPtr<CefV8Value> obj = CefV8Value::CreateObject(NULL);

使用SetValue()变体函数并以字符串key作为第一参数给对象分配值。

八、对象的访问者

JS对象可选择使用一个与之关联的CefV8Accessor以提供一个源生的getting和setting值的实现。
CefRefPtr<CefV8Accessor> accessor = …;
CefRefPtr<CefV8Value> obj = CefV8Value::CreateObject(accessor);

CefV8Accessor接口的一个实现,必须由客户端应用程序提供。

class MyV8Accessor : public CefV8Accessor { public: MyV8Accessor() {} virtual bool Get(const CefString& name, const CefRefPtr<CefV8Value> object, CefRefPtr<CefV8Value>& retval, CefString& exception) OVERRIDE { if (name == "myval") { // Return the value. retval = CefV8Value::CreateString(myval_); return true; } // Value does not exist. return false; } virtual bool Set(const CefString& name, const CefRefPtr<CefV8Value> object, const CefRefPtr<CefV8Value> value, CefString& exception) OVERRIDE { if (name == "myval") { if (value.IsString()) { // Store the value. myval_ = value.GetStringValue(); } else { // Throw an exception. exception = "Invalid value type"; } return true; } // Value does not exist. return false; } // Variable used for storing the value. CefString myval_; // Provide the reference counting implementation for this class. IMPLEMENT_REFCOUNTING(MyV8Accessor); };

为了将值传递给访问者必须使用SetValue()变体函数设置,接受AccessControl和PropertyAttribute参数

九、JS函数

CEF支持JS函数创建和本地实现,

转载于:https://www.cnblogs.com/h2zZhou/p/6871902.html

CEF3研究(四)之javascript集成相关推荐

  1. 菜鸟与 cef 的邂逅之旅(三):Cef3 中 C++ 与 JavaScript 的互相调用

    一.引言 我们要实现一个强大的浏览器控件,必须要能够实现 C++ 与 JavsScript 的互相调用. 于是,在我研究了: 菜鸟与 cef 的邂逅之旅(一):cef 源码获取与编译 菜鸟与 cef ...

  2. 车联网Apollo(阿波罗),研究carlife车机端集成及开发,(WeLink,carplay/carlife)

    Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理场景 - ...

  3. Vite(四)后端集成、比较Snowpack、从 v1 迁移、Awesome Vite.js

    Vite(四)后端集成.比较Snowpack.从 v1 迁移.Awesome Vite.js 文章目录 Vite(四)后端集成.比较Snowpack.从 v1 迁移.Awesome Vite.js 1 ...

  4. Javascript基础与面向对象基础~第四讲 Javascript中的类对象

    今天来说JS中如何实现类(class),事实上本应该昨天晚上写的,可我失言了,在些说一声"抱歉"!JS中的类是JS面向对象的基础,也是我最拿手的东西,你写的代码能否提高一个层次,一 ...

  5. 学习笔记(四)——JavaScript(一)

    JavaScript 是互联网上最流行的脚本语言,这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记本电脑.平板电脑和智能手机等设备. 文章目录 一.了解 JavaScript 二. ...

  6. 四十四种Javascript技巧大全

    四十四种Javascript技巧大全 1.第一个给变量分配值时不要忘了var关键字. 分配值给未定义的变量将是该变量自动成为全局变量,应该避免全局变量. 2.使用 === 而不是 == 使用 == ( ...

  7. 将JavaScript集成到QML中

    将JavaScript集成到QML中 将JavaScript集成到QML中 使用JavaScript表达式获取属性值 在QML中添加JavaScript函数 使用JavaScript文件 将JavaS ...

  8. 游戏理论研究四:RPG游戏

    游戏理论研究四(转)RPG游戏- - 作者:hitman     4.RPG游戏 RPG游戏 (角色扮演类游戏)无疑是最受欢迎的游戏类型.但很难对其进行确切定义 .本文采取用其性质或者说其构成要素来定 ...

  9. 数电实验(四)利用集成数值比较器74LS85设计一个4位数值比较器

    数电实验(四)利用集成数值比较器74LS85设计一个4位数值比较器 要求: 1.输入为两个4位二进制数,分别接四个逻辑电平开关,同时接数码管 2. 输出和LED相连 Multisim仿真:

  10. 【云原生】DevOps(四):集成Sonar Qube

    本文目录: 一.Sonar Qube介绍 二.Sonar Qube环境搭建 1. Sonar Qube安装 2. 安装中文插件 三.Sonar Qube基本使用 1. Maven实现代码检测 2. S ...

最新文章

  1. python 解析xml格式_Python解析XML文件
  2. Miner3D Enterprise 企业版
  3. 程序员的数学3线性代数pdf_程序员带娃福利:《汉声数学》41本PDF
  4. 卸载CentOS 5.4自带的OpenJDK,配置新的Java环境
  5. HDU1907 ZJU3113
  6. #6278. 数列分块 2 分块 + 块内二分
  7. 在unity中设置多种怪物数据_Unity可编程渲染管线(SRP)系列(三)——光照(单通道 正向渲染)...
  8. 谁在窥屏_TheShy直播被窥屏搞怕了,为了防止被窥屏,这个做法绝了
  9. 爬虫的单线程+多任务异步协程:asyncio 3.6
  10. drop table可以删除多张表吗_delete、truncate、drop 有啥区别?该怎么选择?
  11. sprd camera 帧率设置_UnityPlayerSetting-Android 打包设置介绍
  12. 看雪CTF.TSRC 2018 团队赛 第八题 『二向箔』 解题思路
  13. 笔记-delphi7高效数据库程序设计
  14. JavaWeb教程路线
  15. linux内核源码分析之虚拟内存映射
  16. 此计算机上的操作系统或service pack,win10系统安装补丁失败提示缺少service pack系统组件的设置办法...
  17. linux终端模拟器
  18. BGA集成电路脚位识别
  19. 陈艾盐:春燕百集访谈节目第二十一集
  20. chrome浏览器自动填充时背景色改变(-webkit-autofill)

热门文章

  1. NetBeans Support Weblog
  2. Ubuntu下Apache+php+mysql网站架设详解
  3. 类型事务修改 mysql 表类型 实际测试可执行
  4. eclipse 查看变量或方法被调用的快捷键
  5. HTTP1.1之后的长连接和WebSocket的长连接之间的区别
  6. Guava RateLimiter 实现 API 限流,这才是正确的姿势!
  7. 卧槽!真可恶,竟然有人贩卖儿童软色情表情包,网友:...
  8. 为什么不推荐使用BeanUtils属性转换工具,老程序员都不使用!
  9. 大型网站技术架构的原理与分析
  10. 深入 AI 之前,你需要学习的服务与框架