cefglue埋坑記錄


  很少寫博客,寫的不好,請多多包含,主要是記錄工作中的一些問題,和園子里朋友一起討論學習。

  寫埋坑記錄之前,我先介紹下為什么會使用這個webkit內核的瀏覽器組件,我是wpf項目使用富文本編輯器,話說wpf平台里面原生支持比較好的富文本編輯器還真沒用,還有一個原因我這個編輯器還要集成數學公式的輸入輸出,那就必須要自定義控件顯現,考慮到web端的通用,最后決定用百度編輯器UEDITORjq插件。

  cefglue底層是C/C++項目,主要是通過平台調用p/invoke實現。cefglue代碼下載地址是:https://bitbucket.org/xilium/xilium.cefglue/overview,動態鏈接庫下載地址:http://xilium.bitbucket.org/cefglue/,注意要翻牆。

  代碼結構我就不說了,里面有winform wpf 等版本,當然主要的功能已經實現,如果需要特定功能需額外定制。出於項目需要,我主要實現了有一下幾個功能。

  1.執行js獲取返回值。

  2.js回調后台方法。

  獲取返回值,CEF使用V8引擎實現javascript操作。瀏覽器中的每一個Frame都有它自己的JS上下文,上下文提供一種線程安全機制來執行頁面上的JS代碼
JS運行在獨立的渲染進程中,同渲染線程同一個線程。渲染進程的中的主線程使用TID_RENDERER來標示,所有的V8操作必須在這個線程上執行。JS執行相關的回調通過CefRenderProcessHandler暴露出來實現回調。主要代碼:

protected override bool OnProcessMessageReceived(CefBrowser browser, CefProcessId sourceProcess, CefProcessMessage message)
{
string[] items = message.Name.Split(new char[] { '|' });
if (items.Length == 0) return false;

switch (items[0])
{
case "EvaluateScript":
{
CefV8Value value = CefV8Value.CreateString("t");
CefV8Exception exp;
browser.GetMainFrame().V8Context.TryEval(items[1], out value, out exp);
CommonObj.JsEvaResult = null;
if (value == null)
{
CommonObj.flag = true;
return true;
}
else
if (value.IsArray)
{

}
else
if (value.IsString)
{
CommonObj.JsEvaResult = value.GetStringValue();
}
else
if (value.IsInt)
{
CommonObj.JsEvaResult = value.GetIntValue();
}
else
if (value.IsDouble)
{
CommonObj.JsEvaResult = value.GetDoubleValue();
}
else
if (value.IsBool)
{
CommonObj.JsEvaResult = value.GetBoolValue();
}
else
if (value.IsDate)
{
CommonObj.JsEvaResult = value.GetDateValue();
}
CommonObj.flag = true;
return true;
}

從寫CefRenderProcessHandler基類OnProcessMessageReceived方法,此處一定要注意,在外部多線程環境里面執行,一定要封送渲染線程上下文環境,要不無法回調。

2.js回調后台,第一種方法:網上有很多朋友通過ajax請求實現,原理是截獲請求報文,獲取請求參數,實現動態反射。第二種方法:瀏覽器窗口中的每個頁面都有V8上下文。上下文包含了頁面中所有的變量、對象和方法,如果我們注冊了CefV8HandlerV8上下文處理器,並且在本地代碼中保存當前上下文的引用和JS函數那么可以輕松實現js回調。

主要思路,代碼太多,如果需要代碼的可以給我留言:

1.生成本地js和頁面js映射。2.實現V8引擎,從寫Excute方法。3.創建js回調類,包含頁面js函數聲明方法,主要是為了V8Excute方法里面動態反射調用。

 到現在為止,js回調后台方法實現,但是新的問題來了。沒辦法確定是哪個瀏覽器里面的js觸發的回調。我的做法是,在每個瀏覽器加載頁面完成的時候生成一個GUID標識瀏覽器對象id,執行頁面js函數,寫入到頁面隱藏域里面,便於后面的回調傳入這個標識ID。

目前項目中用到的就這幾個功能,寫的不好不要拍磚,需要源代碼的可以給我留言。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM