113 lines
4.0 KiB
C#
113 lines
4.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using Xilium.CefGlue;
|
|
using Lskj.Business;
|
|
|
|
namespace Lskj.Control.BrowserSetting
|
|
{
|
|
public class BsRequestHandler : CefRequestHandler
|
|
{
|
|
private readonly CefResourceRequestHandler externalProtocolResourceRequestHandler = new BsExternalProtocolResourceRequestHandler();
|
|
|
|
protected override CefResourceRequestHandler GetResourceRequestHandler(CefBrowser browser, CefFrame frame, CefRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
|
|
{
|
|
if (BsExternalProtocolHandler.IsPrintProtocol(request.Url))
|
|
return externalProtocolResourceRequestHandler;
|
|
|
|
return null;
|
|
}
|
|
|
|
protected override bool OnBeforeBrowse(CefBrowser browser, CefFrame frame, CefRequest request, bool userGesture, bool isRedirect)
|
|
{
|
|
string url = request.Url;
|
|
|
|
if (BsExternalProtocolHandler.IsPrintProtocol(url))
|
|
{
|
|
if (frame == null || frame.IsMain)
|
|
{
|
|
BsExternalProtocolHandler.TryHandle(url);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
return base.OnBeforeBrowse(browser, frame, request, userGesture, isRedirect);
|
|
}
|
|
|
|
protected override bool OnOpenUrlFromTab(CefBrowser browser, CefFrame frame, string targetUrl, CefWindowOpenDisposition targetDisposition, bool userGesture)
|
|
{
|
|
if (BsExternalProtocolHandler.TryHandle(targetUrl))
|
|
return true;
|
|
|
|
return base.OnOpenUrlFromTab(browser, frame, targetUrl, targetDisposition, userGesture);
|
|
}
|
|
|
|
protected override void OnRenderProcessTerminated(CefBrowser browser, CefTerminationStatus status)
|
|
{
|
|
// Reloading immediately from this callback can create a new
|
|
// renderer while the old one is tearing down and cause a native
|
|
// libcef crash loop. Record the termination and let the module
|
|
// lifecycle decide whether a later reopen is appropriate.
|
|
LogUtil.WriteError("CEF 渲染进程已终止,状态=" + status,
|
|
new InvalidOperationException("CEF renderer termination status=" + status));
|
|
}
|
|
}
|
|
|
|
internal static class BsExternalProtocolHandler
|
|
{
|
|
private const string PrintProtocol = "lskjprint:";
|
|
|
|
public static bool IsPrintProtocol(string url)
|
|
{
|
|
return !string.IsNullOrEmpty(url) && url.StartsWith(PrintProtocol, StringComparison.OrdinalIgnoreCase);
|
|
}
|
|
|
|
public static bool TryHandle(string url)
|
|
{
|
|
if (!IsPrintProtocol(url))
|
|
return false;
|
|
|
|
try
|
|
{
|
|
var processStartInfo = new System.Diagnostics.ProcessStartInfo(url)
|
|
{
|
|
UseShellExecute = true
|
|
};
|
|
System.Diagnostics.Process.Start(processStartInfo);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
System.Windows.Forms.MessageBox.Show(
|
|
"打开打印程序失败:" + ex.Message,
|
|
"提示",
|
|
System.Windows.Forms.MessageBoxButtons.OK,
|
|
System.Windows.Forms.MessageBoxIcon.Warning);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
internal sealed class BsExternalProtocolResourceRequestHandler : CefResourceRequestHandler
|
|
{
|
|
protected override CefCookieAccessFilter GetCookieAccessFilter(CefBrowser browser, CefFrame frame, CefRequest request)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
protected override void OnProtocolExecution(CefBrowser browser, CefFrame frame, CefRequest request, ref bool allowOsExecution)
|
|
{
|
|
if (BsExternalProtocolHandler.IsPrintProtocol(request.Url))
|
|
{
|
|
allowOsExecution = true;
|
|
return;
|
|
}
|
|
|
|
base.OnProtocolExecution(browser, frame, request, ref allowOsExecution);
|
|
}
|
|
}
|
|
}
|