什么是CEF
Chromium Embedded Framework(Chromium嵌入式框架)
CEF是多进程,
browser作为主进程:负责窗口管理,界面绘制和网络交互
Render进程:负责Blink的渲染和Js的执行
默认会为每个标签页创建一个新的Render进程。其他进程按需创建比如GPU进程
一个CefClient实现可以在任意数量的Browser进程中共享
CefClient:是主浏览器窗口的代表接口,处理浏览器页面的各种回调信息,包括Browser的生命周期,右键菜单,对话框,状态通知显示,下载事件,拖拽事件,焦点事件,键盘事件,离屏渲染事件。这个接口做为参数传递给CreateBrowser()
CefV8Handler,CefV8Value和CefV8Context是被用来创建和访问JavaScript对象
默认情况主程序进程会被创建多次
CefV8Handler
V8 handler 创建的有效线程包含render进程的(main thread (TID_RENDERER) and WebWorker threads)
browser
当Browser对象创建后OnAfterCreated() 方法立即执行
OnProcessMessageReceived
OnProcessMessageReceived在Browser收到Render进程的消息时被调用 也会在Render收到Browser消息的时候调用 是各自类里面的方法
常用线程
TID_UI
浏览器进程的主线程,如果使用CefSettings.multi_threaded_message_loop=false来调用CefInitialize(),则此线程同就应用程序主线程是同一个。
TID_IO
浏览器进程用来处理IPC及网络消息的线程。
TID_FILE*
浏览器进程用来与文件系统打交道的线程。阻塞操作应该在此线程或由客户程序创建的CefThread中运行。
TID_RENDERER
渲染进程中的主线程。所有的Blink及V8交互必须在此线程中执行
CefExecuteProcess
CefExecuteProcess()方法来检测是否要启动其它的子进程,会分析type参数 如果为空就说明是browser进程,然后回溯去创建browser进程相关内容,如果type参数不为空就调用content::ContentMain方法,在OnContextInitialized方法里面会创建SimpleHandler 传递给CefBrowserHost::CreateBrowser
Browser进程是需要CefApp(SimpleApp实现了这个接口) 和CefClient(SimpleHandler实现了这个接口)但是Render进程只是CefApp
和JS的三种交互方式
- 在native代码中通过CefFrame::ExecuteJavaScript()来执行JavaScript代码
- 将函数或对象绑定到CefFrame对应的window对象上,JS代码通过window对象访问native代码导出的函数或对象
- 使用CefRegisterExtension()注册JS扩展,JS直接访问注册到JS Context中的对象