// Copyright © 2018 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;
namespace CefSharp
{
///
/// Implement this interface to handle events related to browser requests.
/// The methods of this class will be called on the CEF IO thread unless otherwise indicated.
///
public interface IResourceRequestHandler : IDisposable
{
///
/// Called on the CEF IO thread before a resource request is loaded.
/// To optionally filter cookies for the request return a object.
///
/// The ChromiumWebBrowser control
/// the browser object - may be null if originating from ServiceWorker or CefURLRequest
/// the frame object - may be null if originating from ServiceWorker or CefURLRequest
/// the request object - can be modified in this callback.
/// To optionally filter cookies for the request return a ICookieAccessFilter instance otherwise return null.
ICookieAccessFilter GetCookieAccessFilter(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request);
///
/// Called on the CEF IO thread before a resource request is loaded.
/// To redirect or change the resource load optionally modify .
/// Modification of the request URL will be treated as a redirect
///
/// The ChromiumWebBrowser control
/// the browser object - may be null if originating from ServiceWorker or CefURLRequest
/// the frame object - may be null if originating from ServiceWorker or CefURLRequest
/// the request object - can be modified in this callback.
/// Callback interface used for asynchronous continuation of url requests.
///
/// Return to continue the request immediately.
/// Return and call or at a later time to continue or the cancel the request asynchronously.
/// Return to cancel the request immediately.
///
CefReturnValue OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback);
///
/// Called on the CEF IO thread before a resource is loaded. To specify a handler for the resource return a object
///
/// The browser UI control
/// the browser object - may be null if originating from ServiceWorker or CefURLRequest
/// the frame object - may be null if originating from ServiceWorker or CefURLRequest
/// the request object - cannot be modified in this callback
/// To allow the resource to load using the default network loader return null otherwise return an instance of with a valid stream
IResourceHandler GetResourceHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request);
///
/// Called on the CEF IO thread when a resource load is redirected.
/// The parameter will contain the old URL and other request-related information.
/// The parameter will contain the response that resulted in the
/// redirect. The parameter will contain the new URL and can be changed if desired.
///
/// The ChromiumWebBrowser control
/// the browser object - may be null if originating from ServiceWorker or CefURLRequest
/// the frame object - may be null if originating from ServiceWorker or CefURLRequest
/// the request object - cannot be modified in this callback
/// the response object - cannot be modified in this callback
/// the new URL and can be changed if desired
void OnResourceRedirect(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response, ref string newUrl);
///
/// Called on the CEF IO thread when a resource response is received.
/// To allow the resource load to proceed without modification return false. To redirect or
/// retry the resource load optionally modify and return true.
/// Modification of the request URL will be treated as a redirect. Requests
/// handled using the default network loader cannot be redirected in this
/// callback.
///
/// WARNING: Redirecting using this method is deprecated. Use
/// OnBeforeResourceLoad or GetResourceHandler to perform redirects.
///
/// The ChromiumWebBrowser control
/// the browser object - may be null if originating from ServiceWorker or CefURLRequest
/// the frame object - may be null if originating from ServiceWorker or CefURLRequest
/// the request object
/// the response object - cannot be modified in this callback
///
/// To allow the resource load to proceed without modification return false. To redirect or
/// retry the resource load optionally modify and return true.
/// Modification of the request URL will be treated as a redirect.
/// Requests handled using the default network loader cannot be redirected in this callback.
///
bool OnResourceResponse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response);
///
/// Called on the CEF IO thread to optionally filter resource response content.
///
/// The ChromiumWebBrowser control
/// the browser object - may be null if originating from ServiceWorker or CefURLRequest
/// the frame object - may be null if originating from ServiceWorker or CefURLRequest
/// the request object - cannot be modified in this callback
/// the response object - cannot be modified in this callback
/// Return an IResponseFilter to intercept this response, otherwise return null
IResponseFilter GetResourceResponseFilter(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response);
///
/// Called on the CEF IO thread when a resource load has completed.
/// This method will be called for all requests, including requests that are
/// aborted due to CEF shutdown or destruction of the associated browser. In
/// cases where the associated browser is destroyed this callback may arrive
/// after the callback for that browser. The
/// method can be used to test for this situation, and care
/// should be taken not to call or methods that modify state
/// (like LoadURL, SendProcessMessage, etc.) if the frame is invalid.
///
/// The ChromiumWebBrowser control
/// the browser object - may be null if originating from ServiceWorker or CefURLRequest
/// the frame object - may be null if originating from ServiceWorker or CefURLRequest
/// the request object - cannot be modified in this callback
/// the response object - cannot be modified in this callback
/// indicates the load completion status
/// is the number of response bytes actually read.
void OnResourceLoadComplete(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength);
///
/// Called on the CEF UI thread to handle requests for URLs with an unknown protocol component.
/// SECURITY WARNING: YOU SHOULD USE THIS METHOD TO ENFORCE RESTRICTIONS BASED ON SCHEME, HOST OR OTHER URL ANALYSIS BEFORE ALLOWING OS EXECUTION.
///
/// The ChromiumWebBrowser control
/// the browser object - may be null if originating from ServiceWorker or CefURLRequest
/// the frame object - may be null if originating from ServiceWorker or CefURLRequest
/// the request object - cannot be modified in this callback
/// return to true to attempt execution via the registered OS protocol handler, if any. Otherwise return false.
bool OnProtocolExecution(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request);
}
}