嵌入式浏览器之初识Cef
0x02 Cef基本结构
Cef3采用了多进程架构,Browser进程为主进程,负责窗口管理、界面绘制、网络交互等;Render进程负责页面渲染、V8引擎、Dom节点等。默认的进程模型中,会为每一个标签页创建一个新的Render进程。
Cef进程之间可以通过IPC进行通信,Browser和Render进程可以通过发送异步消息进行双向通信,下面通过介绍Cef结构体来了解他们之间的实现原理。
CefSettings
CefSettings结构体允许定义全局的CEF配置,经常用到的配置项如下:
- single_process 设置为true时,Browser和Render使用一个进程。此项也可以通过命令行参数”single-process”配置。
- browser_subprocess_path 设置用于启动子进程单独执行的路径。
- cache_path 设置存放缓存数据的位置。如果此项为空,某些功能使用内存缓存,多数功能使用临时的磁盘缓存。
- locale 此设置项将传递给Blink。如果此项为空,将使用默认值”en-US”。在Linux平台下此项被忽略,使用环境变量中的值,解析的依次顺序为:LANGUAE,LC_ALL,LC_MESSAGES和LANG。此项也可以通过命令行参数”lang”配置。
- log_file 此项设置文件路径用于输出debug日志,如果此项为空,默认的日志文件名为debug.log,位于应用程序所在的目录。此项也可以通过命令参数”log-file”配置。
- log_severity 此项设置日志级别,只有当前等级、或者更高等级的日志才会被记录。此项可以通过命令行参数”log-severity”配置,可以设置的值为”verbose”,”info”,”warning”,”error”,”error-report”,”disable”。
- resources_dir_path 此项设置资源文件夹的位置。如果此项为空,Windows平台下cef.pak、Linux平台下devtools_resourcs.pak、Mac OS X下的app bundle Resources目录必须位于组件目录。此项也可以通过命令行参数”resource-dir-path”配置。
- locales_dir_path 此项设置locale文件夹位置。如果此项为空,locale文件夹必须位于组件目录,在Mac OS X平台下此项被忽略,pak文件从app bundle Resources目录。此项也可以通过命令行参数”locales-dir-path”配置。
- remote_debugging_port 此项可以设置1024-65535之间的值,用于在指定端口开启远程调试。此项也可以通过命令行参数”remote-debugging-port”配置。
- command_line_args_disabled 用于禁用Cef进程命令行参数功能,只能通过CefSettings方式进行设置。
CefApp
CefApp接口提供了不同进程的可定制回调函数,每一个进程对应一个CefApp接口。CefBrowserProcessHandler对应浏览器进程的回调,CefRenderProcessHandler对应渲染进程的回调。我们应该继承CefApp、CefBrowserProcessHandler、CefRenderProcessHandler接口。如果完全使用多进程模式,可以分别在浏览器进程和渲染进程里分开继承接口
CefApp接口提供了不同进程的可定制回调函数。主要的回调函数如下:
- OnBeforeCommandLineProcessing 用于修改Cef进程命令行启动参数。
- OnRegisterCustomSchemes 用于注册自定义schemes伪协议。
- GetBrowserProcessHandler 返回Browser进程的Handler,该Handler包括了诸如OnContextInitialized的回调。
- GetRenderProcessHandler 返回定制Render进程的Handler,该Handler包含了JavaScript相关的一些回调以及消息处理的回调。
CefClient
每一个CefBrowser对象会对应一个CefClient接口,用于处理浏览器页面的各种回调信息,包括了Browser的生命周期,右键菜单,对话框,状态通知显示,下载事件,拖曳事件,焦点事件,键盘事件,离屏渲染事件等。
- OnProcessMessageReceived 在Browser收到Render进程的消息时被调用