// Copyright © 2017 The CefSharp Authors. All rights reserved.
//
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
using System;
using System.Security.Cryptography.X509Certificates;
namespace CefSharp.Example.RequestEventHandler
{
///
/// To use this class, check for more information about the event parameters.
/// Often you will find MANDATORY information on how to work with the parameters or which thread the call comes from.
/// Simply check out the interface' method the event was named by.
/// (e.g corresponds to
/// )
/// inspired by:
/// https://github.com/cefsharp/CefSharp/blob/fa41529853b2527eb0468a507ab6c5bd0768eb59/CefSharp.Example/RequestHandler.cs
///
public class RequestEventHandler : IRequestHandler
{
public event EventHandler OnBeforeBrowseEvent;
public event EventHandler OnOpenUrlFromTabEvent;
public event EventHandler OnCertificateErrorEvent;
public event EventHandler OnPluginCrashedEvent;
public event EventHandler OnBeforeResourceLoadEvent;
public event EventHandler GetAuthCredentialsEvent;
public event EventHandler OnRenderProcessTerminatedEvent;
public event EventHandler CanGetCookiesEvent;
public event EventHandler CanSetCookieEvent;
public event EventHandler OnQuotaRequestEvent;
public event EventHandler OnResourceRedirectEvent;
///
/// SECURITY WARNING: YOU SHOULD USE THIS EVENT TO ENFORCE RESTRICTIONS BASED ON SCHEME, HOST OR OTHER URL ANALYSIS
/// BEFORE ALLOWING OS EXECUTION.
///
public event EventHandler OnProtocolExecutionEvent;
public event EventHandler OnRenderViewReadyEvent;
public event EventHandler OnResourceResponseEvent;
public event EventHandler GetResourceResponseFilterEvent;
public event EventHandler OnResourceLoadCompleteEvent;
bool IRequestHandler.OnBeforeBrowse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, bool userGesture, bool isRedirect)
{
var args = new OnBeforeBrowseEventArgs(browserControl, browser, frame, request, userGesture, isRedirect);
OnBeforeBrowseEvent?.Invoke(this, args);
return args.CancelNavigation;
}
bool IRequestHandler.OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture)
{
var args = new OnOpenUrlFromTabEventArgs(browserControl, browser, frame, targetUrl, targetDisposition, userGesture);
OnOpenUrlFromTabEvent?.Invoke(this, args);
return args.CancelNavigation;
}
bool IRequestHandler.OnCertificateError(IWebBrowser browserControl, IBrowser browser, CefErrorCode errorCode, string requestUrl, ISslInfo sslInfo, IRequestCallback callback)
{
var args = new OnCertificateErrorEventArgs(browserControl, browser, errorCode, requestUrl, sslInfo, callback);
OnCertificateErrorEvent?.Invoke(this, args);
EnsureCallbackDisposal(callback);
return args.ContinueAsync;
}
void IRequestHandler.OnPluginCrashed(IWebBrowser browserControl, IBrowser browser, string pluginPath)
{
var args = new OnPluginCrashedEventArgs(browserControl, browser, pluginPath);
OnPluginCrashedEvent?.Invoke(this, args);
}
CefReturnValue IRequestHandler.OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
{
var args = new OnBeforeResourceLoadEventArgs(browserControl, browser, frame, request, callback);
OnBeforeResourceLoadEvent?.Invoke(this, args);
EnsureCallbackDisposal(callback);
return args.ContinuationHandling;
}
bool IRequestHandler.GetAuthCredentials(IWebBrowser browserControl, IBrowser browser, IFrame frame, bool isProxy, string host, int port, string realm, string scheme, IAuthCallback callback)
{
var args = new GetAuthCredentialsEventArgs(browserControl, browser, frame, isProxy, host, port, realm, scheme, callback);
GetAuthCredentialsEvent?.Invoke(this, args);
EnsureCallbackDisposal(callback);
return args.ContinueAsync;
}
void IRequestHandler.OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status)
{
var args = new OnRenderProcessTerminatedEventArgs(browserControl, browser, status);
OnRenderProcessTerminatedEvent?.Invoke(this, args);
}
bool IRequestHandler.CanGetCookies(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request)
{
var args = new CanGetCookiesEventArg(browserControl, browser, frame, request);
CanGetCookiesEvent?.Invoke(this, args);
return args.GetCookies;
}
bool IRequestHandler.CanSetCookie(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, Cookie cookie)
{
var args = new CanSetCookieEventArg(browserControl, browser, frame, request, cookie);
CanSetCookieEvent?.Invoke(this, args);
return args.SetCookie;
}
bool IRequestHandler.OnQuotaRequest(IWebBrowser browserControl, IBrowser browser, string originUrl, long newSize, IRequestCallback callback)
{
var args = new OnQuotaRequestEventArgs(browserControl, browser, originUrl, newSize, callback);
OnQuotaRequestEvent?.Invoke(this, args);
EnsureCallbackDisposal(callback);
return args.ContinueAsync;
}
void IRequestHandler.OnResourceRedirect(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, ref string newUrl)
{
var args = new OnResourceRedirectEventArgs(browserControl, browser, frame, request, response, newUrl);
OnResourceRedirectEvent?.Invoke(this, args);
if (!Equals(newUrl, args.NewUrl))
{
newUrl = args.NewUrl;
}
}
bool IRequestHandler.OnProtocolExecution(IWebBrowser browserControl, IBrowser browser, string url)
{
var args = new OnProtocolExecutionEventArgs(browserControl, browser, url);
OnProtocolExecutionEvent?.Invoke(this, args);
return args.AttemptExecution;
}
void IRequestHandler.OnRenderViewReady(IWebBrowser browserControl, IBrowser browser)
{
var args = new OnRenderViewReadyEventArgs(browserControl, browser);
OnRenderViewReadyEvent?.Invoke(this, args);
}
bool IRequestHandler.OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
var args = new OnResourceResponseEventArgs(browserControl, browser, frame, request, response);
OnResourceResponseEvent?.Invoke(this, args);
return args.RedirectOrRetry;
}
IResponseFilter IRequestHandler.GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
var args = new GetResourceResponseFilterEventArgs(browserControl, browser, frame, request, response);
GetResourceResponseFilterEvent?.Invoke(this, args);
return args.ResponseFilter;
}
void IRequestHandler.OnResourceLoadComplete(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)
{
var args = new OnResourceLoadCompleteEventArgs(browserControl, browser, frame, request, response, status, receivedContentLength);
OnResourceLoadCompleteEvent?.Invoke(this, args);
}
bool IRequestHandler.OnSelectClientCertificate(IWebBrowser browserControl, IBrowser browser, bool isProxy, string host, int port, X509Certificate2Collection certificates, ISelectClientCertificateCallback callback)
{
//TODO: Someone please contribute an implementation of this
throw new NotImplementedException();
}
private static void EnsureCallbackDisposal(IRequestCallback callbackToDispose)
{
if (callbackToDispose != null && !callbackToDispose.IsDisposed)
{
callbackToDispose.Dispose();
}
}
private static void EnsureCallbackDisposal(IAuthCallback callbackToDispose)
{
if (callbackToDispose != null && !callbackToDispose.IsDisposed)
{
callbackToDispose.Dispose();
}
}
}
}