namespace Xilium.CefGlue
{
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using Xilium.CefGlue.Interop;
///
/// Implement this interface to provide handler implementations. The handler
/// instance will not be released until all objects related to the context have
/// been destroyed.
///
public abstract unsafe partial class CefRequestContextHandler
{
private void on_request_context_initialized(cef_request_context_handler_t* self, cef_request_context_t* request_context)
{
CheckSelf(self);
var mRequestContext = CefRequestContext.FromNative(request_context); // TODO dispose?
OnRequestContextInitialized(mRequestContext);
}
///
/// Called on the browser process UI thread immediately after the request
/// context has been initialized.
///
protected virtual void OnRequestContextInitialized(CefRequestContext requestContext) { }
private int on_before_plugin_load(cef_request_context_handler_t* self, cef_string_t* mime_type, cef_string_t* plugin_url, int is_main_frame, cef_string_t* top_origin_url, cef_web_plugin_info_t* plugin_info, CefPluginPolicy* plugin_policy)
{
CheckSelf(self);
var mMimeType = cef_string_t.ToString(mime_type);
var mPluginUrl = cef_string_t.ToString(plugin_url);
var mIsMainFrame = is_main_frame != 0;
var mTopOriginUrl = cef_string_t.ToString(top_origin_url);
var mPluginInfo = CefWebPluginInfo.FromNative(plugin_info); // TODO dispose?
var mPluginPolicy = *plugin_policy;
var result = OnBeforePluginLoad(mMimeType, mPluginUrl, mIsMainFrame, mTopOriginUrl, mPluginInfo, ref mPluginPolicy);
*plugin_policy = mPluginPolicy;
return result ? 1 : 0;
}
///
/// Called on multiple browser process threads before a plugin instance is
/// loaded. |mime_type| is the mime type of the plugin that will be loaded.
/// |plugin_url| is the content URL that the plugin will load and may be empty.
/// |is_main_frame| will be true if the plugin is being loaded in the main
/// (top-level) frame, |top_origin_url| is the URL for the top-level frame that
/// contains the plugin when loading a specific plugin instance or empty when
/// building the initial list of enabled plugins for 'navigator.plugins'
/// JavaScript state. |plugin_info| includes additional information about the
/// plugin that will be loaded. |plugin_policy| is the recommended policy.
/// Modify |plugin_policy| and return true to change the policy. Return false
/// to use the recommended policy. The default plugin policy can be set at
/// runtime using the `--plugin-policy=[allow|detect|block]` command-line flag.
/// Decisions to mark a plugin as disabled by setting |plugin_policy| to
/// PLUGIN_POLICY_DISABLED may be cached when |top_origin_url| is empty. To
/// purge the plugin list cache and potentially trigger new calls to this
/// method call CefRequestContext::PurgePluginListCache.
///
protected virtual bool OnBeforePluginLoad(string mimeType, string pluginUrl, bool isMainFrame, string topOriginUrl, CefWebPluginInfo pluginInfo, ref CefPluginPolicy pluginPolicy)
{
return false;
}
private cef_resource_request_handler_t* get_resource_request_handler(cef_request_context_handler_t* self, cef_browser_t* browser, cef_frame_t* frame, cef_request_t* request, int is_navigation, int is_download, cef_string_t* request_initiator, int* disable_default_handling)
{
CheckSelf(self);
var m_browser = CefBrowser.FromNativeOrNull(browser);
var m_frame = CefFrame.FromNativeOrNull(frame);
var m_request = CefRequest.FromNative(request); // TODO dispose?
var m_isNavigation = is_navigation != 0;
var m_isDownload = is_download != 0;
var m_requestInitiator = cef_string_t.ToString(request_initiator);
var m_disableDefaultHandling = *disable_default_handling != 0;
var m_result = GetResourceRequestHandler(m_browser, m_frame, m_request, m_isNavigation, m_isDownload, m_requestInitiator, ref m_disableDefaultHandling);
*disable_default_handling = m_disableDefaultHandling ? 1 : 0;
return m_result != null ? m_result.ToNative() : null;
}
///
/// Called on the browser process IO thread before a resource request is
/// initiated. The |browser| and |frame| values represent the source of the
/// request, and may be NULL for requests originating from service workers or
/// CefURLRequest. |request| represents the request contents and cannot be
/// modified in this callback. |is_navigation| will be true if the resource
/// request is a navigation. |is_download| will be true if the resource request
/// is a download. |request_initiator| is the origin (scheme + domain) of the
/// page that initiated the request. Set |disable_default_handling| to true to
/// disable default handling of the request, in which case it will need to be
/// handled via CefResourceRequestHandler::GetResourceHandler or it will be
/// canceled. To allow the resource load to proceed with default handling
/// return NULL. To specify a handler for the resource return a
/// CefResourceRequestHandler object. This method will not be called if the
/// client associated with |browser| returns a non-NULL value from
/// CefRequestHandler::GetResourceRequestHandler for the same request
/// (identified by CefRequest::GetIdentifier).
///
protected abstract CefResourceRequestHandler GetResourceRequestHandler(CefBrowser browser, CefFrame frame, CefRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling);
}
}