轉載自:http://www.cnblogs.com/think/archive/2011/10/06/CEF-genericUsage.html
一般用法
使用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. CefWindowInfo info = {...}; // 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.
- CefStreamReader, CefStreamWriter, CefReadHandler 和 CefWriteHandler 讀寫數據的簡單的接口.
- CefV8Handler 和 CefV8Value 用于創建和訪問Javascript對象.