官方主页:  点击打开链接

CEF简介:

嵌入式Chromium框架(简称CEF) 是一个由Marshall Greenblatt在2008建立的开源项目,它主要目的是开发一个基于Google Chromium的Webbrowser控件。CEF支持一系列的编程语言和操作系统,并且能很容易地整合到新的或已有的工程中去。

它的设计思想政治就是易用且兼顾性能。CEF基本的框架包含C/C++程序接口,通过本地库的接口来实现,而这个库则会隔离宿主程序和Chromium&Webkit的操作细节。它在浏览器控件和宿主程序之间提供紧密的整合,它支持用户插件,协议,javascript对象以及javascript扩展,宿主程序可以随意地控件资源下载,导航,下下文内容和打印等,并且可以跟Google Chrome浏览器一起,支持高性能和Html5 技术,

CEF指南:

指南:

首先把这段代码插入到窗口的创建函数里面去:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片

  1. // Create an instance of our CefClient implementation. Various methods in the
  2. // MyClient instance will be called to notify about and customize browser
  3. // behavior.
  4. CefRefPtr<CefClient> client(newMyClient());
  5. // Information about the parent window, client rectangle, etc.
  6. CefWindowInfo info;
  7. info.SetAsChild(...);
  8. // Browser initialization settings.
  9. CefBrowserSettings settings;
  10. // Create the new browser window object asynchronously. This eventually results
  11. // in a call to CefLifeSpanHandler::OnAfterCreated().
  12. CefBrowser::CreateBrowser(info, client, "http://www.google.com", settings);

这段代码你可以在[test]文件夹下面的cefclient工程里面看到。

文件结构:

include -- 这个文件夹里面放CEF客户应用程序所需的头文件

libcef -- 此文件夹存放CEF的静态库

libcef_dll -- 此文件夹CEF的动态拉链库

tests -- 此文件夹存放测试的例子

cefclient -- 一个简单的客户程序

unittests --  CEF界面单元测试

浏览器事件:

插入网景风格插件:

JavaScript扩展:

用户计划:

框架总览:

框架的建立和销毁:

引用计数:

平台无关:


这部分讲解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

编译源代码:

1.为你的操作系统和开发环境安装必要的包:

2.配置环境可以影响GYP

自动的方法:

1.下载自动工具 automate.py:

用SVN checkout下面的URL:

<span class="pln">http</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="com" style="color: rgb(136, 0, 0);">//chromiumembedded.googlecode.com/svn/trunk/cef1/tools/automate /path/to/automate</span>

2.运行automate.py脚本:

<span class="pln">python </span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">path</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">to</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">automate</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">automate</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">py </span><span class="pun" style="color: rgb(102, 102, 0);">--</span><span class="pln">download</span><span class="pun" style="color: rgb(102, 102, 0);">-</span><span class="pln">dir</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="str" style="color: rgb(0, 136, 0);">/path/</span><span class="pln">to</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">download </span><span class="pun" style="color: rgb(102, 102, 0);">--</span><span class="pln">url</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln">http</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="com" style="color: rgb(136, 0, 0);">//chromiumembedded.googlecode.com/svn/branches/1084/cef1</span>

如果这个操作成功了,一个二进制形式的包会被创建在  /path/to/download/chromium/src/cef/binary_distrib
如果你要想查找完整的使用介绍,点下面的链接:  automate.README.txt
这个方法也被完美地整合到了一些自动编译系统如 TeamCity
(译完这段我感到浑身冷汗,因为什么TeamCity、TortioseSVN...全都一无所知,想想从业也三四年了,却离it这条路越走越远,在上个公司呆的两年多完全是封闭的两年多,天天整些CAD,用写好的API,做些重复的工作,什么新的技术都没学到,反而把老本都蚀完了,现在是时候奋起直追了。但转念一想,我还能再追几年,以我的年纪我还能追几年? 学什么走哪块,才能让我虽不说蒸蒸日上但却能有口盒饭吃呢?)

手动下载:

Chromium和CEF可以手动下载和编译,但这更加复杂,所以不向所有用户推荐。

开发版:

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
<span class="pln">  svn co http</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="com" style="color: rgb(136, 0, 0);">//src.chromium.org/svn/trunk/tools/depot_tools</span>

C. 增加depot_tools的目录到你的PATH,在Windows下depot_tools的路径应该要放在TortoiseSVN的前面

D. 创建一个Chromium签出目录(例如,/path/to/chromium),并且配置gclient如下:
<span class="pln">cd </span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">path</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">to</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">chromium
gclient config http</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="com" style="color: rgb(136, 0, 0);">//src.chromium.org/chrome/trunk/src</span>

remind:  上面这段你只要复制到cmd里面去运行就可以了

2. 在CEF的顶层目录下查看CHROMIUM_BUILD_COMPATIBILITY.txt,并找到你需要的Chromium版本,这可能会发生改变,因为CEF是随着最新版本的Chromium改变而改变的
3. 更新Chromium到合适的版本
<span class="pln">cd </span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">path</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">to</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">chromium
gclient sync </span><span class="pun" style="color: rgb(102, 102, 0);">--</span><span class="pln">revision src@chromium_revision </span><span class="pun" style="color: rgb(102, 102, 0);">--</span><span class="pln">jobs </span><span class="lit" style="color: rgb(0, 102, 102);">8</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">--</span><span class="pln">force</span>

4. 下载CEF源代码到"cef"文件夹,而且这个文件夹必须包含在Chromium的"src"文件夹目录下,你最好只下载CEF1或CEF3而不要两者都下,假设你的Chromium源代码下载在"/path/to/chromium/src",那么你的CEF源代码就应该放在"/path/to/chromium/src/cef"。注意不管你下的是CEF1或CEF3,文件夹名都必须命名为"cef"

<span class="pln">cd </span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">path</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">to</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">chromium</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">src
svn co http</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="com" style="color: rgb(136, 0, 0);">//chromiumembedded.googlecode.com/svn/trunk/cef1 cef</span>

发布版:

手动编译:

1.运行cef_create_project脚本(windows下用.bat, OS-X和linux下用.sh)去产生一个在GYP配置下的编译文件

<span class="pln">cd </span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">path</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">to</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">chromium</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">src</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">cef
</span><span class="pun" style="color: rgb(102, 102, 0);">./</span><span class="pln">cef_create_projects</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">sh</span>

2.编译CEF

windows下你可以直接用Visual Studio 的.sln文件编译,做为替代的方法,你也可以在命令行下运行脚本build_projects来编译整个工程,
<span class="pln">cd </span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">path</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">to</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">chromium</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">src</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">cef</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">tools
build_projects</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">sh </span><span class="typ" style="color: rgb(102, 0, 102);">Debug</span>

手动打包:

当编译好开发版和发布版后,你可以用make_distrib工具(windows用.bat,OS-X和Linux用.sh)去创建一个二进制分发包。
<span class="pln">cd </span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">path</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">to</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">chromium</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">src</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">cef</span><span class="pun" style="color: rgb(102, 102, 0);">/</span><span class="pln">tools
make_distrib</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">sh</span>

如果这个过程成功了,一个二进制的分发包会生成在/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. CefWindowInfoinfo= {...}; // 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.
  • CefStreamReaderCefStreamWriterCefReadHandler 和 CefWriteHandler 读写数据的简单的接口.
  • CefV8Handler 和 CefV8Value 用于创建和访问Javascript对象.

CEF中文教程(google chrome浏览器控件) -- CEF简介相关推荐

  1. python webkit内核_Winform调用WebKitBrowser,基于chrome内核WebKit的浏览器控件

    在C#中,默认的WebBrowser控件默认使用的是IE的core,而IE的种种遭人吐槽的诟病使我不敢轻易使用WebBrowser,因此,打算使用Chrome的内核替换IE.Chrome的内核使用的是 ...

  2. net中winform教程 浏览器控件,还是微软的WebView2最好用

    如果想在Winform项目中使用浏览器控件,可能想到的第一个控件就是微软自带的WebBrowser,可这个不争气的家伙,从出现到现在,没有一丁点的升级,即使身为Net程序员,也不得不对它竖起了中指.不 ...

  3. Winform中将WebBrower浏览器控件由IE内核修改为Chrome的WebKit内核

    场景 Winform中自带一个浏览器控件WebBrower控件,使用此控件可以很轻易的实现一个桌面端的 浏览器. 新建Winform程序,然后在设计页面在工具箱中拖拽一个WebBrower控件. 然后 ...

  4. Linux debian 11上安装 Google Chrome浏览器教程

    Google Chrome简介 Google Chrome是世界上最受欢迎的网络浏览器.它是为现代网络构建的快速,安全的浏览器.Chrome不是开放源代码的浏览器,也不包含在官方Debian存储库中. ...

  5. java程序获取外部java程序的控件,将 Java 小程序迁移到 Microsoft J# 浏览器控件-JSP教程,Java技巧及代码...

    visual j# .net 小组 microsoft corporation 摘要:通过 microsoft j# 浏览器控件,开发人员可以将所编写的在 java 虚拟机上运行的 java 小程序迁 ...

  6. Silverlight4.0教程之WebBrowser控件(Silverlight内置HTML浏览器控件)

    微软于PDC2009上发布Silverlight 4 Beta版,微软在Silverlight 4版本中处理了约8000个的Silverlight终端用户的请求,加入了一系列另开发人员兴奋的新特性,最 ...

  7. C# .NET 6.0已经取消了Framework 4.8的WebBrowser控件,几款NuGet中的浏览器控件介绍

    即使在C# .NET 6.0..NET 7.0在选择工具箱项COM组件添加Microsoft Web Browser,工具箱也没有WebBrowser控件. WebBrowser控件: WebBrow ...

  8. Google Chrome浏览器可能在您不知情的情况下破坏了您的测试

    by Robert Axelsen 罗伯特·阿克森(Robert Axelsen) Google Chrome浏览器可能在您不知情的情况下破坏了您的测试 (Google Chrome might ha ...

  9. Ubuntu20.04系统如何安装google chrome浏览器

    https://baijiahao.baidu.com/s?id=1622595992346821550&wfr=spider&for=pc Ubuntu20.04系统如何安装goog ...

最新文章

  1. HDU 5696 区间的价值 暴力
  2. 为啥总让我“先去博客园其他网站逛逛”?
  3. spinbox的valuechanged 不响应键盘_键盘的选择实在太多,一个国产外设品牌最新旗舰机械键盘青轴版...
  4. linux rc.local权限,Linux开机启动rc.local不执行分析
  5. JAVA分布式架构的演变及解决方案
  6. 通信原理实验(〇):音频信号的播放蒙特卡洛模拟
  7. 安装包 — 夜神模拟器下载地址
  8. 主成分分析(PCA)Principal Component Analysis
  9. 计算机信息科学学科分类,-学科分类与代码.doc
  10. b站视频-尚硅谷jQuery教程张晓飞老师-笔记(二)
  11. LIO-SAM后端中的回环检测及位姿计算
  12. java微信公众号开发之配置服务器
  13. 2417. Loan Repayment
  14. 机械结构day_13
  15. [韩国KBS][伟大的遗产]
  16. sprintf() 格式化输出函数
  17. 2021-6-28 项目实训-研究生管理系统
  18. oracle tcp.validnode_checking,使用tcp.validnode_checking允许、限制机器访问数据库
  19. 什么软件可以将win窗口进行置顶_电脑极简指南,这5个方法可以帮你节约生命...
  20. List 之按照中文拼音首字母排序

热门文章

  1. 全国各IT领军城市软件和服务外包Q群
  2. 童鞋们,我模拟了Google的电吉他,可录音,支持键盘
  3. Android设备修改host文件以及修改设备网关
  4. linux系统查看usb转串口驱动,Linux usb转串口驱动
  5. 电力电子技术(14)——整流电路的有源逆变工作状态
  6. Android展示PDF文件(文字,签章,签名)
  7. [PWN]/瑞士军刀
  8. postgresql encode函数
  9. GitHub克隆下载加速
  10. Altium Designer 2023介绍