轉(zhuǎn)載自:http://www.cnblogs.com/think/archive/2011/10/06/CEF-genericUsage.html
一般用法
使用CEF便捷的創(chuàng)建一個(gè)全功能的內(nèi)建瀏覽器如下所示:
// 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目錄下有一個(gè)客戶端程序的示例,叫cefclient。
文件結(jié)構(gòu)
CEF資料庫(kù)結(jié)構(gòu)如下:
- include -- 包括用于CEF客戶端程序的include文件。
- libcef -- libcef實(shí)現(xiàn)。
- libcef_dll -- libcef C API 和 DLL 實(shí)現(xiàn).
- tests -- 測(cè)試程序.
- cefclient -- CEF客戶端應(yīng)用程序示例。
- unittests -- CEF接口單元測(cè)試。
瀏覽器通知
瀏覽器通知是通過(guò)注冊(cè)的委托接口由瀏覽器發(fā)到客戶端程序的通知, CefHandler是最主要的委托接口, CefJSHandler則用于實(shí)現(xiàn)自定義的Javascript對(duì)象。
CefHandler支持以下接口:
- 窗口創(chuàng)建之前 (HandleBeforeCreated),客戶端可用之取消與定制瀏覽器窗口創(chuàng)建過(guò)程。
- 窗口創(chuàng)建之后(HandleAfterCreated). 可用于創(chuàng)建自定義的CefJSHandler對(duì)象。
- 地址欄更新(HandleAddressChange). 將地址欄更改為指定的字符串,通知發(fā)生于導(dǎo)航提交后與頁(yè)面加載前。
- 標(biāo)題更新(HandleTitleChange). 將標(biāo)題更改為指定的字符串,發(fā)生在頁(yè)面加載中。
- 瀏覽前(HandleBeforeBrowse). 可用于取消導(dǎo)航,該事件的信息包括URL,Post數(shù)據(jù),請(qǐng)求頭.
- 開始加載(HandleLoadStart).
- 加載結(jié)束 (HandleLoadEnd).
- 加載錯(cuò)誤(HandleLoadError). 加載過(guò)程中遇到錯(cuò)誤,應(yīng)用程序可提供自定義的錯(cuò)誤頁(yè)面.
- 資源加載前 (HandleBeforeResourceLoad). 應(yīng)用程序可提供替代的數(shù)據(jù)源 (比如內(nèi)存中的緩存)或者取消加載.
- 顯示菜單前(HandleBeforeMenu). 可用于取消上下文菜單顯示或定制菜單,默認(rèn)情況下,瀏覽器根據(jù)上下文顯示基本的菜單.
- 獲取菜單標(biāo)簽(HandleGetMenuLabel).在默認(rèn)菜單顯示前,每個(gè)菜單項(xiàng)調(diào)用一次,可用于將英文默認(rèn)內(nèi)容改為其它語(yǔ)言.
- 菜單動(dòng)作(HandleMenuAction). 用戶從默認(rèn)上下文菜單選擇了一個(gè)選項(xiàng),可用自己的方式來(lái)處理動(dòng)作。
- 打印選項(xiàng)(HandlePrintOptions). 打印設(shè)置對(duì)話框顯示前調(diào)用,可用于定制頁(yè)面大小、方向與邊距等.
- 打印頁(yè)眉頁(yè)腳 (HandlePrintHeaderFooter). 在頁(yè)面視圖輸出到打印上下文,但是頁(yè)面結(jié)束前,可在預(yù)定義的6個(gè)位置(上左、上中、上右、下左,下中,下右)插入自定義的頁(yè)眉、頁(yè)腳字符串。該事件附帶的信息包括當(dāng)前URL、標(biāo)題、頁(yè)碼、總頁(yè)數(shù)、打印上下文、頁(yè)邊距與DPI拉伸比.
- JavaScript警告 (HandleJSAlert). 應(yīng)用程序可自定義Javascript Alert窗口.
- JavaScrip確認(rèn) (HandleJSConfirm). 應(yīng)用程序可自定義Javascript Comfirm窗口
- JavaScrip提示 (HandleJSPrompt). 應(yīng)用程序可自定義Javascript Prompt窗口
- JavaScript Window 對(duì)象綁定 (HandleJSBinding). 應(yīng)用程序?qū)⒂脩舳x的方法和變量附加到frame的window對(duì)象上
- Window關(guān)閉前 (HandleBeforeWindowClose). 窗口關(guān)閉前
- 獲得焦點(diǎn)(HandleTakeFocus). 瀏覽器組件失去焦點(diǎn)前調(diào)用
- 設(shè)置焦點(diǎn)(HandleSetFocus). 瀏覽器組件請(qǐng)求焦點(diǎn)前調(diào)用
- 鍵盤事件(HandleKeyEvent). 瀏覽器組件接收到鍵盤事件時(shí)
- 提示 (HandleTooltip). 用于修改tooltip文字
- 控制臺(tái)消息 (HandleConsoleMessage). 用于顯示控制臺(tái)消息.
- 查詢結(jié)果(HandleFindResult).用于自定義查找結(jié)果顯示處理
CefV8Handler支持以下通知:
- 執(zhí)行事件(Execute). 應(yīng)用程序執(zhí)行指定的函數(shù),該事件提供所有的Javascript參數(shù),而且應(yīng)用程序能指定返回值
瀏覽器事件
瀏覽器事件由客戶端應(yīng)用程序通過(guò)CefBrowser和CefFrame的函數(shù)發(fā)送給瀏覽器:
- 后退、前進(jìn)、重新加載與停止加載,用于控制瀏覽器導(dǎo)航.
- 撤消、重做、剪切、復(fù)制、粘貼、刪除、全選,用于控制目標(biāo)區(qū)域內(nèi)容.
- 打印. 打印目標(biāo)框架.
- 查看源代碼. 將目標(biāo)框架的HTML源代碼保存到臨時(shí)文件,并用默認(rèn)的文本查看程序打開之
- 加載URL. 在指定框架中加載指定URL
- 載入字符串. 根據(jù)一個(gè)假URL在指定框架中加載某個(gè)字符串
- 加載流. 根據(jù)一個(gè)假URL,在指定框架中加載二進(jìn)制數(shù)據(jù)
- 加載請(qǐng)求. 在指定框架中加載請(qǐng)求(URL, method, request data 與 headers) .
- 執(zhí)行腳本. 在目標(biāo)框架中執(zhí)行任意Javascript命令
內(nèi)嵌 NPAPI 插件
CEF支持創(chuàng)建Netscape-style內(nèi)嵌插件,使用相同 NPAPI的內(nèi)嵌插件和標(biāo)準(zhǔn)的DLL插件行為相同,但是,相對(duì)于使用獨(dú)立的DLL,內(nèi)嵌插件由容器應(yīng)用程序創(chuàng)建,并通過(guò)調(diào)用CefRegisterPlugin()注冊(cè)到系統(tǒng),如果要直接使用這一功能,需要include cef_nplugin.h .
JavaScript擴(kuò)展
CEF支持可以和原生應(yīng)用程序代碼交互的Javascript擴(kuò)展,參見cef.h的CefRegisterExtension() 函數(shù)和cefclient示例程序的"JavaScript Extension Handler" 以及 "UI App Example" 測(cè)試 .
自定義Schemes
CEF支持注冊(cè)與處理自定義scheme,類似于myscheme://mydomain。參見cef.h中的CefRegisterScheme()函數(shù)與示例應(yīng)用程序cefclient中的 "Scheme Handler" 測(cè)試.
框架實(shí)現(xiàn)概覽
CEF所有的類以Cef為前綴.
框架準(zhǔn)備與拆卸
UI消息循環(huán)由框架創(chuàng)建的一個(gè)單獨(dú)線程處理,客戶端程序應(yīng)負(fù)責(zé)通過(guò)分別調(diào)用CefInitialize()和CefShutdown() 來(lái)為每個(gè)進(jìn)程準(zhǔn)備與關(guān)閉這一線程。
引用計(jì)數(shù)
所有實(shí)現(xiàn)了CefBase接口的框架類與對(duì)象指針都由CefRefPtr智能指針實(shí)現(xiàn)來(lái)處理,通過(guò)調(diào)用AddRef()和Release()自動(dòng)處理引用計(jì)數(shù)。
平臺(tái)無(wú)關(guān)
CEF框架被設(shè)計(jì)成平臺(tái)無(wú)關(guān),需要當(dāng)前我們僅支持windows平臺(tái),但是我們計(jì)劃將來(lái)支持其它平臺(tái)。為了盡可能減少雙平臺(tái)支持帶來(lái)的麻煩,框架定義了一系列實(shí)現(xiàn)無(wú)關(guān)的接口與類型定義包裝跨平臺(tái)的行為。
線程安全
框架的所有接口實(shí)現(xiàn)必須是跨線程訪問(wèn)安全的,CefThreadSafeBase 模版提供原子的AddRef() 和 Release() 實(shí)現(xiàn),還提供Lock() 和 Unlock()方法以同步方式訪問(wèn)代碼塊.
框架接口
框架定義了如下接口:
- CefBrowser 是主要的瀏覽器host類,通過(guò)它的靜態(tài)方法CefBrowser::CreateBrowser()方法創(chuàng)建新瀏覽器窗口.
- CefFrame 表示瀏覽器窗口里的一個(gè)框架(frame),每個(gè)瀏覽器窗口都有一個(gè)頂級(jí)的主框架,可通過(guò)CefBrowser::GetMainFrame()方法訪問(wèn)之.
- CefHandler 是傳給CefBrowser::CreateBrowser()方法的最主要委托接口.
- CefRequest 表示請(qǐng)求數(shù)據(jù),比如url, method, post data 和 headers.
- CefPostData 和 CefPostDataElement 表示可能是請(qǐng)求一部分的post數(shù)據(jù).
- CefSchemeHandlerFactory 和 CefSchemeHandler 用于處理像myscheme://mydomain這樣的自定義scheme.
- CefStreamReader, CefStreamWriter, CefReadHandler 和 CefWriteHandler 讀寫數(shù)據(jù)的簡(jiǎn)單的接口.
- CefV8Handler 和 CefV8Value 用于創(chuàng)建和訪問(wèn)Javascript對(duì)象.