翻译:CEF入门教程

本文翻译自:https://bitbucket.org/chromiumembedded/cef/wiki/Tutorial.md

介绍

这个教程讲解如何创建一个使用CEF3的简单应用程序。它是参考cefsimple 示例工程。更全面的CEF使用信息请访问一般用法wiki页面

开始

CEF提供了一个实例工程使得开发CEF开发非常简单。只需浏览CEF项目的网站,然后跟着一步步的教程操作。本教程所链接的源代码文件都是当前CEF3项目的master分支,可能与下载到的CEF工程略有不同。

加载自定义URL

cefsimple程序默认加载google.com,但是你可以将其改成自定义的URL。加载不同的URL最简单的方法是通过命令行参数。

# Load the local file “c:\example\example.html”
cefsimple.exe --url=file://c:/example/example.html

你也可以编辑源代码cefsimple/simple_app.cc然后重新编译程序来加载你自定义的默认URL。

// Load the local file “c:\example\example.html”
…
if (url.empty())
  url = "file://c:/example/example.html";
…

应用程序组件

所有的CEF应用程序都具有以下主要的组件:

  1. CEF动态库(Widnows系统上是libcef.dll,Linux系统上是libcef.so,OS X系统上是“Chromium Embedded Framework.framework”)
  2. 支持文件(.pak 和 .bin、二进制blobs等等)
  3. 资源文件(html/js/css用于内置功能和字符串等等)
  4. 客户端可执行文件(例子中的cefsimple)

每个基于CEF的应用程序的CEF动态库、支持文件、资源文件都是相同的。它们包含在CEF发行包的Debug/Release或者Resources目录中。参阅CEF二进制发行包中包含的README.txt文件,以获取哪些文件是必须和哪些文件是可以安全的忽略的详细信息。有关每个平台所需应用程序布局的详细说明,请参考下文。

60秒了解框架

下面列表概述了本教程的主要重点:

阅读一般用法wiki页面来获取上述几点的完整说明。

源代码

cefsimple应用程序初始化CEF然后创建一个浏览器出弹窗口。所有浏览器窗口关闭后,应用程序终止。程序流程如下:

  1. 操作系统执行browser进程的入口点函数(main或者browser )。
  2. 在入口点函数:
    1. 创建一个处理进程级别回调的SimpleApp对象的实例用。
    2. 初始化CEF然后运行CEF消息循环。
  3. 初始化CEF之后,调用SimpleApp::OnContextInitialized()。这个方法:
    1. 创建SimpleHandler的单例。
    2. 使用CefBrowserHost::CreateBrowser()创建一个浏览器窗口。
  4. 所有浏览器共享SimpleHandler实例,该实例负责自定义浏览器行为并处理与浏览器相关的回调(生命周期,加载状态,标题显示等)。
  5. 当浏览器窗口关闭时,将调用SimpleHandler::OnBeforeClose()。 当所有浏览器窗口都关闭后,OnBeforeClose实现退出CEF消息循环以退出应用程序。

您下载的CEF二进制发布包可能会包含较新的版本。但是这些一般的概念会保持不变。

入口点函数

应用程序的执行从browser进程的入口点函数开始。这个函数负责初始化CEF和任何操作系统相关的对象。比如,在Linux系统它初始化X11 错误处理和在OS X系统分配Cocoa必要的对象。OS X为辅助进程提供单独的入口点函数。

SimpleApp

SimpleApp负责处理进程级别的回调。它提供有些接口/方法是被多个进程共享的,有些是只为某个特定进程。比如CefBrowserProcessHandler接口只能被browser进程调用。CefRenderProcessHandler接口只能被render进程调用。注意GetBrowserProcessHandler()必须返回this,这是因为SimpleApp同时实现了CefApp和CefBrowserProcessHandler。阅读一般用法wiki页面或者API头文件来获取更多关于CefApp和相关接口。

SimpleHandler

SimpleHandler负责处理浏览器级别相关的回调。这些回调都在browser进程中执行。在本例子中我们为所有浏览器使用同一个CefClient实例,但您的应用程序可以根据需要使用不同的CefClient实例。阅读一般用法wiki页面或者API头文件来获取更多关于CefClient和相关接口。 共享的实现:cefsimple/simple_handler.h,cefsimple/simple_handler.cc Windows平台的实现:cefsimple/simple_handler_win.cc Linux平台的实现:cefsimple/simple_handler_linux.cc Mac OS X平台的实现:cefsimple/simple_handler_mac.mm

构建步骤

编译步骤因平台而异。浏览二进制发行包中包含的CMake文件,以全面了解所有必需的步骤。 所有平台通用的构建步骤通常可归纳如下:

  1. 编译libcef_dll_wrapper静态库
  2. 编译应用程序源代码文件。链接libcef动态库和libcef_dll_wrapper静态库。
  3. 复制库和资源文件到输出目录。

Windows平台构建步骤

  1. 编译libcef_dll_wrapper静态库
  2. 编译/链接cefsimple.exe
    • 必须的源代码文件包括:cefsimple_win.cc, simple_app.cc, simple_handler.cc, simple_handler_win.cc.
    • 必须的链接库包括:comctl32.lib, shlwapi.lib, rcprt4.lib, libcef_dll_wrapper.lib, libcef.lib, cef_sandbox.lib。注意cef_sandbox.lib(需要sandbox支持)是一个静态库,当前必须由Visual Studio 2015 Update 3编译,其他Visual Studio版本不能编译。如何禁用sandbox支持请参阅cefsimple_win.cc的注释。
    • 资源文件cefsimple.rc。
    • cefsimple.exe.manifest和compatibility.manifest的Manifest文件。
  3. 复制Resources目录的文件到输出目录。
  4. 复制Debug/Release目录的文件到对应的输出目录。

对于2526分支,最终的目录结构如下:

Application/
    cefsimple.exe  <= cefsimple应用程序可执行文件
    libcef.dll <= cef动态库
    icudtl.dat <= unicode支持数据文件
    libEGL.dll, libGLESv2.dll, ... <= 加速合成支持库
    cef.pak, devtools_resources.pak, ... <= 非本地化的资源和字符串
    natives_blob.bin, snapshot_blob.bin <= V8 相关文件
    locales/
        en-US.pak, ... <= 本地化的资源和字符串

Linux平台构建步骤

  1. 编译libcef_dll_wrapper静态库
  2. 编译/链接cefsimple
    • 必须的源代码文件包括:cefsimple_linux.cc, simple_app.cc, simple_handler.cc, simple_handler_linux.cc
    • 必须的链接库包括:libcef_dll_wrapper.a, libcef.so and dependencies(使用“pkg-config”工具在构建时识别).
    • 配置rpath用于在当前目录发现libcef.so(-Wl,-rpath,.)或者使用LD_LIBRARY_PATH环境变量。
  3. 复制Resources目录的文件到输出目录。
  4. 复制Debug/Release目录的文件到对应的输出目录。
  5. 设置SUID权限用于支持sandbox。请参阅必要命令的二进制分发构建输出。

对于2526分支,最终的目录结构如下:

Application/
    cefsimple <= cefsimple应用程序可执行文件
    chrome-sandbox <= sandbox支持库
    libcef.so <= cef库
    icudtl.dat <= unicode支持数据
    cef.pak, devtools_resources.pak, ... <= 非本地化的资源和字符串
    natives_blob.bin, snapshot_blob.bin <= V8 相关文件
    locales/
        en-US.pak, ... <= 本地化的资源和字符串
    files/
        binding.html, ... <= cefclient应用程序资源文件

Mac OS X平台构建步骤

  1. 编译libcef_dll_wrapper静态库
  2. 编译/链接/打包cefsimple Helper
    • 必须的源代码文件包括:process_helper_mac.cc
    • 必须的链接frameworks包括:AppKit.framework
    • App bundle配置cefsimple/mac/helper-Info.plist
    • 这里描述加载CEF Framework
  3. 编译/链接/打包cefsimple
    • 必须的源代码文件包括:cefsimple_mac.mm, simple_app.cc, simple_handler.cc, simple_handler_mac.mm
    • 必须的链接frameworks包括:AppKit.framework
    • App bundle配置cefsimple/mac/Info.plist
    • 这里描述加载CEF Framework
  4. 在cefsimple.app bundle里面创建一个Contents/Frameworks目录。复制以下文件到目录:cefsimple Helper.app、Chromium Embedded Framework.framework 对于2526分支,最终的目录结构如下:
cefsimple.app/
    Contents/
        Frameworks/
            Chromium Embedded Framework.framework/
                Chromium Embedded Framework <= 主应用库
                Resources/
                    cef.pak, devtools_resources.pak, ... <= 非本地化的资源和字符串
                    icudtl.dat <= unicode支持数据
                    natives_blob.bin, snapshot_blob.bin <= V8 相关文件
                    en.lproj/, ... <= 本地化的资源和字符串
            cefsimple Helper.app/
                Contents/
                    Info.plist
                    MacOS/
                        cefsimple Helper <= 辅助可执行程序
                    Pkginfo
        Info.plist
        MacOS/
            cefsimple <= cefsimple应用可执行程序
        Pkginfo
        Resources/
            cefsimple.icns, ... <= cefsimple应用程序资源