CEF简介

一、背景

CEF:chromium embedded Framework是由Marshall Greenblatt在08年成立的一个开源项目,目的是开发一个基于Google Chromium项目的Web browser控制器。CEF目前支持大多数编程语言和操作系统,并可以轻松的整合新的和已存在的应用。设计的目的也是为了效率/性能和方便使用。基础的框架包括了借助原生库的C/C++接口,这样将主机的应用与chromium和WebKit隔离开来。它提供了浏览器控制和主机应用程序(包括支持自定义插件、协议、JavaScript对象和JavaScript扩展)之间紧密的集成。主机应用程序可以有选择地控制资源加载、导航、菜单、打印等,当利用了相同的性能和Google Chrome浏览器具备的HTML5技术。

二、依赖/相关:

CEF项目依靠一堆其它由第三方维护的项目,主要又以下:

  • Chromium:基础,网络堆栈,线程,消息机制,log,进程控制,生成Web browser。
  • WebKit:提供DOM解析,布局,事件处理,渲染,HTML5JS的API。
  • V8:JS引擎。
  • Skia:2D图形库。
  • Angle:3D图形转换,和DirectX有关。

三、版本:

  • CEF1,单进程工具调用chromium Webkit API
  • CEF2,多进程工具建立在Chromium browser
  • CEF3,多进程工具调用Chromium Content API

四、通用API用法:

所有版本的CEF都公开一个简单好用的API(让用户从Chromium和Webkit复杂的代码中分隔开来),详细如下:

  • 1.调用CefInitialize()对CEF初始化。
  • 2.调用CefRunMessageLoop() or CefDoMessageLoopWork()来在UI消息上处理事务。
  • 3.调用CreateBrowser() or CreateBrowserSync()并传递一个CefClient事例来创造一个browser窗口。
  • 4.在程序退出前调用CefShutdown()来关闭CEF。

五、CEF1

CEF1使用单进程架构,并直接将Chromium和Webkit整合到客户端应用程序中。单进程的优点包括了建设内存的使用和进一步与客户端应用的耦合。缺点有某些类型的加载内容性能低,和由于同进程中运行Flash插件的崩溃问题。

1、CEF1 API用法:

  • CefApp,此接口用来传递到CefInitialize(),和允许应用程序定制全局,如资源加载,代理。
  • CefClient,此接口用来传递到CefCreateBrowser() or CefCreateBrowserSync(),和充当单独CEF Browser事例和客户端应用程序的连接,也负责请求和显示处理的接口
  • CefBrowser,公开由浏览器提供的功能。包括前进后退导航,来源检索,加载请求等,一个CefBrowser可能有一到多个子类的CefFrame对象

2、线程注意事项

CEF1包括UI,IO和FILE线程。 UI线程创建Browser窗口,用来所有与WebKit和V8的交互,IO线程用来处理模式和网络请求。 FILE线程用于应用程序缓存和其他各种活动。

当使用CEF1时,你应该记住以下线程考虑:

  • 不要在UI线程上执行会造成阻塞的操作。这将导致严重的性能问题。
  • 如果CefInitialize()通过值为false的CefSettings.multi_threaded_message_loop被调用,那么UI线程将和主线程一样。
  • 所有WebKit和V8互为作用必须在UI线程上进行。因此,有些CEF API函数只能在UI线程上调用。有相同限制的功能会被相应地记录并关联到CEF的头文件里。
  • CefPostTask方法可以用来动态同步地进行不同线程里的任务。

3、实施细则

CEF1主要有以下实现类:

  • CefContext 代表全局CEF内容。单个CefContext对象是由CefInitialize()创建,由CefShutdown()销毁
  • CefProcess 由CefContext创建和管理的CEF线程。
  • BrowserWebKitInit 管理全局WebKit环境作为Chromium WebKit API暴露。
  • WebViewHost 提供本地窗口“wrapper”工具给WebView。这个类扩展了,提供和在某些平台上弹出部件(如选择菜单)一样的功能,WebWidgetHost。
  • CefBrowserImpl 实现CefBrowser的接口,创建WebViewHost,并提供了但个Browser实例的粘合代码。
  • BrowserWebViewDelegate 实现WebKit接口,提供CefBrowserImpl和底层的WebView之间的通信。

六、CEF3

CEF3借助Chromium Content API使用和Chromium Web 浏览器一样的多进程架构,相比于单进程的CEF1,他具有更多的优势。

  • 同时支持单进程和多进程模式。
  • 更多的代码分析通过Chromium浏览器
  • 改进的性能和由于代码路径的支持而减少的损坏
  • 新特性的快速获取
  • 大多数情况下,CEF3和Chromium浏览器拥有相同的性能和稳定特征。

1、API用法

CEF3的初始化需要考虑多进程。在Windows和Linux上的所有进程享有相同的可执行文件,或选择使用单独的可执行文件的子进程(借助CefSettings.browser_subprocess_path的值)。在Mac OS-X的所有的子进程都必须绑推一个分开的app使用。这是必要的因为在Mac OS-X的子进程必须有一个不同的Info.plist文件。

CefExecuteProcess()函数是负责执行子过程的逻辑。它检查“类型”的命令行标志来决定目前正在执行的进程类型。如果被browser进程调用(识别为没有“类型”的命令行值)它会立即返回一个为-1值。如果被调用且认为是次级进程,它会阻塞直到该进程应该退出,然后返回进程的退出代码。如果执行browser进程,应用程序会继续在标准进程初始化,被描述为“通用API的用法”部分。将cef_app.h理解为一个完成的的功能初始化和用法的描述。将Wcefclient_win.cpp wWinMain功能视作一个窗口例程。

“单进程”命令行标志或者CefSettings.single_process的值可用在一个单一的进程中运行CEF3。这是有用于调试目的,但不建议用于生产。

扫描二维码关注公众号,回复: 3769623 查看本文章

2、下面是主要CEF3接口和它们的用途的概述:

  • CefApp,此接口用来传递到CefInitialize(),和允许应用程序定制全局,如资源加载,代理。一些功能是由所有进程共享的,有些必须实现浏览器的过程中,必须在渲染过程中执行。见详情头文件的意见。
  • CefClient,此接口用来传递到CefCreateBrowser() or CefCreateBrowserSync(),和充当单独CEF Browser事例和客户端应用程序的连接,也负责请求和显示处理的接口。请求处理,显示处理等额外的接口,通过这个接口暴露。
  • CefBrowser,公开由浏览器提供的功能。包括前进后退导航,来源检索,加载请求等,一个CefBrowser可能有一到多个子类的CefFrame对象。在一个特定的过程或一个特定的线程必须调用一些方法,所以仔细阅读文档。
  • CefBrowserHost - 公开有关运行browser进程中唯一可用的browser窗口的功能。例如,检索本地父窗口句柄,或销毁browser窗口。
  • CefRenderProcessHandler - 公开WebKit和V8对渲染进程中应用程序的集成能力。通过CefApp返回此对象的一个​​实例。

3、CEF3主要有以下实现类:

  • CefMainDelegate 实现通用进程的引导逻辑。
  • CefContentClient 实现所有进程中共同的Content API回调。
  • CefContext 代表全局CEF内容在browser进程中。单个CefContext对象由CefInitialize()创建并由CefShutdown()销毁。
  • CefBrowserMainParts 实现browser进程中的引导逻辑。
  • CefContentBrowserClient 实现browser进程的ContentAPI回调。
  • CefBrowserHostImpl 实现在browser进程中CefBrowser和CefBrowserHost的接口。提供粘合代码和工具的借口来和RenderViewHost通信。
  • CefContentRendererClient 实现渲染进程中的ContentAPI回调。
  • CefBrowserImpl 实现渲染进程中的CefBrowser接口。提供粘合代码和工具的借口来和RenderView通信。

猜你喜欢

转载自blog.csdn.net/zkybeck_ck/article/details/46582557
CEF
今日推荐