// Copyright © 2010-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 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 isRedirect) { var args = new OnBeforeBrowseEventArgs(browserControl, browser, frame, request, isRedirect); ExecuteEventHandler(OnBeforeBrowseEvent, 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); ExecuteEventHandler(OnOpenUrlFromTabEvent, 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); ExecuteEventHandler(OnCertificateErrorEvent, args); EnsureCallbackDisposal(callback); return args.ContinueAsync; } void IRequestHandler.OnPluginCrashed(IWebBrowser browserControl, IBrowser browser, string pluginPath) { var args = new OnPluginCrashedEventArgs(browserControl, browser, pluginPath); ExecuteEventHandler(OnPluginCrashedEvent, args); } CefReturnValue IRequestHandler.OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback) { var args = new OnBeforeResourceLoadEventArgs(browserControl, browser, frame, request, callback); ExecuteEventHandler(OnBeforeResourceLoadEvent, 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); ExecuteEventHandler(GetAuthCredentialsEvent, args); EnsureCallbackDisposal(callback); return args.ContinueAsync; } void IRequestHandler.OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status) { var args = new OnRenderProcessTerminatedEventArgs(browserControl, browser, status); ExecuteEventHandler(OnRenderProcessTerminatedEvent, args); } bool IRequestHandler.OnQuotaRequest(IWebBrowser browserControl, IBrowser browser, string originUrl, long newSize, IRequestCallback callback) { var args = new OnQuotaRequestEventArgs(browserControl, browser, originUrl, newSize, callback); ExecuteEventHandler(OnQuotaRequestEvent, 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); ExecuteEventHandler(OnResourceRedirectEvent, 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); ExecuteEventHandler(OnProtocolExecutionEvent, args); return args.AttemptExecution; } void IRequestHandler.OnRenderViewReady(IWebBrowser browserControl, IBrowser browser) { var args = new OnRenderViewReadyEventArgs(browserControl, browser); ExecuteEventHandler(OnRenderViewReadyEvent, args); } bool IRequestHandler.OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response) { var args = new OnResourceResponseEventArgs(browserControl, browser, frame, request, response); ExecuteEventHandler(OnResourceResponseEvent, 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); ExecuteEventHandler(GetResourceResponseFilterEvent, 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); ExecuteEventHandler(OnResourceLoadCompleteEvent, 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(); } } private void ExecuteEventHandler(EventHandler handler, T args) { if (handler != null) { handler(this, args); } } } }