// Copyright © 2015 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.Collections.Generic;
using System.Threading.Tasks;
namespace CefSharp
{
///
/// A request context provides request handling for a set of related browser or URL request objects.
/// A request context can be specified when creating a new browser by setting the
/// property (Passing in via the constructor for the OffScreen
/// control is preferred).
/// Browser objects with different request contexts will never be hosted in the same render process.
/// Browser objects with the same request context may or may not be hosted in the same render process
/// depending on the process model.Browser objects created indirectly via the JavaScript window.open
/// function or targeted links will share the same render process and the same request context as
/// the source browser.
///
public interface IRequestContext : IDisposable
{
///
/// Gets a value indicating whether the RequestContext has been disposed of.
///
bool IsDisposed { get; }
///
/// Returns true if this object is pointing to the same context object.
///
/// context to compare
/// Returns true if the same
bool IsSame(IRequestContext context);
///
/// Returns true if this object is sharing the same storage as the specified context.
///
/// context to compare
/// Returns true if same storage
bool IsSharingWith(IRequestContext context);
///
/// Returns true if this object is the global context. The global context is
/// used by default when creating a browser or URL request with a NULL context
/// argument.
///
bool IsGlobal { get; }
///
/// Returns the default cookie manager for this object. This will be the global
/// cookie manager if this object is the global request context.
///
/// If callback is non-NULL it will be executed asynchronously on the CEF IO thread
/// after the manager's storage has been initialized.
/// Returns the default cookie manager for this object
ICookieManager GetCookieManager(ICompletionCallback callback);
///
/// Register a scheme handler factory for the specified schemeName and optional domainName.
/// An empty domainName value for a standard scheme will cause the factory to match all domain
/// names. The domainName value will be ignored for non-standard schemes. If schemeName is
/// a built-in scheme and no handler is returned by factory then the built-in scheme handler
/// factory will be called. If schemeName is a custom scheme then you must also implement the
/// CefApp::OnRegisterCustomSchemes() method in all processes. This function may be called multiple
/// times to change or remove the factory that matches the specified schemeName and optional
/// domainName.
///
/// Scheme Name
/// Optional domain name
/// Scheme handler factory
/// Returns false if an error occurs.
bool RegisterSchemeHandlerFactory(string schemeName, string domainName, ISchemeHandlerFactory factory);
///
/// Clear all registered scheme handler factories.
///
/// Returns false on error.
bool ClearSchemeHandlerFactories();
///
/// Returns the cache path for this object. If empty an "incognito mode"
/// in-memory cache is being used.
///
string CachePath { get; }
///
/// Returns true if a preference with the specified name exists. This method
/// must be called on the CEF UI thread.
///
/// name of preference
/// bool if the preference exists
/// Use Cef.UIThreadTaskFactory to execute this method if required,
/// and ChromiumWebBrowser.IsBrowserInitializedChanged are both
/// executed on the CEF UI thread, so can be called directly.
/// When CefSettings.MultiThreadedMessageLoop == false (the default is true) then the main
/// application thread will be the CEF UI thread.
bool HasPreference(string name);
///
/// Returns the value for the preference with the specified name. Returns
/// NULL if the preference does not exist. The returned object contains a copy
/// of the underlying preference value and modifications to the returned object
/// will not modify the underlying preference value. This method must be called
/// on the CEF UI thread.
///
/// preference name
/// Returns the value for the preference with the specified name
/// Use Cef.UIThreadTaskFactory to execute this method if required,
/// and ChromiumWebBrowser.IsBrowserInitializedChanged are both
/// executed on the CEF UI thread, so can be called directly.
/// When CefSettings.MultiThreadedMessageLoop == false (the default is true) then the main
/// application thread will be the CEF UI thread.
object GetPreference(string name);
///
/// Returns all preferences as a dictionary. The returned
/// object contains a copy of the underlying preference values and
/// modifications to the returned object will not modify the underlying
/// preference values. This method must be called on the browser process UI
/// thread.
///
/// If true then
/// preferences currently at their default value will be included.
/// Preferences (dictionary can have sub dictionaries)
IDictionary GetAllPreferences(bool includeDefaults);
///
/// Returns true if the preference with the specified name can be modified
/// using SetPreference. As one example preferences set via the command-line
/// usually cannot be modified. This method must be called on the CEF UI thread.
///
/// preference key
/// Returns true if the preference with the specified name can be modified
/// using SetPreference
/// Use Cef.UIThreadTaskFactory to execute this method if required,
/// and ChromiumWebBrowser.IsBrowserInitializedChanged are both
/// executed on the CEF UI thread, so can be called directly.
/// When CefSettings.MultiThreadedMessageLoop == false (the default is true) then the main
/// application thread will be the CEF UI thread.
bool CanSetPreference(string name);
///
/// Set the value associated with preference name. If value is null the
/// preference will be restored to its default value. If setting the preference
/// fails then error will be populated with a detailed description of the
/// problem. This method must be called on the CEF UI thread.
/// Preferences set via the command-line usually cannot be modified.
///
/// preference key
/// preference value
/// out error
/// Returns true if the value is set successfully and false otherwise.
/// Use Cef.UIThreadTaskFactory to execute this method if required,
/// and ChromiumWebBrowser.IsBrowserInitializedChanged are both
/// executed on the CEF UI thread, so can be called directly.
/// When CefSettings.MultiThreadedMessageLoop == false (the default is true) then the main
/// application thread will be the CEF UI thread.
bool SetPreference(string name, object value, out string error);
///
/// Clears all certificate exceptions that were added as part of handling
/// . If you call this it is
/// recommended that you also call or you risk not
/// being prompted again for server certificates if you reconnect quickly.
///
/// If is non-NULL it will be executed on the CEF UI thread after
/// completion. This param is optional
void ClearCertificateExceptions(ICompletionCallback callback);
///
/// Clears all HTTP authentication credentials that were added as part of handling
/// .
///
/// If is non-NULL it will be executed on the CEF UI thread after
/// completion. This param is optional
void ClearHttpAuthCredentials(ICompletionCallback callback = null);
///
/// Clears all active and idle connections that Chromium currently has.
/// This is only recommended if you have released all other CEF objects but
/// don't yet want to call Cef.Shutdown().
///
/// If is non-NULL it will be executed on the CEF UI thread after
/// completion. This param is optional
void CloseAllConnections(ICompletionCallback callback);
///
/// Attempts to resolve origin to a list of associated IP addresses.
///
/// host name to resolve
/// A task that represents the Resoolve Host operation. The value of the TResult parameter contains ResolveCallbackResult.
Task ResolveHostAsync(Uri origin);
///
/// Used internally to get the underlying instance.
/// Unlikely you'll use this yourself.
///
/// the inner most instance
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
IRequestContext UnWrap();
}
}