d3587a16f1
Rollback tag: pre-current-browser-sync-20260818
107 lines
3.6 KiB
C#
107 lines
3.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using Xilium.CefGlue;
|
|
|
|
namespace Lskj.Control.BrowserSetting2
|
|
{
|
|
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.TryMatch(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.TryMatch(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)
|
|
{
|
|
browser.Reload();
|
|
}
|
|
}
|
|
|
|
internal static class BsExternalProtocolHandler
|
|
{
|
|
private const string PrintProtocol = "lskjprint:";
|
|
|
|
public static bool TryMatch(string url)
|
|
{
|
|
return !string.IsNullOrEmpty(url) && url.StartsWith(PrintProtocol, StringComparison.OrdinalIgnoreCase);
|
|
}
|
|
|
|
public static bool TryHandle(string url)
|
|
{
|
|
if (!TryMatch(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.TryMatch(request.Url))
|
|
{
|
|
allowOsExecution = true;
|
|
return;
|
|
}
|
|
|
|
base.OnProtocolExecution(browser, frame, request, ref allowOsExecution);
|
|
}
|
|
}
|
|
}
|