init lserp cs 5.0

This commit is contained in:
cyf
2026-07-10 15:25:05 +08:00
commit 90f3fda86a
3799 changed files with 976868 additions and 0 deletions
@@ -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);
}
}
}
+52
View File
@@ -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);
}
}
}
+104
View File
@@ -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;
}
}
}
+25
View File
@@ -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;
}
}
}
+191
View File
@@ -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;
}
}
}
+32
View File
@@ -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; }
}
}
}
+47
View File
@@ -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);
}
}
}
+63
View File
@@ -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()
{
}
}
}