Files
2026-07-10 15:25:05 +08:00

385 lines
16 KiB
C#

namespace Cef3
{
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using Cef3.Interop;
/// <summary>
/// Implement this interface to handle events related to browser requests. The
/// methods of this class will be called on the thread indicated.
/// </summary>
public abstract unsafe partial class CefRequestHandler
{
private int on_before_browse(cef_request_handler_t* self, cef_browser_t* browser, cef_frame_t* frame, cef_request_t* request, int is_redirect)
{
CheckSelf(self);
var m_browser = CefBrowser.FromNative(browser);
var m_frame = CefFrame.FromNative(frame);
var m_request = CefRequest.FromNative(request);
var m_isRedirect = is_redirect != 0;
var result = OnBeforeBrowse(m_browser, m_frame, m_request, m_isRedirect);
return result ? 1 : 0;
}
/// <summary>
/// Called on the UI thread before browser navigation. Return true to cancel
/// the navigation or false to allow the navigation to proceed. The |request|
/// object cannot be modified in this callback.
/// CefLoadHandler::OnLoadingStateChange will be called twice in all cases.
/// If the navigation is allowed CefLoadHandler::OnLoadStart and
/// CefLoadHandler::OnLoadEnd will be called. If the navigation is canceled
/// CefLoadHandler::OnLoadError will be called with an |errorCode| value of
/// ERR_ABORTED.
/// </summary>
protected virtual bool OnBeforeBrowse(CefBrowser browser, CefFrame frame, CefRequest request, bool isRedirect)
{
return false;
}
private int on_open_urlfrom_tab(cef_request_handler_t* self, cef_browser_t* browser, cef_frame_t* frame, cef_string_t* target_url, CefWindowOpenDisposition target_disposition, int user_gesture)
{
CheckSelf(self);
var m_browser = CefBrowser.FromNative(browser);
var m_frame = CefFrame.FromNative(frame);
var m_targetUrl = cef_string_t.ToString(target_url);
var m_userGesture = user_gesture != 0;
var m_result = OnOpenUrlFromTab(m_browser, m_frame, m_targetUrl, target_disposition, m_userGesture);
return m_result ? 1 : 0;
}
/// <summary>
/// Called on the UI thread before OnBeforeBrowse in certain limited cases
/// where navigating a new or different browser might be desirable. This
/// includes user-initiated navigation that might open in a special way (e.g.
/// links clicked via middle-click or ctrl + left-click) and certain types of
/// cross-origin navigation initiated from the renderer process (e.g.
/// navigating the top-level frame to/from a file URL). The |browser| and
/// |frame| values represent the source of the navigation. The
/// |target_disposition| value indicates where the user intended to navigate
/// the browser based on standard Chromium behaviors (e.g. current tab,
/// new tab, etc). The |user_gesture| value will be true if the browser
/// navigated via explicit user gesture (e.g. clicking a link) or false if it
/// navigated automatically (e.g. via the DomContentLoaded event). Return true
/// to cancel the navigation or false to allow the navigation to proceed in the
/// source browser's top-level frame.
/// </summary>
protected virtual bool OnOpenUrlFromTab(CefBrowser browser, CefFrame frame, string targetUrl, CefWindowOpenDisposition targetDisposition, bool userGesture)
{
return false;
}
private CefReturnValue on_before_resource_load(cef_request_handler_t* self, cef_browser_t* browser, cef_frame_t* frame, cef_request_t* request, cef_request_callback_t* callback)
{
CheckSelf(self);
var m_browser = CefBrowser.FromNative(browser);
var m_frame = CefFrame.FromNative(frame);
var m_request = CefRequest.FromNative(request);
var m_callback = CefRequestCallback.FromNative(callback);
var result = OnBeforeResourceLoad(m_browser, m_frame, m_request, m_callback);
m_request.Dispose();
return result;
}
/// <summary>
/// Called on the IO thread before a resource request is loaded. The |request|
/// object may be modified. Return RV_CONTINUE to continue the request
/// immediately. Return RV_CONTINUE_ASYNC and call CefRequestCallback::
/// Continue() at a later time to continue or cancel the request
/// asynchronously. Return RV_CANCEL to cancel the request immediately.
/// </summary>
protected virtual CefReturnValue OnBeforeResourceLoad(CefBrowser browser, CefFrame frame, CefRequest request, CefRequestCallback callback)
{
return CefReturnValue.Continue;
}
private cef_resource_handler_t* get_resource_handler(cef_request_handler_t* self, cef_browser_t* browser, cef_frame_t* frame, cef_request_t* request)
{
CheckSelf(self);
var m_browser = CefBrowser.FromNative(browser);
var m_frame = CefFrame.FromNative(frame);
var m_request = CefRequest.FromNative(request);
var handler = GetResourceHandler(m_browser, m_frame, m_request);
m_request.Dispose();
return handler != null ? handler.ToNative() : null;
}
/// <summary>
/// Called on the IO thread before a resource is loaded. To allow the resource
/// to load normally return NULL. To specify a handler for the resource return
/// a CefResourceHandler object. The |request| object should not be modified in
/// this callback.
/// </summary>
protected virtual CefResourceHandler GetResourceHandler(CefBrowser browser, CefFrame frame, CefRequest request)
{
return null;
}
private void on_resource_redirect(cef_request_handler_t* self, cef_browser_t* browser, cef_frame_t* frame, cef_request_t* request, cef_string_t* new_url)
{
CheckSelf(self);
var m_browser = CefBrowser.FromNative(browser);
var m_frame = CefFrame.FromNative(frame);
var m_request = CefRequest.FromNative(request);
var m_newUrl = cef_string_t.ToString(new_url);
var o_newUrl = m_newUrl;
OnResourceRedirect(m_browser, m_frame, m_request, ref m_newUrl);
if ((object)m_newUrl != (object)o_newUrl)
{
cef_string_t.Copy(m_newUrl, new_url);
}
}
/// <summary>
/// Called on the IO thread when a resource load is redirected. The |request|
/// parameter will contain the old URL and other request-related information.
/// The |new_url| parameter will contain the new URL and can be changed if
/// desired. The |request| object cannot be modified in this callback.
/// </summary>
protected virtual void OnResourceRedirect(CefBrowser browser, CefFrame frame, CefRequest request, ref string newUrl)
{
}
private int on_resource_response(cef_request_handler_t* self, cef_browser_t* browser, cef_frame_t* frame, cef_request_t* request, cef_response_t* response)
{
CheckSelf(self);
var m_browser = CefBrowser.FromNative(browser);
var m_frame = CefFrame.FromNative(frame);
var m_request = CefRequest.FromNative(request);
var m_response = CefResponse.FromNative(response);
var m_result = OnResourceResponse(m_browser, m_frame, m_request, m_response);
return m_result ? 1 : 0;
}
/// <summary>
/// Called on the IO thread when a resource response is received. To allow the
/// resource to load normally return false. To redirect or retry the resource
/// modify |request| (url, headers or post body) and return true. The
/// |response| object cannot be modified in this callback.
/// </summary>
protected virtual bool OnResourceResponse(CefBrowser browser, CefFrame frame, CefRequest request, CefResponse response)
{
return false;
}
private int get_auth_credentials(cef_request_handler_t* self, cef_browser_t* browser, cef_frame_t* frame, int isProxy, cef_string_t* host, int port, cef_string_t* realm, cef_string_t* scheme, cef_auth_callback_t* callback)
{
CheckSelf(self);
var m_browser = CefBrowser.FromNative(browser);
var m_frame = CefFrame.FromNative(frame);
var m_host = cef_string_t.ToString(host);
var m_realm = cef_string_t.ToString(realm);
var m_scheme = cef_string_t.ToString(scheme);
var m_callback = CefAuthCallback.FromNative(callback);
var result = GetAuthCredentials(m_browser, m_frame, isProxy != 0, m_host, port, m_realm, m_scheme, m_callback);
return result ? 1 : 0;
}
/// <summary>
/// Called on the IO thread when the browser needs credentials from the user.
/// |isProxy| indicates whether the host is a proxy server. |host| contains the
/// hostname and |port| contains the port number. Return true to continue the
/// request and call CefAuthCallback::Continue() either in this method or
/// at a later time when the authentication information is available. Return
/// false to cancel the request immediately.
/// </summary>
protected virtual bool GetAuthCredentials(CefBrowser browser, CefFrame frame, bool isProxy, string host, int port, string realm, string scheme, CefAuthCallback callback)
{
return false;
}
private int on_quota_request(cef_request_handler_t* self, cef_browser_t* browser, cef_string_t* origin_url, long new_size, cef_request_callback_t* callback)
{
CheckSelf(self);
var m_browser = CefBrowser.FromNative(browser);
var m_origin_url = cef_string_t.ToString(origin_url);
var m_callback = CefRequestCallback.FromNative(callback);
var result = OnQuotaRequest(m_browser, m_origin_url, new_size, m_callback);
return result ? 1 : 0;
}
/// <summary>
/// Called on the IO thread when JavaScript requests a specific storage quota
/// size via the webkitStorageInfo.requestQuota function. |origin_url| is the
/// origin of the page making the request. |new_size| is the requested quota
/// size in bytes. Return true to continue the request and call
/// CefRequestCallback::Continue() either in this method or at a later time to
/// grant or deny the request. Return false to cancel the request immediately.
/// </summary>
protected virtual bool OnQuotaRequest(CefBrowser browser, string originUrl, long newSize, CefRequestCallback callback)
{
callback.Continue(true);
return true;
}
private void on_protocol_execution(cef_request_handler_t* self, cef_browser_t* browser, cef_string_t* url, int* allow_os_execution)
{
CheckSelf(self);
var m_browser = CefBrowser.FromNative(browser);
var m_url = cef_string_t.ToString(url);
bool m_allow_os_execution;
OnProtocolExecution(m_browser, m_url, out m_allow_os_execution);
*allow_os_execution = m_allow_os_execution ? 1 : 0;
}
/// <summary>
/// Called on the UI thread to handle requests for URLs with an unknown
/// protocol component. Set |allow_os_execution| to true to attempt execution
/// via the registered OS protocol handler, if any.
/// SECURITY WARNING: YOU SHOULD USE THIS METHOD TO ENFORCE RESTRICTIONS BASED
/// ON SCHEME, HOST OR OTHER URL ANALYSIS BEFORE ALLOWING OS EXECUTION.
/// </summary>
protected virtual void OnProtocolExecution(CefBrowser browser, string url, out bool allowOSExecution)
{
allowOSExecution = true;
}
private int on_certificate_error(cef_request_handler_t* self, cef_browser_t* browser, CefErrorCode cert_error, cef_string_t* request_url, cef_sslinfo_t* ssl_info, cef_request_callback_t* callback)
{
CheckSelf(self);
var m_browser = CefBrowser.FromNative(browser);
var m_request_url = cef_string_t.ToString(request_url);
var m_ssl_info = CefSslInfo.FromNative(ssl_info);
var m_callback = CefRequestCallback.FromNativeOrNull(callback);
var result = OnCertificateError(m_browser, cert_error, m_request_url, m_ssl_info, m_callback);
return result ? 1 : 0;
}
/// <summary>
/// Called on the UI thread to handle requests for URLs with an invalid
/// SSL certificate. Return true and call CefRequestCallback::Continue() either
/// in this method or at a later time to continue or cancel the request. Return
/// false to cancel the request immediately. If |callback| is empty the error
/// cannot be recovered from and the request will be canceled automatically.
/// If CefSettings.ignore_certificate_errors is set all invalid certificates
/// will be accepted without calling this method.
/// </summary>
protected virtual bool OnCertificateError(CefBrowser browser, CefErrorCode certError, string requestUrl, CefSslInfo sslInfo, CefRequestCallback callback)
{
return false;
}
private int on_before_plugin_load(cef_request_handler_t* self, cef_browser_t* browser, cef_string_t* url, cef_string_t* policy_url, cef_web_plugin_info_t* info)
{
CheckSelf(self);
var m_browser = CefBrowser.FromNative(browser);
var m_url = cef_string_t.ToString(url);
var m_policy_url = cef_string_t.ToString(policy_url);
var m_info = CefWebPluginInfo.FromNative(info);
var result = OnBeforePluginLoad(m_browser, m_url, m_policy_url, m_info);
return result ? 1 : 0;
}
/// <summary>
/// Called on the browser process IO thread before a plugin is loaded. Return
/// true to block loading of the plugin.
/// </summary>
protected virtual bool OnBeforePluginLoad(CefBrowser browser, string url, string policyUrl, CefWebPluginInfo info)
{
return false;
}
private void on_plugin_crashed(cef_request_handler_t* self, cef_browser_t* browser, cef_string_t* plugin_path)
{
CheckSelf(self);
var m_browser = CefBrowser.FromNative(browser);
var m_plugin_path = cef_string_t.ToString(plugin_path);
OnPluginCrashed(m_browser, m_plugin_path);
}
/// <summary>
/// Called on the browser process UI thread when a plugin has crashed.
/// |plugin_path| is the path of the plugin that crashed.
/// </summary>
protected virtual void OnPluginCrashed(CefBrowser browser, string pluginPath)
{
}
private void on_render_view_ready(cef_request_handler_t* self, cef_browser_t* browser)
{
CheckSelf(self);
var m_browser = CefBrowser.FromNative(browser);
OnRenderViewReady(m_browser);
}
/// <summary>
/// Called on the browser process UI thread when the render view associated
/// with |browser| is ready to receive/handle IPC messages in the render
/// process.
/// </summary>
protected virtual void OnRenderViewReady(CefBrowser browser)
{
}
private void on_render_process_terminated(cef_request_handler_t* self, cef_browser_t* browser, CefTerminationStatus status)
{
CheckSelf(self);
var m_browser = CefBrowser.FromNative(browser);
OnRenderProcessTerminated(m_browser, status);
}
/// <summary>
/// Called on the browser process UI thread when the render process
/// terminates unexpectedly. |status| indicates how the process
/// terminated.
/// </summary>
protected virtual void OnRenderProcessTerminated(CefBrowser browser, CefTerminationStatus status)
{
}
}
}