// Copyright © 2013 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_MANAGEDCEFBROWSERADAPTER_H_ #define CEFSHARP_CORE_MANAGEDCEFBROWSERADAPTER_H_ #pragma once #include "Stdafx.h" #include "include\cef_client.h" #include "BrowserSettings.h" #include "RequestContext.h" #include "Internals/ClientAdapter.h" #include "Internals/RenderClientAdapter.h" #include "Internals/JavascriptCallbackFactory.h" using namespace System::Diagnostics; #ifndef NETCOREAPP using namespace System::ServiceModel; using namespace CefSharp::Internals::Wcf; #endif using namespace System::Threading; using namespace System::Threading::Tasks; namespace CefSharp { namespace Core { /// [System::ComponentModel::EditorBrowsableAttribute(System::ComponentModel::EditorBrowsableState::Never)] public ref class ManagedCefBrowserAdapter : public IBrowserAdapter { MCefRefPtr _clientAdapter; #ifndef NETCOREAPP BrowserProcessServiceHost^ _browserProcessServiceHost; #endif IWebBrowserInternal^ _webBrowserInternal; IJavascriptObjectRepositoryInternal^ _javaScriptObjectRepository; JavascriptCallbackFactory^ _javascriptCallbackFactory; IMethodRunnerQueue^ _methodRunnerQueue; IBrowser^ _browserWrapper; bool _isDisposed; private: void MethodInvocationComplete(Object^ sender, MethodInvocationCompleteArgs^ e); #ifndef NETCOREAPP void InitializeBrowserProcessServiceHost(IBrowser^ browser); void DisposeBrowserProcessServiceHost(); #endif internal: MCefRefPtr GetClientAdapter(); public: ManagedCefBrowserAdapter(IWebBrowserInternal^ webBrowserInternal, bool offScreenRendering) : _isDisposed(false) { if (offScreenRendering) { _clientAdapter = new RenderClientAdapter(webBrowserInternal, this); } else { _clientAdapter = new ClientAdapter(webBrowserInternal, this); } _webBrowserInternal = webBrowserInternal; _javaScriptObjectRepository = gcnew CefSharp::Internals::JavascriptObjectRepository(); _javascriptCallbackFactory = gcnew CefSharp::Internals::JavascriptCallbackFactory(_clientAdapter->GetPendingTaskRepository()); if (CefSharpSettings::ConcurrentTaskExecution) { _methodRunnerQueue = gcnew CefSharp::Internals::ConcurrentMethodRunnerQueue(_javaScriptObjectRepository); } else { _methodRunnerQueue = gcnew CefSharp::Internals::MethodRunnerQueue(_javaScriptObjectRepository); } _methodRunnerQueue->MethodInvocationComplete += gcnew EventHandler(this, &ManagedCefBrowserAdapter::MethodInvocationComplete); } !ManagedCefBrowserAdapter() { _clientAdapter = nullptr; } ~ManagedCefBrowserAdapter() { _isDisposed = true; // Stop the method runner before releasing browser adapter and browser wrapper (#2529) if (_methodRunnerQueue != nullptr) { _methodRunnerQueue->MethodInvocationComplete -= gcnew EventHandler(this, &ManagedCefBrowserAdapter::MethodInvocationComplete); delete _methodRunnerQueue; _methodRunnerQueue = nullptr; } // Release the MCefRefPtr reference // before calling _browserWrapper->CloseBrowser(true) this->!ManagedCefBrowserAdapter(); if (_browserWrapper != nullptr) { _browserWrapper->CloseBrowser(true); delete _browserWrapper; _browserWrapper = nullptr; } #ifndef NETCOREAPP if (CefSharpSettings::WcfEnabled) { DisposeBrowserProcessServiceHost(); } #endif _webBrowserInternal = nullptr; delete _javaScriptObjectRepository; _javaScriptObjectRepository = nullptr; } virtual property bool IsDisposed { bool get(); } virtual void OnAfterBrowserCreated(IBrowser^ browser); virtual void CreateBrowser(IWindowInfo^ windowInfo, IBrowserSettings^ browserSettings, IRequestContext^ requestContext, String^ address); virtual void Resize(int width, int height); virtual IBrowser^ GetBrowser(int browserId); virtual property IJavascriptCallbackFactory^ JavascriptCallbackFactory { CefSharp::Internals::IJavascriptCallbackFactory^ get(); } virtual property IJavascriptObjectRepositoryInternal^ JavascriptObjectRepository { CefSharp::Internals::IJavascriptObjectRepositoryInternal^ get(); } virtual property IMethodRunnerQueue^ MethodRunnerQueue { CefSharp::Internals::IMethodRunnerQueue^ get(); } }; } } #endif // CEFSHARP_CORE_INTERNALS_CLIENTADAPTER_H_