190 lines
7.4 KiB
C#
190 lines
7.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using Cef3;
|
|
|
|
namespace Sashulin.common
|
|
{
|
|
class RenderProcessHandler : CefRenderProcessHandler
|
|
{
|
|
private ChromeWebBrowser webBrowser;
|
|
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 "GetElementValue":
|
|
{
|
|
string elementID = items[1];
|
|
long[] frameIDs = browser.GetFrameIdentifiers();
|
|
foreach (long frameID in frameIDs)
|
|
{
|
|
CefFrame frame = browser.GetFrame(frameID);
|
|
if (frame == null) continue;
|
|
frame.VisitDom(new CwbDOMVisitor(browser, CwbBusinStyle.bsGetElementValue, elementID));
|
|
}
|
|
browser.GetMainFrame().VisitDom(new CwbDOMVisitor(browser, CwbBusinStyle.bsGetElementValue, elementID));
|
|
return true;
|
|
}
|
|
case "SetElementValue":
|
|
{
|
|
string elementID = items[1];
|
|
string elementValue = items[2];
|
|
long[] frameIDs = browser.GetFrameIdentifiers();
|
|
foreach (long frameID in frameIDs)
|
|
{
|
|
CefFrame frame = browser.GetFrame(frameID);
|
|
if (frame == null) continue;
|
|
frame.VisitDom(new CwbDOMVisitor(browser, CwbBusinStyle.bsGetElementValue, elementID, elementValue));
|
|
}
|
|
browser.GetMainFrame().VisitDom(new CwbDOMVisitor(browser, CwbBusinStyle.bsSetElementValue, elementID, elementValue));
|
|
return true;
|
|
}
|
|
case "EvaluateScript":
|
|
{
|
|
CefV8Value value = CefV8Value.CreateString("t");
|
|
CefV8Exception exp;
|
|
browser.GetMainFrame().V8Context.TryEval(items[1], out value, out exp);
|
|
Global.JsEvaResult = null;
|
|
if (value.IsString)
|
|
{
|
|
Global.JsEvaResult = value.GetStringValue();
|
|
}
|
|
if (value.IsInt)
|
|
{
|
|
Global.JsEvaResult = value.GetIntValue();
|
|
}
|
|
if (value.IsDouble)
|
|
{
|
|
Global.JsEvaResult = value.GetDoubleValue();
|
|
}
|
|
if (value.IsBool)
|
|
{
|
|
Global.JsEvaResult = value.GetBoolValue();
|
|
}
|
|
if (value.IsDate)
|
|
{
|
|
Global.JsEvaResult = value.GetDateValue();
|
|
}
|
|
Global.flag = true;
|
|
return true;
|
|
}
|
|
case "AppendListener":
|
|
{
|
|
CwbBusinStyle cbStyle = CwbBusinStyle.bsAddElementEvent;
|
|
if (items.Length > 2)
|
|
cbStyle = CwbBusinStyle.bsAttachElementEvent;
|
|
string elementID = items[1];
|
|
long[] frameIDs = browser.GetFrameIdentifiers();
|
|
foreach (long frameID in frameIDs)
|
|
{
|
|
CefFrame frame = browser.GetFrame(frameID);
|
|
if (frame == null) continue;
|
|
frame.VisitDom(new CwbDOMVisitor(browser, cbStyle, webBrowser.getEventListener(elementID)));
|
|
}
|
|
browser.GetMainFrame().VisitDom(new CwbDOMVisitor(browser, cbStyle, webBrowser.getEventListener(elementID)));
|
|
return true;
|
|
}
|
|
case "GetDocument":
|
|
{
|
|
browser.GetMainFrame().VisitDom(new CwbDOMVisitor(browser, CwbBusinStyle.bsVisitDocument, ""));
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context)
|
|
{
|
|
/*缓存数据库*/
|
|
string extensionCode =
|
|
"var cachedb;" +
|
|
"if(!cachedb)" +
|
|
" cachedb={};" +
|
|
"(function() {" +
|
|
" cachedb.Connect = function(dbName) {" +
|
|
" native function Connect(dbName);" +
|
|
" return Connect(dbName);" +
|
|
" };" +
|
|
|
|
" cachedb.Execute = function(commandText) {" +
|
|
" native function Execute(commandText);" +
|
|
" return Execute(commandText);" +
|
|
" };" +
|
|
|
|
" cachedb.Query = function(commandText) {" +
|
|
" native function Query(commandText);" +
|
|
" return Query(commandText);" +
|
|
" };" +
|
|
|
|
" cachedb.Close = function() {" +
|
|
" native function Close();" +
|
|
" return Close();" +
|
|
" };"+
|
|
|
|
"})();";
|
|
CefV8Handler ExtendsionHandler = new CwbJsExtendHandler(browser);
|
|
CefRuntime.RegisterExtension("v8/cachedb", extensionCode, ExtendsionHandler);
|
|
|
|
/*屏幕分辨率设置*/
|
|
int w = webBrowser.screenWidth;
|
|
int h = webBrowser.screenHeight;
|
|
if (w > 0 && h > 0)
|
|
{
|
|
string jscode =
|
|
"Object.defineProperty(window.screen, 'height', {" +
|
|
" get: function() {"+
|
|
" return "+h+";"+
|
|
" }"+
|
|
"});"+
|
|
"Object.defineProperty(window.screen, 'width', {"+
|
|
" get: function() {"+
|
|
" return "+w+";"+
|
|
" }"+
|
|
"});";
|
|
frame.ExecuteJavaScript(jscode,frame.Url,0);
|
|
}
|
|
/*注册执行C#方法*/
|
|
CefV8Value globalValue = context.GetGlobal();
|
|
CefV8Handler callHandler = new CwbJsExtendHandler(browser);
|
|
CefV8Value callMethod = CefV8Value.CreateFunction("CallCSharpMethod", callHandler);
|
|
globalValue.SetValue("CallCSharpMethod", callMethod, CefV8PropertyAttribute.None);
|
|
|
|
callHandler = new CwbJsExtendHandler(browser);
|
|
callMethod = CefV8Value.CreateFunction("PageFinished", callHandler);
|
|
globalValue.SetValue("PageFinished", callMethod, CefV8PropertyAttribute.None);
|
|
base.OnContextCreated(browser, frame, context);
|
|
|
|
}
|
|
|
|
protected override CefLoadHandler GetLoadHandler()
|
|
{
|
|
|
|
return base.GetLoadHandler();
|
|
}
|
|
|
|
protected override void OnWebKitInitialized()
|
|
{
|
|
base.OnWebKitInitialized();
|
|
}
|
|
|
|
protected override void OnBrowserCreated(CefBrowser browser)
|
|
{
|
|
base.OnBrowserCreated(browser);
|
|
}
|
|
|
|
protected override bool OnBeforeNavigation(CefBrowser browser, CefFrame frame, CefRequest request, CefNavigationType navigation_type, bool isRedirect)
|
|
{
|
|
return base.OnBeforeNavigation(browser, frame, request, navigation_type, isRedirect);
|
|
}
|
|
|
|
public void SetBrowserControl(ChromeWebBrowser browser)
|
|
{
|
|
webBrowser = browser;
|
|
}
|
|
}
|
|
}
|