CEF3研究(一)

一、基本概览

  1. C++ Wrapper
    C++Wrapper(包装类)就是将C结构包装C++类。 这是C/C++API转换层通过translator tool自动产生的。
  2. 进程

CEF3用多进程运行。

  1. 主(浏览)进程 ——处理窗口创建,绘制和网络访问,会产生相同的进程作为主应用程序,及处理主应用程序的逻辑。
  2. 渲染进程——处理闪烁渲染和JavaScript的执行,也处理一些应用程序逻辑,如JavaScript绑定和DOM的访问。
  3. scheme + domain进程——默认的进程模型的渲染进程。每个进程有唯一的源
  4. 其他进程,如插件进程、gpu处理,是按需要产生的。

默认的主应用程序可执行文件会分多次产生独立进程,这是通知command-line 标识传递给CefExecuteProcess函数。如果主应用程序执行大加载任务非常耗时,或是其他不适合在非浏览进程的任务可分多少可执行文件在其他程序中。这可通过 CefSettings.browser_subprocess_path 进行配置

由CEF3产生的进程用IPC进行通信,浏览进程和渲染进程的应用逻辑通信是通过来回异步发送消息。而在渲染进程中JavaScript的通信是调用异步ap

3. 线程

在CEF3中每个进程以多线程运行。 cef_thread_id_t枚举定义了所有线程列表。浏览进程包含4个线程:

  1. TID_UI 是浏览进程的主线程,如果主应用程序线程调用  CefInitialize()以CefSettings.multi_threaded_message_loop = false调用,那么主应用程序线程也是TID_UI.
  2. TID_IO 在浏览进程中用于处理进程IPC和网络消息。
  3. TID_FILE在浏览进程中用于与文件系统交互
  4. TID_RENDERER在渲染进程的主线程

由于CEF本身是多线程,在线程中需要对访问的数据和传递的消息进行加锁。CEF3提供Lock和Unlock方法进行加锁,AutoLock块对象对代码进行同步访问。

CefPostTask家族函数支持在两个线程之间进行消息传递。

可以验证当前线程使用CefCurrentlyOn()函数,也可以使用以下宏,验证当前线程

#define CEF_REQUIRE_UI_THREAD()       DCHECK(CefCurrentlyOn(TID_UI));

#define CEF_REQUIRE_IO_THREAD()       DCHECK(CefCurrentlyOn(TID_IO));

#define CEF_REQUIRE_FILE_THREAD()     DCHECK(CefCurrentlyOn(TID_FILE));

#define CEF_REQUIRE_RENDERER_THREAD() DCHECK(CefCurrentlyOn(TID_RENDERER));

4. 引用计数

CEF3的所有类及自己写的类都要实现CefBase接口,所有类的实例都通过CefRefPtr智能指针管理,CefRefPtr实现自动引用计数,AddRef和Release函数对引用计数进行加减。

IMPLEMENT_REFCOUNTING(MyClass);//让本类支持引用计数

5. 字符串

CEF自定义字符串,有如下不同的原因:

  1. libcef库和主应用程序可以使用不同的运行时管理堆内存,所有的对象或字符串都需要在同一个运行时释放申请的空间
  2. libcef库可以支持不同形式的字符串类型(UTF8, UTF16和wide).默认使用UTF16,可修改cef_string.h的相关宏来改变。

CEF3字符串的使用:

    • cef_string_set will assign a string value to the structure with or without copying the value.
    • cef_string_clear will clear the string value.
    • cef_string_cmp will compare two string values.

在C++中使用CefString类表示字符串,CefString提供了从UFT8到std::wstring字符串的转换功能。

  1. std::string和CefString 相互转换

std::string str = “Some UTF8 string”;

// Equivalent ways of assigning |str| to |cef_str|. Conversion from UTF8 will occur if necessary.

CefString cef_str(str);

cef_str = str;

cef_str.FromString(str);

// Equivalent ways of assigning |cef_str| to |str|. Conversion to UTF8 will occur if necessary.

str = cef_str;

str = cef_str.ToString();

2. std::wstring和CefString 相互转换


 std::wstring str = “Some wide string”;

// Equivalent ways of assigning |str| to |cef_str|. Conversion from wide will occur if necessary.

CefString cef_str(str);

cef_str = str;

cef_str.FromWString(str);

// Equivalent ways of assigning |cef_str| to |str|. Conversion to wide will occur if necessary.

str = cef_str;

str = cef_str.ToWString();

     3. ASCII(char)和CefString之间转换


const char* cstr = “Some ASCII string”;

CefString cef_str;

cef_str.FromASCII(cstr);

4.cef_string_t 和CefString之间转换

CefSettings settings;
const char* path = “/path/to/log.txt”;

// Equivalent assignments.
CefString(&settings.log_file).FromASCII(path);
cef_string_from_ascii(path, strlen(path), &settings.log_file);
时间: 2024-10-06 06:54:18

CEF3研究(一)的相关文章

CEF3研究(三)

一.Off-Screen Rendering 脱屏绘制 CEF的脱屏渲染并不创建源生的浏览器窗口,而是CEF提供主应用程序在无效区域和像素buffer里渲染,然后主应用程序通过鼠标.键盘和焦点事件通知CEF.脱屏渲染现在不支持图层混合加速图层混合加速.脱屏渲染要窗口浏览器一样接受相同的通知,包括生命周期通知等,为了使用脱屏渲染: 实现CefRenderHandler接口,所有方法是必需的,除非另有指示. 调用CefWindowInfo::SetAsOffScreen()函数和将CefWindow

CEF3研究(四)之javascript集成

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

CEF3研究(二)

应用程序结构 每个CEF3应用程序都有一个相同的结构: 提供一个入口函数以初始化CEF和运行每个子进程逻辑和CEF消息处理 提供一个CefApp子类处理某个进程的回调 提供一个CefClinet子类处理某个浏览进程的回调 调用CefBrowserHost::CreateBrowser()函数创建浏览进程实例并使用CefLifeSpanHandler来管理浏览生命周期 2. 入口函数 CEF3应用程序都是以多进程方式运行的.这些进程都可以使用相同的可执行文件和独立的可执行文件被分配在每个子进程上.

[原创]Cef3 2623.1397 开启ppapi flash插件

最近发现WKE播放Flash或者游戏时会有很多BUG,例如视频无法播放或者是Stage3D无法使用等问题. 经过研究应该是精简版本导致的,所以决定尝试使用CEF3移植入SOUI,但是DEMO中版本有点旧,所以想升级. 发现23XX版本开始 无法直接使用npapi的flash插件,默认是关闭的 这里以CEF的DEMO程序CEFCLIENT为例子: 有2种方式可以启动FLASH插件,但是我不推荐NPAPI方式,实际上非常不好,据说是效率低下以及不稳定. 所以这里默认为PPAPI的方式. 首先要做的:

CEF3中js调用delphi内部方法

在CEF1中JS调用delphi的方法已经贴过:http://www.cnblogs.com/Delphi-Farmer/archive/2013/05/17/3083794.html 但是CEF3升级了,貌似内核都不一样了,CEF1中的方法失效了,查阅了一些资料,得出如下结果: delphi代码: interface uses ceflib;//其它 type //这里建议用class 不建议用class(TThread) 不然有些地方要报错 TMyExtension = class(TThr

【转】MFC内嵌cef3浏览器内核

一.cef3内核的下载 可以从http://opensource.spotify.com/cefbuilds/index.html下载,注意:很多版本编译都可以通过 但是运行的时候会崩溃,以cef_binary_3.2704.1414.g185cd6c_windows32为例,该版本debug编译都可以通过,运行的时候加载本地网页会出现错误,原因未知,加载www.baidu.com,关闭的时候会出现崩溃的情况,release版本完全正常, 二.使用cmake创建成vs工程 本文创建为vs2015

Google帝国研究——Google的产业构成

                                                                                    Google帝国研究--Google的产业构成 摘要:Google帝国研究  产业构成 作者:魏春颖 文章来源:网络整理 Google产业的构成: 1.    业务板块: 包括互联网搜索.云计算.广告技术,开发并提供大量基于互联网的产品与服务,开发线上软件.应用软件,还涉及移动设备的Android操作系统以及操作系统谷歌Chrom

今天研究了一下手机通信录管理系统(C语言)

题目:手机通信录管理系统 一.题目要求 二.需求分析 三.设计步骤/编写代码 四.上机/运行结果 五.总结 一.题目要求 模拟手机通信录管理系统,实现对手机中的通信录进行管理操作.功能要求: (1)查看功能:A:办公,B:个人,C:商务 (2)增加联系人:录入新数据(姓名,电话,分类,邮箱:weiyang,153********,个人,[email protected]) (3)修改功能:选中某人的姓名,可对其数据进行修改操作 (4)删除功能:选中某人姓名,可对此人的相应数据进行删除,并自动调整

tablib.Dataset()操作exl类型数据之“类方法”研究

#tablib.Dataset()操作exl类型数据之“类方法”研究 import tablib #初始化 data=tablib.Dataset() #设置列标题 data.headers=('name','where') some_collector=[('xiaodeng','enshi'),('xiaoming','hubei'),('xiaodong','enshi')] #写入数据 for key,value in some_collector: data.append((key,v