init lserp cs 5.0
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Cef3;
|
||||
namespace Sashulin.common
|
||||
{
|
||||
internal sealed class AppSchemeHandlerFactory : CefSchemeHandlerFactory
|
||||
{
|
||||
protected override CefResourceHandler Create(CefBrowser browser, CefFrame frame, string schemeName, CefRequest request)
|
||||
{
|
||||
return new RequestResourceHandler();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Reflection;
|
||||
using Cef3;
|
||||
namespace Sashulin.common
|
||||
{
|
||||
internal sealed class BrowserProcessHandler : CefBrowserProcessHandler
|
||||
{
|
||||
protected override void OnBeforeChildProcessLaunch(CefCommandLine commandLine)
|
||||
{
|
||||
Console.WriteLine("AppendExtraCommandLineSwitches: {0}", commandLine);
|
||||
Console.WriteLine(" Program == {0}", commandLine.GetProgram());
|
||||
|
||||
// .NET in Windows treat assemblies as native images, so no any magic required.
|
||||
// Mono on any platform usually located far away from entry assembly, so we want prepare command line to call it correctly.
|
||||
if (Type.GetType("Mono.Runtime") != null)
|
||||
{
|
||||
if (!commandLine.HasSwitch("cefglue"))
|
||||
{
|
||||
var path = new Uri(Assembly.GetEntryAssembly().CodeBase).LocalPath;
|
||||
commandLine.SetProgram(path);
|
||||
|
||||
var mono = CefRuntime.Platform == CefRuntimePlatform.Linux ? "/usr/bin/mono" : @"C:\Program Files\Mono-2.10.8\bin\monow.exe";
|
||||
commandLine.PrependArgument(mono);
|
||||
|
||||
commandLine.AppendSwitch("cefglue", "w");
|
||||
}
|
||||
}
|
||||
|
||||
Console.WriteLine(" -> {0}", commandLine);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.IO;
|
||||
using Cef3;
|
||||
namespace Sashulin.common
|
||||
{
|
||||
public sealed class ClientApp : CefApp
|
||||
{
|
||||
private CefBrowserProcessHandler _browserProcessHandler = new BrowserProcessHandler();
|
||||
private RenderProcessHandler _renderProcessHandler = new RenderProcessHandler();
|
||||
|
||||
protected override void OnBeforeCommandLineProcessing(string processType, CefCommandLine commandLine)
|
||||
{
|
||||
Console.WriteLine("OnBeforeCommandLineProcessing: {0} {1}", processType, commandLine);
|
||||
|
||||
commandLine.AppendSwitch("ppapi-flash-path", "plugins/pepflashplayer.dll");
|
||||
commandLine.AppendSwitch("ppapi-flash-version","17.0.0.134");
|
||||
|
||||
// TODO: currently on linux platform location of locales and pack files are determined
|
||||
// incorrectly (relative to main module instead of libcef.so module).
|
||||
// Once issue http://code.google.com/p/chromiumembedded/issues/detail?id=668 will be resolved
|
||||
// this code can be removed.
|
||||
if (CefRuntime.Platform == CefRuntimePlatform.Linux)
|
||||
{
|
||||
var path = new Uri(Assembly.GetEntryAssembly().CodeBase).LocalPath;
|
||||
path = Path.GetDirectoryName(path);
|
||||
|
||||
commandLine.AppendSwitch("resources-dir-path", path);
|
||||
commandLine.AppendSwitch("locales-dir-path", Path.Combine(path, "locales"));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected override CefBrowserProcessHandler GetBrowserProcessHandler()
|
||||
{
|
||||
return _browserProcessHandler;
|
||||
}
|
||||
|
||||
protected override CefRenderProcessHandler GetRenderProcessHandler()
|
||||
{
|
||||
return _renderProcessHandler;
|
||||
}
|
||||
|
||||
public void SetBrowserControl(ChromeWebBrowser browser)
|
||||
{
|
||||
_renderProcessHandler.SetBrowserControl(browser);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Cef3;
|
||||
|
||||
namespace Sashulin.common
|
||||
{
|
||||
public sealed class ClientBrowser : CefClient
|
||||
{
|
||||
private readonly CwbLifeSpanHandler _lifeSpanHandler;
|
||||
private readonly CwbDisplayHandler _displayHandler;
|
||||
private readonly CwbLoadHandler _loadHandler;
|
||||
private readonly CwbKeyboardHandler _keyboardHandler;
|
||||
private readonly FileDownloadHandler _fileDownloadHandler;
|
||||
private readonly CwbRequestHandler _requestHandler;
|
||||
private readonly CwbRenderHandler _renderHandler;
|
||||
private readonly CwbMenuHandler _menuHandler;
|
||||
|
||||
private ChromeWebBrowser webBrowser;
|
||||
public ClientBrowser(ChromeWebBrowser browser)
|
||||
{
|
||||
webBrowser = browser;
|
||||
_lifeSpanHandler = new CwbLifeSpanHandler(browser);
|
||||
_displayHandler = new CwbDisplayHandler(browser);
|
||||
_loadHandler = new CwbLoadHandler(browser);
|
||||
_keyboardHandler = new CwbKeyboardHandler(browser);
|
||||
_fileDownloadHandler = new FileDownloadHandler(browser);
|
||||
_requestHandler = new CwbRequestHandler(browser);
|
||||
_renderHandler = new CwbRenderHandler(browser);
|
||||
_menuHandler = new CwbMenuHandler(browser);
|
||||
}
|
||||
|
||||
protected override CefLifeSpanHandler GetLifeSpanHandler()
|
||||
{
|
||||
return _lifeSpanHandler;
|
||||
}
|
||||
|
||||
protected override CefDisplayHandler GetDisplayHandler()
|
||||
{
|
||||
return _displayHandler;
|
||||
}
|
||||
|
||||
protected override CefLoadHandler GetLoadHandler()
|
||||
{
|
||||
return _loadHandler;
|
||||
}
|
||||
|
||||
protected override CefKeyboardHandler GetKeyboardHandler()
|
||||
{
|
||||
return _keyboardHandler;
|
||||
}
|
||||
|
||||
protected override bool OnProcessMessageReceived(CefBrowser browser, CefProcessId sourceProcess, CefProcessMessage message)
|
||||
{
|
||||
Console.WriteLine("Client::OnProcessMessageReceived: SourceProcess={0}", sourceProcess);
|
||||
Console.WriteLine("Message Name={0} IsValid={1} IsReadOnly={2}", message.Name, message.IsValid, message.IsReadOnly);
|
||||
var arguments = message.Arguments;
|
||||
for (var i = 0; i < arguments.Count; i++)
|
||||
{
|
||||
var type = arguments.GetValueType(i);
|
||||
object value;
|
||||
switch (type)
|
||||
{
|
||||
case CefValueType.Null: value = null; break;
|
||||
case CefValueType.String: value = arguments.GetString(i); break;
|
||||
case CefValueType.Int: value = arguments.GetInt(i); break;
|
||||
case CefValueType.Double: value = arguments.GetDouble(i); break;
|
||||
case CefValueType.Bool: value = arguments.GetBool(i); break;
|
||||
default: value = null; break;
|
||||
}
|
||||
|
||||
Console.WriteLine(" [{0}] ({1}) = {2}", i, type, value);
|
||||
}
|
||||
|
||||
if (message.Name == "myMessage2" || message.Name == "myMessage3") return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
protected override CefDownloadHandler GetDownloadHandler()
|
||||
{
|
||||
return _fileDownloadHandler;
|
||||
}
|
||||
protected override CefRenderHandler GetRenderHandler()
|
||||
{
|
||||
return _renderHandler;
|
||||
}
|
||||
|
||||
protected override CefRequestHandler GetRequestHandler()
|
||||
{
|
||||
return _requestHandler;
|
||||
}
|
||||
|
||||
protected override CefJSDialogHandler GetJSDialogHandler()
|
||||
{
|
||||
return base.GetJSDialogHandler();
|
||||
}
|
||||
protected override CefContextMenuHandler GetContextMenuHandler()
|
||||
{
|
||||
return _menuHandler;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Cef3;
|
||||
|
||||
namespace Sashulin.common
|
||||
{
|
||||
class CwbCookieTask : CefTask
|
||||
{
|
||||
private string Url;
|
||||
private CefCookie Cookie;
|
||||
public CwbCookieTask(string url, CefCookie cookie)
|
||||
{
|
||||
Url = url;
|
||||
Cookie = cookie;
|
||||
}
|
||||
|
||||
protected override void Execute()
|
||||
{
|
||||
CefCookieManager.GetGlobal(null).SetCookie(Url, Cookie,null);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Cef3;
|
||||
using Sashulin.Core;
|
||||
|
||||
namespace Sashulin.common
|
||||
{
|
||||
class CwbCookieVisitor : CefCookieVisitor
|
||||
{
|
||||
private CwbCookieStyle _style;
|
||||
private CwbDocument _document;
|
||||
public CwbCookieVisitor(CwbCookieStyle style,CwbDocument document)
|
||||
{
|
||||
_style = style;
|
||||
_document = document;
|
||||
}
|
||||
|
||||
protected override bool Visit(CefCookie cookie, int count, int total, out bool delete)
|
||||
{
|
||||
delete = false;
|
||||
switch (_style)
|
||||
{
|
||||
case CwbCookieStyle.csDeleteAllCookie:
|
||||
delete = true;
|
||||
break;
|
||||
case CwbCookieStyle.csVisitUrlCookie:
|
||||
string cookieValue = cookie.Name + "=" + cookie.Value + ";";
|
||||
_document._cookie += cookieValue;
|
||||
CwbCookie cookieItem = new CwbCookie();
|
||||
cookieItem.Creation = cookie.Creation;
|
||||
cookieItem.Domain = cookie.Domain;
|
||||
cookieItem.Expires = cookie.Expires;
|
||||
cookieItem.HttpOnly = cookie.HttpOnly;
|
||||
cookieItem.LastAccess = cookie.LastAccess;
|
||||
cookieItem.Name = cookie.Name;
|
||||
cookieItem.Path = cookie.Path;
|
||||
cookieItem.Secure = cookie.Secure;
|
||||
cookieItem.Value = cookie.Value;
|
||||
_document._cookies.Add(cookieItem);
|
||||
break;
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,191 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Cef3;
|
||||
using Sashulin.Core;
|
||||
|
||||
namespace Sashulin.common
|
||||
{
|
||||
class CwbDOMVisitor : CefDomVisitor
|
||||
{
|
||||
private CwbBusinStyle _businID;
|
||||
private string _elementID;
|
||||
private string _elementValue;
|
||||
private CwbListenerItem _item;
|
||||
private CefBrowser browser;
|
||||
public CwbDOMVisitor(CefBrowser browser, CwbBusinStyle businID, string elementID)
|
||||
{
|
||||
_businID = businID;
|
||||
_elementID = elementID;
|
||||
this.browser = browser;
|
||||
}
|
||||
public CwbDOMVisitor(CefBrowser browser, CwbBusinStyle businID, string elementID, string elementValue)
|
||||
{
|
||||
_businID = businID;
|
||||
_elementID = elementID;
|
||||
_elementValue = elementValue;
|
||||
this.browser = browser;
|
||||
}
|
||||
public CwbDOMVisitor(CefBrowser browser, CwbBusinStyle businID, CwbListenerItem item)
|
||||
{
|
||||
this.browser = browser;
|
||||
_businID = businID;
|
||||
_item = item;
|
||||
}
|
||||
protected override void Visit(CefDomDocument document)
|
||||
{
|
||||
CefDomNode element;
|
||||
switch (_businID)
|
||||
{
|
||||
case CwbBusinStyle.bsGetElementValue:
|
||||
|
||||
Global.Result = "";
|
||||
element = document.GetElementById(_elementID);
|
||||
if (element == null)
|
||||
{
|
||||
Global.flag = true;
|
||||
return;
|
||||
}
|
||||
Global.Result = element.Value;
|
||||
if (element.ElementTagName.ToLower() != "input")
|
||||
Global.Result = element.InnerText;
|
||||
Global.flag = true;
|
||||
break;
|
||||
case CwbBusinStyle.bsSetElementValue:
|
||||
element = document.GetElementById(_elementID);
|
||||
if (element == null) return;
|
||||
if (element.IsEditable)
|
||||
element.SetAttribute("value", _elementValue);
|
||||
else
|
||||
{
|
||||
string code = "document.getElementById('{0}').innerHTML = '{1}';";
|
||||
code = string.Format(code,_elementID,_elementValue);
|
||||
Global.instance.ExecuteScript(code);
|
||||
}
|
||||
break;
|
||||
case CwbBusinStyle.bsAddElementEvent:
|
||||
element = document.GetElementById(_item.id);
|
||||
if (element == null) return;
|
||||
//element.AddEventListener(_item.eventName,new RSEventListener(_item.elementListener),true);
|
||||
break;
|
||||
case CwbBusinStyle.bsVisitDocument:
|
||||
Global.flag = false;
|
||||
CefDomNode root = document.Root;
|
||||
CwbElement Root = CreateElement(root);
|
||||
if (Global.RootList.ContainsKey(browser.Identifier))
|
||||
{
|
||||
Global.RootList[ browser.Identifier ] = Root;
|
||||
}
|
||||
else
|
||||
{
|
||||
Global.RootList.Add(browser.Identifier, Root);
|
||||
}
|
||||
string indexPath = "0";
|
||||
Root.IndexPath = indexPath;
|
||||
AppendAllChildElement(root, Root, indexPath);
|
||||
Global.flag = true;
|
||||
break;
|
||||
case CwbBusinStyle.bsAttachElementEvent:
|
||||
CefDomNode root1 = document.Root;
|
||||
string indexPath1 = "0";
|
||||
AttachEventHandler(root1, indexPath1, new RSEventListener(_item.elementListener));
|
||||
Global.flag = true;
|
||||
break;
|
||||
}
|
||||
_businID = CwbBusinStyle.bsNone;
|
||||
}
|
||||
|
||||
public void AttachEventHandler(CefDomNode parentNode, string indexPath, RSEventListener listener)
|
||||
{
|
||||
if (parentNode.HasChildren)
|
||||
{
|
||||
CefDomNode node = parentNode.FirstChild;
|
||||
if (node == null) return;
|
||||
|
||||
int index = 0;
|
||||
string indexPath1 = indexPath + "." + index.ToString();
|
||||
if (indexPath1 == _item.id)
|
||||
{
|
||||
//node.AddEventListener(_item.eventName, listener, true);
|
||||
return;
|
||||
}
|
||||
AttachEventHandler(node, indexPath1, listener);
|
||||
|
||||
node = node.NextSibling;
|
||||
while (node != null)
|
||||
{
|
||||
index++;
|
||||
indexPath1 = indexPath + "." + index.ToString();
|
||||
if (indexPath1 == _item.id)
|
||||
{
|
||||
//node.AddEventListener(_item.eventName, listener, true);
|
||||
return;
|
||||
}
|
||||
AttachEventHandler(node, indexPath1, listener);
|
||||
node = node.NextSibling;
|
||||
System.Windows.Forms.Application.DoEvents();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void AppendAllChildElement(CefDomNode parentNode,CwbElement parentElement, string indePath)
|
||||
{
|
||||
if (parentNode.HasChildren)
|
||||
{
|
||||
CefDomNode node = parentNode.FirstChild;
|
||||
if (node == null) return;
|
||||
|
||||
int index = 0;
|
||||
CwbElement childElement = CreateElement(node);
|
||||
childElement.IndexPath = indePath + "."+index.ToString();
|
||||
parentElement.ChildElements.Add(childElement);
|
||||
AppendAllChildElement(node, childElement, childElement.IndexPath);
|
||||
|
||||
node = node.NextSibling;
|
||||
while (node != null)
|
||||
{
|
||||
childElement = CreateElement(node);
|
||||
index++;
|
||||
childElement.IndexPath = indePath + "." + index.ToString();
|
||||
parentElement.ChildElements.Add(childElement);
|
||||
AppendAllChildElement(node, childElement, childElement.IndexPath);
|
||||
node = node.NextSibling;
|
||||
System.Windows.Forms.Application.DoEvents();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private CwbElement CreateElement(CefDomNode node)
|
||||
{
|
||||
string id = string.Empty;
|
||||
if (node.HasAttribute("id"))
|
||||
{
|
||||
id = node.GetAttribute("id");
|
||||
}
|
||||
CwbElement retValue = new CwbElement(browser,id, node.ElementTagName,node.GetAttribute("value"),
|
||||
node.IsElement,node.IsEditable,
|
||||
node.HasChildren,node.InnerText,
|
||||
node.HasAttributes
|
||||
);
|
||||
foreach (KeyValuePair<string, string> item in node.GetAttributes())
|
||||
{
|
||||
retValue.Attributes.Add(item);
|
||||
}
|
||||
return retValue;
|
||||
}
|
||||
}
|
||||
|
||||
class RSEventListener //: CefDomEventListener
|
||||
{
|
||||
private ChromeWebBrowser.TCallBackElementEventListener _listener;
|
||||
public RSEventListener(ChromeWebBrowser.TCallBackElementEventListener listener)
|
||||
{
|
||||
_listener = listener;
|
||||
}
|
||||
/*protected override void HandleEvent(CefDomEvent @event)
|
||||
{
|
||||
_listener();
|
||||
}*/
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Cef3;
|
||||
|
||||
namespace Sashulin.common
|
||||
{
|
||||
internal sealed class CwbDisplayHandler : CefDisplayHandler
|
||||
{
|
||||
private ChromeWebBrowser webBrowser;
|
||||
|
||||
public CwbDisplayHandler(ChromeWebBrowser browser)
|
||||
{
|
||||
webBrowser = browser;
|
||||
}
|
||||
|
||||
protected override void OnTitleChange(CefBrowser browser, string title)
|
||||
{
|
||||
webBrowser.OnTitleChange(title);
|
||||
}
|
||||
|
||||
protected override void OnAddressChange(CefBrowser browser, CefFrame frame, string url)
|
||||
{
|
||||
if (frame.IsMain)
|
||||
{
|
||||
webBrowser.OnUrlChange(url);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnStatusMessage(CefBrowser browser, string value)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
protected override bool OnTooltip(CefBrowser browser, string text)
|
||||
{
|
||||
Console.WriteLine("OnTooltip: {0}", text);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Cef3;
|
||||
|
||||
namespace Sashulin.common
|
||||
{
|
||||
class CwbJsExtendHandler : CefV8Handler
|
||||
{
|
||||
CefBrowser activeBrowser;
|
||||
public CwbJsExtendHandler(CefBrowser browser)
|
||||
{
|
||||
activeBrowser = browser;
|
||||
}
|
||||
protected override bool Execute(string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception)
|
||||
{
|
||||
exception = null;
|
||||
switch (name)
|
||||
{
|
||||
case "CallCSharpMethod":
|
||||
string methodName = arguments[0].GetStringValue();
|
||||
string values = arguments[1].GetStringValue();
|
||||
string res = Global.CallMethod(activeBrowser, methodName, values);
|
||||
returnValue = CefV8Value.CreateString(res);
|
||||
return true;
|
||||
case "Connect":
|
||||
string dbName = arguments[0].GetStringValue();
|
||||
Global.cacheDB.Connect(dbName);
|
||||
returnValue = CefV8Value.CreateString("0");
|
||||
return true;
|
||||
case "Execute":
|
||||
string commandSql = arguments[0].GetStringValue();
|
||||
int recordCount = Global.cacheDB.Execute(commandSql);
|
||||
returnValue = CefV8Value.CreateInt(recordCount);
|
||||
return true;
|
||||
case "Query":
|
||||
string querySql = arguments[0].GetStringValue();
|
||||
string records = Global.cacheDB.Query(querySql);
|
||||
returnValue = CefV8Value.CreateString(records);
|
||||
return true;
|
||||
case "Close":
|
||||
Global.cacheDB.Close();
|
||||
returnValue = CefV8Value.CreateString("0");
|
||||
return true;
|
||||
case "PageFinished":
|
||||
Global.instance.OnPageFinished();
|
||||
returnValue = CefV8Value.CreateString("0");
|
||||
return true;
|
||||
}
|
||||
|
||||
returnValue = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Cef3;
|
||||
|
||||
namespace Sashulin.common
|
||||
{
|
||||
internal sealed class CwbKeyboardHandler : CefKeyboardHandler
|
||||
{
|
||||
private ChromeWebBrowser webBrowser;
|
||||
|
||||
public CwbKeyboardHandler(ChromeWebBrowser browser)
|
||||
{
|
||||
webBrowser = browser;
|
||||
}
|
||||
|
||||
protected override bool OnPreKeyEvent(CefBrowser browser, CefKeyEvent keyEvent, IntPtr os_event, out bool isKeyboardShortcut)
|
||||
{
|
||||
if (keyEvent.EventType == CefKeyEventType.RawKeyDown)
|
||||
webBrowser.OnPreviewKeyDown(keyEvent.Modifiers == CefEventFlags.AltDown,
|
||||
keyEvent.Modifiers == CefEventFlags.ControlDown,
|
||||
keyEvent.Modifiers == CefEventFlags.ShiftDown,
|
||||
keyEvent.FocusOnEditableField,
|
||||
keyEvent.WindowsKeyCode,
|
||||
keyEvent.Character);
|
||||
|
||||
return base.OnPreKeyEvent(browser, keyEvent, os_event, out isKeyboardShortcut);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Cef3;
|
||||
namespace Sashulin.common
|
||||
{
|
||||
internal sealed class CwbLifeSpanHandler : CefLifeSpanHandler
|
||||
{
|
||||
private ChromeWebBrowser webBrowser;
|
||||
public CwbLifeSpanHandler(ChromeWebBrowser browser)
|
||||
{
|
||||
webBrowser = browser;
|
||||
}
|
||||
|
||||
protected override void OnAfterCreated(CefBrowser browser)
|
||||
{
|
||||
base.OnAfterCreated(browser);
|
||||
webBrowser.OnCreated(browser);
|
||||
}
|
||||
|
||||
protected override bool DoClose(CefBrowser browser)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
protected override bool OnBeforePopup(CefBrowser browser, CefFrame frame, string targetUrl, string targetFrameName, CefWindowOpenDisposition targetDisposition, bool userGesture, CefPopupFeatures popupFeatures, CefWindowInfo windowInfo, ref CefClient client, CefBrowserSettings settings, ref bool noJavascriptAccess)
|
||||
{
|
||||
bool res = false;
|
||||
if (!string.IsNullOrEmpty(targetUrl))
|
||||
{
|
||||
if (webBrowser.selfRequest != null)
|
||||
{
|
||||
CefRequest req = CefRequest.Create();
|
||||
req.FirstPartyForCookies = webBrowser.selfRequest.FirstPartyForCookies;
|
||||
req.Options = webBrowser.selfRequest.Options;
|
||||
/*CefPostData postData = CefPostData.Create();
|
||||
CefPostDataElement element = CefPostDataElement.Create();
|
||||
int index = targetUrl.IndexOf("?");
|
||||
string url = targetUrl.Substring(0, index);
|
||||
string data = targetUrl.Substring(index + 1);
|
||||
byte[] bytes = Encoding.UTF8.GetBytes(data);
|
||||
element.SetToBytes(bytes);
|
||||
postData.Add(element);
|
||||
*/
|
||||
System.Collections.Specialized.NameValueCollection h = new System.Collections.Specialized.NameValueCollection();
|
||||
h.Add("Content-Type", "application/x-www-form-urlencoded");
|
||||
req.Set(targetUrl, webBrowser.selfRequest.Method, null, webBrowser.selfRequest.GetHeaderMap());
|
||||
webBrowser.selfRequest = req;
|
||||
}
|
||||
//webBrowser.selfRequest.Set(targetUrl, webBrowser.selfRequest.Method, webBrowser.selfRequest.PostData, webBrowser.selfRequest.GetHeaderMap());
|
||||
res = webBrowser.OnNewWindow(targetUrl);
|
||||
if (res)
|
||||
return res;
|
||||
}
|
||||
res = base.OnBeforePopup(browser, frame, targetUrl, targetFrameName, targetDisposition, userGesture, popupFeatures, windowInfo, ref client, settings, ref noJavascriptAccess);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Sashulin.common
|
||||
{
|
||||
class CwbListenerItem
|
||||
{
|
||||
private string _id;
|
||||
private string _eventName;
|
||||
private ChromeWebBrowser.TCallBackElementEventListener _listener;
|
||||
|
||||
public string id
|
||||
{
|
||||
get { return _id; }
|
||||
set { _id = value; }
|
||||
}
|
||||
|
||||
public string eventName
|
||||
{
|
||||
get { return _eventName; }
|
||||
set { _eventName = value; }
|
||||
}
|
||||
|
||||
public ChromeWebBrowser.TCallBackElementEventListener elementListener
|
||||
{
|
||||
get { return _listener; }
|
||||
set { _listener = value; }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Cef3;
|
||||
namespace Sashulin.common
|
||||
{
|
||||
internal sealed class CwbLoadHandler : CefLoadHandler
|
||||
{
|
||||
private ChromeWebBrowser webBrowser;
|
||||
|
||||
public CwbLoadHandler(ChromeWebBrowser browser)
|
||||
{
|
||||
webBrowser = browser;
|
||||
}
|
||||
|
||||
protected override void OnLoadingStateChange(CefBrowser browser, bool isLoading, bool canGoBack, bool canGoForward)
|
||||
{
|
||||
//_core.OnLoadingStateChanged(isLoading, canGoBack, canGoForward);
|
||||
}
|
||||
|
||||
protected override void OnLoadStart(CefBrowser browser, CefFrame frame)
|
||||
{
|
||||
base.OnLoadStart(browser, frame);
|
||||
webBrowser.OnLoadStart();
|
||||
}
|
||||
|
||||
protected override void OnLoadEnd(CefBrowser browser, CefFrame frame, int httpStatusCode)
|
||||
{
|
||||
base.OnLoadEnd(browser, frame, httpStatusCode);
|
||||
|
||||
if (frame.IsMain)
|
||||
{
|
||||
//browser.SendProcessMessage(CefProcessId.Renderer, CefProcessMessage.Create("VisitorDocument"));
|
||||
webBrowser.OnDocumentCompleted();
|
||||
}
|
||||
webBrowser.OnLoadEnd();
|
||||
}
|
||||
|
||||
protected override void OnLoadError(CefBrowser browser, CefFrame frame, CefErrorCode errorCode, string errorText, string failedUrl)
|
||||
{
|
||||
base.OnLoadError(browser, frame, errorCode, errorText, failedUrl);
|
||||
if (errorCode == CefErrorCode.Aborted) return;
|
||||
webBrowser.OnLoadError(errorCode, errorText, failedUrl);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using Cef3;
|
||||
namespace Sashulin.common
|
||||
{
|
||||
class CwbMenuHandler : CefContextMenuHandler
|
||||
{
|
||||
private ChromeWebBrowser webBrowser;
|
||||
private List<CommandItem> commandItems = new List<CommandItem>();
|
||||
|
||||
public CwbMenuHandler(ChromeWebBrowser browser)
|
||||
{
|
||||
webBrowser = browser;
|
||||
}
|
||||
protected override void OnBeforeContextMenu(CefBrowser browser, CefFrame frame, CefContextMenuParams state, CefMenuModel model)
|
||||
{
|
||||
if (!webBrowser.menuVisible)
|
||||
model.Clear();
|
||||
int commandId = 1001;
|
||||
if (webBrowser.ContextMenu != null)
|
||||
{
|
||||
foreach (MenuItem item in webBrowser.ContextMenu.MenuItems)
|
||||
{
|
||||
if (item.Text == "-")
|
||||
model.AddSeparator();
|
||||
else
|
||||
model.AddItem(commandId, item.Text);
|
||||
CommandItem commandItem = new CommandItem();
|
||||
commandItem.id = commandId;
|
||||
commandItem.item = item;
|
||||
commandItems.Add(commandItem);
|
||||
commandId++;
|
||||
}
|
||||
}
|
||||
|
||||
base.OnBeforeContextMenu(browser, frame, state, model);
|
||||
|
||||
}
|
||||
|
||||
protected override bool OnContextMenuCommand(CefBrowser browser, CefFrame frame, CefContextMenuParams state, int commandId, CefEventFlags eventFlags)
|
||||
{
|
||||
foreach (CommandItem commItem in commandItems)
|
||||
{
|
||||
if (commItem.id == commandId)
|
||||
{
|
||||
commItem.item.PerformClick();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return base.OnContextMenuCommand(browser, frame, state, commandId, eventFlags);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class CommandItem
|
||||
{
|
||||
public int id;
|
||||
public MenuItem item;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Cef3;
|
||||
|
||||
namespace Sashulin.common
|
||||
{
|
||||
class CwbRenderHandler : CefRenderHandler
|
||||
{
|
||||
private ChromeWebBrowser webBrowser;
|
||||
public CwbRenderHandler(ChromeWebBrowser browser)
|
||||
{
|
||||
webBrowser = browser;
|
||||
}
|
||||
|
||||
protected override bool GetRootScreenRect(CefBrowser browser, ref CefRectangle rect)
|
||||
{
|
||||
return base.GetRootScreenRect(browser, ref rect);
|
||||
}
|
||||
protected override void OnScrollOffsetChanged(CefBrowser browser, double x, double y)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
protected override void OnCursorChange(CefBrowser browser, IntPtr cursorHandle, CefCursorType type, CefCursorInfo customCursorInfo)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
protected override void OnPaint(CefBrowser browser, CefPaintElementType type, CefRectangle[] dirtyRects, IntPtr buffer, int width, int height)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
protected override void OnPopupSize(CefBrowser browser, CefRectangle rect)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
protected override bool GetScreenInfo(CefBrowser browser, CefScreenInfo screenInfo)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Cef3;
|
||||
using System.Collections.Specialized;
|
||||
namespace Sashulin.common
|
||||
{
|
||||
class CwbRequestHandler : CefRequestHandler
|
||||
{
|
||||
private ChromeWebBrowser webBrowser;
|
||||
public CwbRequestHandler(ChromeWebBrowser browser)
|
||||
{
|
||||
webBrowser = browser;
|
||||
}
|
||||
protected override bool OnBeforeBrowse(CefBrowser browser, CefFrame frame, CefRequest request, bool isRedirect)
|
||||
{
|
||||
NameValueCollection map = request.GetHeaderMap();
|
||||
request.SetHeaderMap(map);
|
||||
|
||||
webBrowser.selfRequest = request;
|
||||
return base.OnBeforeBrowse(browser, frame, request, isRedirect);
|
||||
}
|
||||
|
||||
protected override CefReturnValue OnBeforeResourceLoad(CefBrowser browser, CefFrame frame, CefRequest request,CefRequestCallback callback)
|
||||
{
|
||||
return base.OnBeforeResourceLoad(browser, frame, request, callback);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Cef3;
|
||||
namespace Sashulin.common
|
||||
{
|
||||
class CwbStringVisitor : CefStringVisitor
|
||||
{
|
||||
internal string source = string.Empty;
|
||||
protected override void Visit(string value)
|
||||
{
|
||||
source = value;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Cef3;
|
||||
namespace Sashulin.common
|
||||
{
|
||||
class FileDownloadHandler : CefDownloadHandler
|
||||
{
|
||||
private ChromeWebBrowser webBrowser;
|
||||
public FileDownloadHandler(ChromeWebBrowser browser)
|
||||
{
|
||||
webBrowser = browser;
|
||||
}
|
||||
|
||||
protected override void OnBeforeDownload(CefBrowser browser, CefDownloadItem downloadItem, string suggestedName, CefBeforeDownloadCallback callback)
|
||||
{
|
||||
callback.Continue(suggestedName, true);
|
||||
base.OnBeforeDownload(browser, downloadItem, suggestedName, callback);
|
||||
webBrowser.OnBeforeDownload();
|
||||
}
|
||||
|
||||
protected override void OnDownloadUpdated(CefBrowser browser, CefDownloadItem downloadItem, CefDownloadItemCallback callback)
|
||||
{
|
||||
base.OnDownloadUpdated(browser, downloadItem, callback);
|
||||
webBrowser.OnDownloading(downloadItem.TotalBytes,
|
||||
downloadItem.ReceivedBytes,
|
||||
downloadItem.CurrentSpeed,
|
||||
downloadItem.PercentComplete,
|
||||
downloadItem.Url,
|
||||
downloadItem.SuggestedFileName,
|
||||
downloadItem.MimeType,
|
||||
downloadItem.IsComplete,
|
||||
downloadItem.IsInProgress);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,189 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using Cef3;
|
||||
|
||||
namespace Sashulin.common
|
||||
{
|
||||
|
||||
internal sealed class RequestResourceHandler : CefResourceHandler
|
||||
{
|
||||
private static int _requestNo;
|
||||
|
||||
private byte[] responseData;
|
||||
private int pos;
|
||||
|
||||
|
||||
protected override bool ProcessRequest(CefRequest request, CefCallback callback)
|
||||
{
|
||||
var requestNo = Interlocked.Increment(ref _requestNo);
|
||||
|
||||
var response = new StringBuilder();
|
||||
|
||||
response.AppendFormat("<pre>\n");
|
||||
response.AppendFormat("Requests processed by DemoAppResourceHandler: {0}\n", requestNo);
|
||||
|
||||
response.AppendFormat("Method: {0}\n", request.Method);
|
||||
response.AppendFormat("URL: {0}\n", request.Url);
|
||||
|
||||
response.AppendLine();
|
||||
response.AppendLine("Headers:");
|
||||
var headers = request.GetHeaderMap();
|
||||
foreach (string key in headers)
|
||||
{
|
||||
foreach (var value in headers.GetValues(key))
|
||||
{
|
||||
response.AppendFormat("{0}: {1}\n", key, value);
|
||||
}
|
||||
}
|
||||
response.AppendLine();
|
||||
|
||||
response.AppendFormat("</pre>\n");
|
||||
|
||||
responseData = Encoding.UTF8.GetBytes(response.ToString());
|
||||
|
||||
callback.Continue();
|
||||
return true;
|
||||
}
|
||||
|
||||
protected override void GetResponseHeaders(CefResponse response, out long responseLength, out string redirectUrl)
|
||||
{
|
||||
response.MimeType = "text/html";
|
||||
response.Status = 200;
|
||||
response.StatusText = "OK, hello from handler!";
|
||||
|
||||
var headers = new NameValueCollection(StringComparer.InvariantCultureIgnoreCase);
|
||||
headers.Add("Cache-Control", "private");
|
||||
response.SetHeaderMap(headers);
|
||||
|
||||
responseLength = responseData.LongLength;
|
||||
redirectUrl = null;
|
||||
}
|
||||
|
||||
protected override bool ReadResponse(Stream response, int bytesToRead, out int bytesRead, CefCallback callback)
|
||||
{
|
||||
if (bytesToRead == 0 || pos >= responseData.Length)
|
||||
{
|
||||
bytesRead = 0;
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
response.Write(responseData, pos, bytesToRead);
|
||||
pos += bytesToRead;
|
||||
bytesRead = bytesToRead;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
protected override bool CanGetCookie(CefCookie cookie)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
protected override bool CanSetCookie(CefCookie cookie)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
protected override void Cancel()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user