// 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. #ifndef CEFSHARP_CORE_REQUESTCONTEXT_H_ #define CEFSHARP_CORE_REQUESTCONTEXT_H_ #pragma once #include "Stdafx.h" #include "include\cef_request_context.h" #include "RequestContextSettings.h" #include "Internals\CefRequestContextHandlerAdapter.h" #include "Internals\CefWrapper.h" using namespace System::Runtime::InteropServices; using namespace System::Threading::Tasks; namespace CefSharp { namespace Core { /// /// A request context provides request handling for a set of related browser objects. /// A request context is specified when creating a new browser object via the CefBrowserHost /// static factory methods. 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. /// When running in single-process mode there is only a single render process (the main process) /// and so all browsers created in single-process mode will share the same request context. /// This will be the first request context passed into a CefBrowserHost static factory method /// and all other request context objects will be ignored. /// [System::ComponentModel::EditorBrowsableAttribute(System::ComponentModel::EditorBrowsableState::Never)] public ref class RequestContext : public IRequestContext, public CefWrapper { private: MCefRefPtr _requestContext; RequestContextSettings^ _settings; internal: RequestContext(CefRefPtr& context) { _requestContext = context.get(); _settings = nullptr; } operator CefRefPtr() { if (this == nullptr) { return nullptr; } return _requestContext.get(); } public: RequestContext() { CefRequestContextSettings settings; _requestContext = CefRequestContext::CreateContext(settings, nullptr).get(); } RequestContext(RequestContextSettings^ settings) : _settings(settings) { PathCheck::AssertAbsolute(settings->CachePath, "RequestContextSettings.CachePath"); _requestContext = CefRequestContext::CreateContext(settings, nullptr).get(); } RequestContext(IRequestContextHandler^ requestContextHandler) { CefRequestContextSettings settings; _requestContext = CefRequestContext::CreateContext(settings, new CefRequestContextHandlerAdapter(requestContextHandler)).get(); } RequestContext(RequestContextSettings^ settings, IRequestContextHandler^ requestContextHandler) : _settings(settings) { PathCheck::AssertAbsolute(settings->CachePath, "RequestContextSettings.CachePath"); _requestContext = CefRequestContext::CreateContext(settings, new CefRequestContextHandlerAdapter(requestContextHandler)).get(); } ///Creates a new context object that shares storage with | other | and uses an optional | handler | . RequestContext(IRequestContext^ otherRequestContext) { _requestContext = CefRequestContext::CreateContext((RequestContext^)otherRequestContext->UnWrap(), nullptr).get(); } RequestContext(IRequestContext^ otherRequestContext, IRequestContextHandler^ requestContextHandler) { _requestContext = CefRequestContext::CreateContext((RequestContext^)otherRequestContext->UnWrap(), new CefRequestContextHandlerAdapter(requestContextHandler)).get(); } !RequestContext() { _requestContext = nullptr; } ~RequestContext() { this->!RequestContext(); delete _settings; _disposed = true; } /// /// Creates a new context object that shares storage with other and uses an /// optional handler. /// /// shares storage with this RequestContext /// optional requestContext handler /// Returns a new RequestContext static IRequestContext^ CreateContext(IRequestContext^ other, IRequestContextHandler^ requestContextHandler) { auto otherRequestContext = static_cast(other->UnWrap()); CefRefPtr handler = requestContextHandler == nullptr ? nullptr : new CefRequestContextHandlerAdapter(requestContextHandler); auto newContext = CefRequestContext::CreateContext(otherRequestContext, handler); return gcnew RequestContext(newContext); } /// /// Returns true if this object is pointing to the same context object. /// /// context to compare /// Returns true if the same virtual 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 virtual bool IsSharingWith(IRequestContext^ context); /// /// 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 asnychronously on the CEF IO thread /// after the manager's storage has been initialized. /// Returns the default cookie manager for this object virtual ICookieManager^ GetCookieManager(ICompletionCallback^ callback); /// /// 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. /// virtual property bool IsGlobal { bool get() { ThrowIfDisposed(); return _requestContext->IsGlobal(); } } /// /// 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 /// IApp.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. virtual bool RegisterSchemeHandlerFactory(String^ schemeName, String^ domainName, ISchemeHandlerFactory^ factory); /// /// Clear all registered scheme handler factories. /// /// Returns false on error. virtual bool ClearSchemeHandlerFactories(); /// /// Returns the cache path for this object. If empty an "incognito mode" /// in-memory cache is being used. /// virtual property String^ CachePath { String^ get() { ThrowIfDisposed(); return StringUtils::ToClr(_requestContext->GetCachePath()); } } /// /// 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. virtual 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. virtual 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) virtual 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. virtual 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. virtual 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 virtual 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 virtual void ClearHttpAuthCredentials(ICompletionCallback^ callback); /// /// 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 virtual 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. virtual Task^ ResolveHostAsync(Uri^ origin); /// /// Gets the inner most instance /// /// current instance virtual IRequestContext^ UnWrap(); }; } } #endif // CEFSHARP_CORE_REQUESTCONTEXT_H_