// Copyright © 2014 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. #pragma once #include "Stdafx.h" #include "include/cef_base.h" #include "SubProcessApp.h" #include "CefBrowserWrapper.h" #include "RegisterBoundObjectRegistry.h" using namespace System::Collections::Generic; using namespace CefSharp::RenderProcess; namespace CefSharp { // This class is the native subprocess level CEF object wrapper. private class CefAppUnmanagedWrapper : SubProcessApp, CefRenderProcessHandler { private: gcroot _handler; gcroot^> _onBrowserCreated; gcroot^> _onBrowserDestroyed; gcroot^> _browserWrappers; gcroot^> _extensions; bool _focusedNodeChangedEnabled; bool _legacyBindingEnabled; // The serialized registered object data waiting to be used. gcroot^> _javascriptObjects; gcroot _registerBoundObjectRegistry; public: static const CefString kPromiseCreatorScript; CefAppUnmanagedWrapper(IRenderProcessHandler^ handler, List^ schemes, bool enableFocusedNodeChanged, Action^ onBrowserCreated, Action^ onBrowserDestroyed) : SubProcessApp(schemes) { _handler = handler; _onBrowserCreated = onBrowserCreated; _onBrowserDestroyed = onBrowserDestroyed; _browserWrappers = gcnew ConcurrentDictionary(); _extensions = gcnew List(); _focusedNodeChangedEnabled = enableFocusedNodeChanged; _javascriptObjects = gcnew Dictionary(); _registerBoundObjectRegistry = gcnew RegisterBoundObjectRegistry(); _legacyBindingEnabled = false; } ~CefAppUnmanagedWrapper() { if (!Object::ReferenceEquals(_browserWrappers, nullptr)) { for each(CefBrowserWrapper^ browser in Enumerable::OfType(_browserWrappers)) { delete browser; } _browserWrappers = nullptr; } delete _onBrowserCreated; delete _onBrowserDestroyed; delete _extensions; } CefBrowserWrapper^ FindBrowserWrapper(int browserId); JavascriptRootObjectWrapper^ GetJsRootObjectWrapper(int browserId, int64 frameId); virtual DECL CefRefPtr GetRenderProcessHandler() OVERRIDE; virtual DECL void OnBrowserCreated(CefRefPtr browser, CefRefPtr extraInfo) OVERRIDE; virtual DECL void OnBrowserDestroyed(CefRefPtr browser) OVERRIDE; virtual DECL void OnContextCreated(CefRefPtr browser, CefRefPtr frame, CefRefPtr context) OVERRIDE; virtual DECL void OnContextReleased(CefRefPtr browser, CefRefPtr frame, CefRefPtr context) OVERRIDE; virtual DECL bool OnProcessMessageReceived(CefRefPtr browser, CefRefPtr frame, CefProcessId sourceProcessId, CefRefPtr message) OVERRIDE; virtual DECL void OnRenderThreadCreated(CefRefPtr extraInfo) OVERRIDE; virtual DECL void OnWebKitInitialized() OVERRIDE; virtual DECL void OnFocusedNodeChanged(CefRefPtr browser, CefRefPtr frame, CefRefPtr node) OVERRIDE; virtual DECL void OnUncaughtException(CefRefPtr browser, CefRefPtr frame, CefRefPtr context, CefRefPtr exception, CefRefPtr stackTrace) OVERRIDE; IMPLEMENT_REFCOUNTING(CefAppUnmanagedWrapper); }; }