cef支持各種語言和多種操作系統。在設計的時候充分考慮了性能和易用性。cef核心功能提供了c和c++的接口。cef提供了和主程序之間的通信能力(利用 custom plugins, protocols,javascrpit object 和 javascript extensions)。主應用程序可以選擇性的使用控制 資源的加載,切換, context menus, printing等。
依賴
- chromium
- webkit
- v8
- skia
- angle
線程注意事項
CEF線程有如下幾種
typedef enum {
TID_UI,
TID_DB,
TID_FILE,
TID_FILE_USER_BLOCKING,
TID_PROCESS_LAUNCHER,
TID_CACHE,
TID_IO,
TID_RENDERER,
} cef_thread_id_t;
在使用線程的時候需要注意如下幾點:
- 千萬不要阻塞UI線程
- UI線程會任務是主線程,當 CefSettings.multi_threaded_message_loop = false的時候。
- 所有的webkit和V8的交互必須用 TID_RENDERER線程
- CefPostTask 方法可以再不同線程中進行異步調用
接口
- CefApp,此接口用來傳遞到CefInitialize(),和允許應用程序定制全局,如資源加載,代理。這些功能是由所有進程共享的,有些必須實現瀏覽器的過程中,必須在渲染過程中執行。見詳情頭文件的注釋。
- CefClient,此接口用來傳遞到CefCreateBrowser() or CefCreateBrowserSync(),和充當單獨CEF Browser事例和客戶端應用程序的連接,也負責請求和顯示處理的接口。請求處理,顯示處理等額外的接口,通過這個接口暴露。
- CefBrowser,公開由瀏覽器提供的功能。包括前進后退導航,來源檢索,加載請求等,一個CefBrowser可能有一到多個子類的CefFrame對象。在一個特定的過程或一個特定的線程必須調用一些方法,所以仔細閱讀文檔。
- CefBrowserHost - 公開有關運行browser進程中唯一可用的browser窗口的功能。例如,檢索本地父窗口句柄,或銷毀browser窗口。
CefRenderProcessHandler - 公開WebKit和V8對渲染進程中應用程序的集成能力。通過CefApp返回此對象的一個實例。
進程注意事項
CEF3使用了很多不同的進程:
- Broser process- 這個進程可以認為是應該程序的主進程,當調用CefInitialize()的時候建立
- Render process- web容器(webkit和v8)在此進程中執行
- plugin process- 插件(如 Flash)
- GPU process-GPU渲染進程
- Utility process- 各種其他任務在這個進程中跑。
CefBrowser 和 CefFrame 在browser和render進程中都存在,並且傳遞一系列callbacks。 CefProcessMessage能夠在browser進中利用CefBrowser::SendProcessMessage 函數發出, 並且在CefClient::OnProcessMessageRecieved 和CefRenderProcessHandler::OnProcessMessageRecieved 接收。
重要的細節
CEF3 有如下幾個比較重要的類:
- CefMainDelegate - 用於普通進程的邏輯過程
- CefContentClient- 在普通進程 展現Content Api的回調。
- CefContext-在browser進程中,展現全局的CEF上下文。 一個單獨的CefContext對象時由CefInitialize()建立,有CefShutdown銷毀。
- CefBrowserMainParts- browser 進程的邏輯
- CefContentBrowserClient-在browser 進程展現Content Api的回調。
- CefBrowserHostImpl-是CefBrowserHost 的實現
- CefContentRendererClient- 在render 進程中展現Content Api的回調
- CefBrowserImpl- CefBrowser的實現者