官方主页: 点击打开链接 https://code.google.com/p/chromiumembedded/
CEF 简介:
嵌入式 Chromium 框架(简称 CEF) 是一个由 Marshall Greenblatt 在 2008 建立的开源项目, 它主要目的是开发一个基于 Google Chromium 的 webbrowser 控件. CEF 支持一系列的编程语言和操作系统, 并且能很容易地整合到新的或已有的工程中去.
它的设计思想政治就是易用且兼顾性能. CEF 基本的框架包含 C/C++ 程序接口, 通过本地库的接口来实现, 而这个库则会隔离宿主程序和 Chromium&Webkit 的操作细节. 它在浏览器控件和宿主程序之间提供紧密的整合, 它支持用户插件, 协议, javascript 对象以及 javascript 扩展, 宿主程序可以随意地控件资源下载, 导航, 下下文内容和打印等, 并且可以跟 Google Chrome 浏览器一起, 支持高性能和 html5 技术,
CEF 指南:
指南:
首先把这段代码插入到窗口的创建函数里面去:
- // Create an instance of our CefClient implementation. Various methods in the
- // MyClient instance will be called to notify about and customize browser
- // behavior.
- CefRefPtr<CefClient> client(new MyClient());
- // Information about the parent window, client rectangle, etc.
- CefWindowInfo info;
- info.SetAsChild(...);
- // Browser initialization settings.
- CefBrowserSettings settings;
- // Create the new browser window object asynchronously. This eventually results
- // in a call to CefLifeSpanHandler::OnAfterCreated().
CefBrowser::CreateBrowser(info, client, "http://www.google.com", settings);
这段代码你可以在 [test] 文件夹下面的 cefclient 工程里面看到.
文件结构:
include -- 这个文件夹里面放 CEF 客户应用程序所需的头文件
libcef -- 此文件夹存放 CEF 的静态库
libcef_dll -- 此文件夹 CEF 的动态拉链库
tests -- 此文件夹存放测试的例子
cefclient -- 一个简单的客户程序
unittests -- CEF 界面单元测试
浏览器事件:
应用程序通过调用 CefBrowser 和 CefFrame 的方法来处理浏览器控件事件:
a.Back, Forward, Reload and Stop Load. 控件浏览器的导航
b.Undo, Redo, Cut, Copy, Paste, Delete, Select All. 控件目标框架的选取
c.Print. 打印目标框架
d.Get Source. 以字符串的形式来获取目标框架的 HTML 源码
e.View Source. 用缓存文件来保存目的框架的 HTML 源码, 并且用系统默认的文本查看器打开
f.Load URL. 加载特定的 URL 到目标框架
g.Load String. 加载一个特定的字符串到目标框架, 通过一个随意指定的虚拟 URL
h.Load Stream. 加载一个特定的二进制文件到目标框架, 通过一个随意指定的虚拟 URL
i.Load Request, 加载一个特定的请求到目标框架
j.Execute JavaScript: 在目标框架里面执行一个特定的 Javscript 命令
k. Zoom. 缩放特定框架的网页内容
插入网景风格插件:
CEF 支持插入网景风格的插件, 插入插件的动作跟正常插入基本动态链接库的插件一样, 但是做为一个单独的 Dll, 必须通过容器来创建, 并且要用 CefRegisterPlugin()这个函数来注册到系统里面去. 你要调用这个函数的话, 你就得包含 cef_nplugin.h 这个头文件.
JavaScript 扩展:
CEF 支持能连接本地程序源代码的 Javascript 扩展, 演示程序你可以去看 cef_v8.h 进而的 CefRegisterExtension()方法, 还有 CEFClient 下面的演示例子, 你如果想得到更多的信息, 可以点下面的链接: https://code.google.com/p/chromiumembedded/wiki/JavaScriptIntegration .
用户计划:
CEF 支持注册和处理像 myscheme://mydomain 一样的用户计划, 你可去查看 cef_scheme.h 里面的 CefRegisterScheme()和 Scheme Handler 测试单元, 得到详细的说明.
框架总览:
所有的文件前缀都是 Cef
框架的建立和销毁:
CEF 的 UI 消息寄宿在一个框架建立的单线程中, 用户只负责用 CefInitialize()和 CefShutdown()来建立和销毁这个线程, 但是你如果设置了 CefSettings.multi_threaded_message_loop, 这个 UI 消息循环也可以运行在一个单独的线程里面.
引用计数:
所有的框架数都从 CefBase 这个基类继承而来, 并且所有的实例指针都用 CefRefPtr 智能指针来管理, 可以用 AddRef()和 Release()函数来自动处理引用计数.
平台无关:
CEF 框架被设计成平台无关的, 现在它支持 Windows,Mac os-x 和 Linux, 为了无缝地支持多种平台, 框架定义了一系列的平台无关的接口和类型定义.
框架接口:
CefBrowser 是主要的浏览器窗口类, 可以用静态的函数 CreateBrowser() 和 CreateBrowserSync() 来创建一个新的浏览器窗口.
CefFrame 代表一个浏览器窗口的框架, 每个浏览器窗口有一个顶层的主框架, 而这个主框架可以用 GetMainFrame() 方法得到.
CefClient 是主浏览器窗口的代表接口, 这个接口做为参数传递给 CreateBrowser()
CefRequest 代表 URL, 方法, 发送数据和头文件等这样的请求.
CefSchemeHandleFactory 类是被用来处理像 myscheme://mydomain 类似客户计划的请求
CefReadHandler 和 CefWriteHandle 是一个读写数据的简单接口.
CefV8Handler,CefV8Value 和 CefV8Context 是被用来创建和访问 JavaScript 对象.
以上内容是 Cef 的简介, 后面我将翻译怎么编译并生成一个用 CEF 控件来创建的一个简单浏览器!
CEF 中文教程(google chrome 浏览器控件) -- CEF 编译
这部分讲解 CEF 的分支信息并介绍下载编译和打包源代码
背景:
CEF 项目是做为 Chromium 的扩展项目而存在的, CEF 跟 Chromium 一样地维护两个版本, 开发版和发布版. CEF 源代码既可以手动编译, 也可以用工具自动编译
发展:
CEF 项目在不断的发展中, 你可以从这里看到整个项目的文件 http://code.google.com/p/chromiumembedded/source/browse/#svn/trunk , 因为当前的版本紧跟 Chromium, 所以不推荐拿当前的版本来开发发布版的产品. 下面的链接可以用来下载 CEF 的开发版源码:
- CEF1- http://chromiumembedded.googlecode.com/svn/trunk/cef1
- CEF3- http://chromiumembedded.googlecode.com/svn/trunk/cef3
remind: 你点开上面的链接时, 你会发现这是一个 svn 工程的目录, 如果以前是用 VSS 的, 你可能觉得 svn 很陌生, 不要尝试一个一个地去下载里面的文件. 这里有个简单的方法可以下载整个文件夹: 先下载一个 TortoiseSVN, 下完后安装, 但是你不会看到有什么的 TortoiseSVN 的运行程序, 因为它是内嵌到 Windows 里面的, 你应该在任意的盘符下面创建一个空的文件夹, 右键点击这个文件夹, 点击菜单项[TortoiseSVN] ->[export] , 在 URL 文件框里面输入上面的链接后点确定, 然后现在个工程文件都会下下来.
发布版:
CEF 随着 Chromium 发布版也提供一个最新的发布版, 推荐用户用发布版本做为开发产品的环境, 原因有如下几点:
1. 二进制的 CEF 是用特定的 Chromium 发布版编译出来的
2. 发布版的 CEF/Chromium 经过了更好的测试, 而且更加适合开发发布版的应用程序
3. 发布版更加稳定
4.CEF 发布版可以包含必要的 Chromium/WebKit 版本
5.CEF 以后的更新不会干扰用户的发布计划
CEF 版本号有如下形式: X.Y.Z, 其中 X 是 CEF 主版本号, Y 是发布版版本号, 而 Z 是 CEF 校对号, 有关 CEF 和 Chromium 版本更详细的内容, 你可以去 include/cef_version.h 里面找到, 下面的表格列出当前的 CEF 发布版本:
发布版本 | Chromium 版本 | CEF1 支持性 | CEF3 支持性 |
963 | 17 | 是 | 否 |
1025 | 18 | 是 | 否 |
1084 | 19 | 是 | 否 |
1180 | 21 | 是 | 是 |
1271 | 23 | 是 | 是 |
1364 | 25 | 是 | 是 |
1453 | 26 | 是 | 是 |
你可以在下面的链接中下载发布版的 CEF, 其中 YYYY 是发布版的版本号:
- CEF1 - http://chromiumembedded.googlecode.com/svn/branches/YYYY/cef1
- CEF3 - http://chromiumembedded.googlecode.com/svn/branches/YYYY/cef3
这里值得注意的是版本 963 和 1025 是只包含有 CEF1 的源代码, 要想了解 CEF 发布版的版本号怎么来的, 你可以点击旁边这个链接: here https://code.google.com/p/chromiumembedded/issues/detail?id=325
编译源代码:
当前支持在 Windows,Mac OS-X 和 Linux 环境下编译源代码, 而要想编译成功, 你的电脑必须至少有 4GB 的系统内存(因为我用的 Windows, 所以在 Mac 或 Linux 环境下的要求我就没有翻译了).
在编译 Chromium 和 CEF 源码之前, 你必须配置好你的编译环境:
1. 为你的操作系统和开发环境安装必要的包:
Windows 环境下点击右边的链接: http://www.chromium.org/developers/how-tos/build-instructions-windows (这个我将在下一章中给出译文)
配置好操作系统和编译环境以后, 还要用旁边的链接去下载 TortoiseSVN 工具: http://sourceforge.net/projects/tortoisesvn/files/1.6.16/Application/
2. 配置环境可以影响 GYP
CEF 目前还不支持组件开发
Windows - 如果你的操作系统里面安装了多个 Virual Studio, 你可以设置环境变量 GYP_MSVS_VERSION 为一个适当的值, 如果你想用 VS2008 来编译工作, 你应该把这个值设成 2008, 如果你想用 Vs2010 Express 来编译工程, 那你就应该把这个环境变量设成 2010e, 如果是别的 Visual Studio 版本, 那你就要去 Chomium 帮助文档去查找更详细的信息, 但是估计也应该是同一个套路, 假如你是 vs2005, 那肯定就是设成 2005 了.
自动的方法:
CEF 提供工具, 用来自动下载, 编译, 打包 Chromium 和 CEF 源代码, 这个方法对开发版和发布版是同样有用, 你可以按下面的步骤来完成自动操作:
1. 下载自动工具 automate.py:
用 SVN checkout 下面的 URL:
http://chromiumembedded.googlecode.com/svn/trunk/cef1/tools/automate /path/to/automate
2. 运行 automate.py 脚本:
在任何合适的时间, 你可以运行 automate.py 这个脚本(如每周每天每次 CEF 提交的时间), 并使用你想要的 CEF 版本.
python /path/to/automate/automate.py --download-dir=/path/to/download --url=http://chromiumembedded.googlecode.com/svn/branches/1084/cef1
如果这个操作成功了, 一个二进制形式的包会被创建在 /path/to/download/chromium/src/cef/binary_distrib
如果你要想查找完整的使用介绍, 点下面的链接: automate.README.txt https://code.google.com/p/chromiumembedded/source/browse/trunk/cef1/tools/automate/automate.README.txt
这个方法也被完美地整合到了一些自动编译系统如 TeamCity
(译完这段我感到浑身冷汗, 因为什么 TeamCity,TortioseSVN... 全都一无所知, 想想从业也三四年了, 却离 it 这条路越走越远, 在上个公司呆的两年多完全是封闭的两年多, 天天整些 CAD, 用写好的 API, 做些重复的工作, 什么新的技术都没学到, 反而把老本都蚀完了, 现在是时候奋起直追了. 但转念一想, 我还能再追几年, 以我的年纪我还能追几年? 学什么走哪块, 才能让我虽不说蒸蒸日上但却能有口盒饭吃呢?)
手动下载:
Chromium 和 CEF 可以手动下载和编译, 但这更加复杂, 所以不向所有用户推荐.
开发版:
下面这些下载的介绍仅适合 CEF1&CEF3 开发版.
1. 安装 depot_tools 并且下载 Chromium 源代码, 你可以按照这个链接的内容来做 http://dev.chromium.org/developers/how-tos/get-the-code , 也可以按照下面的四个步骤来做, 但是为了避免一些潜在的问题, 你最好设置 chromium 和 depot_tools 的下载目录尽可能的短, 并且不要包含空格和特殊字符.
A. 装一个 1.6.x 版本的 SVN 端, 并且加到你的 PATH 里面去
B. 通过 SVN 来下载 depot_tools
svn co http://src.chromium.org/svn/trunk/tools/depot_tools
C. 增加 depot_tools 的目录到你的 PATH, 在 Windows 下 depot_tools 的路径应该要放在 TortoiseSVN 的前面
D. 创建一个 Chromium 签出目录(例如,/path/to/chromium), 并且配置 gclient 如下:
- cd /path/to/chromium
- gclient config http://src.chromium.org/chrome/trunk/src
remind: 上面这段你只要复制到 cmd 里面去运行就可以了
2. 在 CEF 的顶层目录下查看 CHROMIUM_BUILD_COMPATIBILITY.txt, 并找到你需要的 Chromium 版本, 这可能会发生改变, 因为 CEF 是随着最新版本的 Chromium 改变而改变的
3. 更新 Chromium 到合适的版本
- cd /path/to/chromium
- gclient sync --revision src@chromium_revision --jobs 8 --force
4. 下载 CEF 源代码到 "cef" 文件夹, 而且这个文件夹必须包含在 Chromium 的 "src" 文件夹目录下, 你最好只下载 CEF1 或 CEF3 而不要两者都下, 假设你的 Chromium 源代码下载在 "/path/to/chromium/src", 那么你的 CEF 源代码就应该放在 "/path/to/chromium/src/cef". 注意不管你下的是 CEF1 或 CEF3, 文件夹名都必须命名为 "cef"
- cd /path/to/chromium/src
- svn co http://chromiumembedded.googlecode.com/svn/trunk/cef1 cef
发布版:
发布版和开发版基本的操作是一样的, 只不过是把有 Debug 的地方改成 Release 而已. 具体的你可以查看原文链接.
手动编译:
1. 运行 cef_create_project 脚本 (windows 下用. bat, OS-X 和 linux 下用. sh) 去产生一个在 GYP 配置下的编译文件
- cd /path/to/chromium/src/cef
- ./cef_create_projects.sh
2. 编译 CEF
windows 下你可以直接用 Visual Studio 的. sln 文件编译, 做为替代的方法, 你也可以在命令行下运行脚本 build_projects 来编译整个工程,
- cd /path/to/chromium/src/cef/tools
- build_projects.sh Debug
手动打包:
当编译好开发版和发布版后, 你可以用 make_distrib 工具 (windows 用. bat,OS-X 和 Linux 用. sh) 去创建一个二进制分发包.
- cd /path/to/chromium/src/cef/tools
- make_distrib.sh
如果这个过程成功了, 一个二进制的分发包会生成在 / path/to/chromium/src/cef/binary_distrib 目录中.
你可以去 make_distrib.py 脚本下看到更多的使用信息.
一般用法
使用 CEF 便捷的创建一个全功能的内建浏览器如下所示:
// Define an instance of our CefHandler implementation. Various methods in the MyHandler // instance will be called to customize browser behavior. CefRefPtr<CefHandler> handler(new MyHandler()); // Provide information about the parent window, client rectangle, etc. CefWindowInfo info = {...}; // Create the new browser window object, which eventually results in a call to // MyHandler::HandleAfterCreated(). CefBrowser::CreateBrowser(info, false, handler, L"http://www.google.com");
在 tests 目录下有一个客户端程序的示例, 叫 cefclient.
文件结构
CEF 资料库结构如下:
include -- 包括用于 CEF 客户端程序的 include 文件.
libcef -- libcef 实现.
libcef_dll -- libcef C API 和 DLL 实现.
tests -- 测试程序.
cefclient -- CEF 客户端应用程序示例.
unittests -- CEF 接口单元测试.
浏览器通知
浏览器通知是通过注册的委托接口由浏览器发到客户端程序的通知, CefHandler 是最主要的委托接口, CefJSHandler 则用于实现自定义的 Javascript 对象.
CefHandler 支持以下接口:
窗口创建之前 (HandleBeforeCreated), 客户端可用之取消与定制浏览器窗口创建过程.
窗口创建之后(HandleAfterCreated). 可用于创建自定义的 CefJSHandler 对象.
地址栏更新(HandleAddressChange). 将地址栏更改为指定的字符串, 通知发生于导航提交后与页面加载前.
标题更新(HandleTitleChange). 将标题更改为指定的字符串, 发生在页面加载中.
浏览前(HandleBeforeBrowse). 可用于取消导航, 该事件的信息包括 URL,Post 数据, 请求头.
开始加载(HandleLoadStart).
加载结束 (HandleLoadEnd).
加载错误(HandleLoadError). 加载过程中遇到错误, 应用程序可提供自定义的错误页面.
资源加载前 (HandleBeforeResourceLoad). 应用程序可提供替代的数据源 (比如内存中的缓存)或者取消加载.
显示菜单前(HandleBeforeMenu). 可用于取消上下文菜单显示或定制菜单, 默认情况下, 浏览器根据上下文显示基本的菜单.
获取菜单标签(HandleGetMenuLabel). 在默认菜单显示前, 每个菜单项调用一次, 可用于将英文默认内容改为其它语言.
菜单动作(HandleMenuAction). 用户从默认上下文菜单选择了一个选项, 可用自己的方式来处理动作.
打印选项(HandlePrintOptions). 打印设置对话框显示前调用, 可用于定制页面大小, 方向与边距等.
打印页眉页脚 (HandlePrintHeaderFooter). 在页面视图输出到打印上下文, 但是页面结束前, 可在预定义的 6 个位置 (上左, 上中, 上右, 下左, 下中, 下右) 插入自定义的页眉, 页脚字符串. 该事件附带的信息包括当前 URL, 标题, 页码, 总页数, 打印上下文, 页边距与 DPI 拉伸比.
JavaScript 警告 (HandleJSAlert). 应用程序可自定义 Javascript Alert 窗口.
JavaScrip 确认 (HandleJSConfirm). 应用程序可自定义 Javascript Comfirm 窗口
JavaScrip 提示 (HandleJSPrompt). 应用程序可自定义 Javascript Prompt 窗口
JavaScript Window 对象绑定 (HandleJSBinding). 应用程序将用户定义的方法和变量附加到 frame 的 window 对象上
Window 关闭前 (HandleBeforeWindowClose). 窗口关闭前
获得焦点(HandleTakeFocus). 浏览器组件失去焦点前调用
设置焦点(HandleSetFocus). 浏览器组件请求焦点前调用
键盘事件(HandleKeyEvent). 浏览器组件接收到键盘事件时
提示 (HandleTooltip). 用于修改 tooltip 文字
控制台消息 (HandleConsoleMessage). 用于显示控制台消息.
查询结果(HandleFindResult). 用于自定义查找结果显示处理
CefV8Handler 支持以下通知:
执行事件(Execute). 应用程序执行指定的函数, 该事件提供所有的 Javascript 参数, 而且应用程序能指定返回值
浏览器事件
浏览器事件由客户端应用程序通过 CefBrowser 和 CefFrame 的函数发送给浏览器:
后退, 前进, 重新加载与停止加载, 用于控制浏览器导航.
撤消, 重做, 剪切, 复制, 粘贴, 删除, 全选, 用于控制目标区域内容.
打印. 打印目标框架.
查看源代码. 将目标框架的 HTML 源代码保存到临时文件, 并用默认的文本查看程序打开之
加载 URL. 在指定框架中加载指定 URL
载入字符串. 根据一个假 URL 在指定框架中加载某个字符串
加载流. 根据一个假 URL, 在指定框架中加载二进制数据
加载请求. 在指定框架中加载请求(URL, method, request data 与 headers) .
执行脚本. 在目标框架中执行任意 Javascript 命令
内嵌 NPAPI 插件
CEF 支持创建 Netscape-style 内嵌插件, 使用相同 NPAPI 的内嵌插件和标准的 DLL 插件行为相同, 但是, 相对于使用独立的 DLL, 内嵌插件由容器应用程序创建, 并通过调用 CefRegisterPlugin()注册到系统, 如果要直接使用这一功能, 需要 include cef_nplugin.h .
JavaScript 扩展
CEF 支持可以和原生应用程序代码交互的 Javascript 扩展, 参见 cef.h 的 CefRegisterExtension() 函数和 cefclient 示例程序的 "JavaScript Extension Handler" 以及 "UI App Example" 测试 .
自定义 Schemes
CEF 支持注册与处理自定义 scheme, 类似于 myscheme://mydomain. 参见 cef.h 中的 CefRegisterScheme()函数与示例应用程序 cefclient 中的 "Scheme Handler" 测试.
框架实现概览
CEF 所有的类以 Cef 为前缀.
框架准备与拆卸
UI 消息循环由框架创建的一个单独线程处理, 客户端程序应负责通过分别调用 CefInitialize()和 CefShutdown() 来为每个进程准备与关闭这一线程.
引用计数
所有实现了 CefBase 接口的框架类与对象指针都由 CefRefPtr 智能指针实现来处理, 通过调用 AddRef()和 Release()自动处理引用计数.
平台无关
CEF 框架被设计成平台无关, 需要当前我们仅支持 windows 平台, 但是我们计划将来支持其它平台. 为了尽可能减少双平台支持带来的麻烦, 框架定义了一系列实现无关的接口与类型定义包装跨平台的行为.
线程安全
框架的所有接口实现必须是跨线程访问安全的, CefThreadSafeBase 模版提供原子的 AddRef() 和 Release() 实现, 还提供 Lock() 和 Unlock()方法以同步方式访问代码块.
框架接口
框架定义了如下接口:
CefBrowser 是主要的浏览器 host 类, 通过它的静态方法 CefBrowser::CreateBrowser()方法创建新浏览器窗口.
CefFrame 表示浏览器窗口里的一个框架 (frame), 每个浏览器窗口都有一个顶级的主框架, 可通过 CefBrowser::GetMainFrame() 方法访问之.
CefHandler 是传给 CefBrowser::CreateBrowser()方法的最主要委托接口.
CefRequest 表示请求数据, 比如 url, method, post data 和 headers.
CefPostData 和 CefPostDataElement 表示可能是请求一部分的 post 数据.
CefSchemeHandlerFactory 和 CefSchemeHandler 用于处理像 myscheme://mydomain 这样的自定义 scheme.
CefStreamReader, CefStreamWriter, CefReadHandler 和 CefWriteHandler 读写数据的简单的接口.
CefV8Handler 和 CefV8Value 用于创建和访问 Javascript 对象.
来源: https://blog.csdn.net/mergerly/article/details/18713439