// 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 { namespace BrowserSubprocess { // This class is the native subprocess level CEF object wrapper. private class CefAppUnmanagedWrapper : SubProcessApp, CefRenderProcessHandler { private: gcroot _handler; gcroot^> _onBrowserCreated; gcroot^> _onBrowserDestroyed; gcroot^> _browserWrappers; bool _focusedNodeChangedEnabled; bool _legacyBindingEnabled; bool _jsBindingApiEnabled = true; // The property names used to call bound objects CefString _jsBindingPropertyName; CefString _jsBindingPropertyNameCamelCase; // 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(); _focusedNodeChangedEnabled = enableFocusedNodeChanged; _javascriptObjects = gcnew Dictionary(); _registerBoundObjectRegistry = gcnew RegisterBoundObjectRegistry(); _legacyBindingEnabled = false; _jsBindingPropertyName = "CefSharp"; _jsBindingPropertyNameCamelCase = "cefSharp"; } ~CefAppUnmanagedWrapper() { if (!Object::ReferenceEquals(_browserWrappers, nullptr)) { for each (CefBrowserWrapper ^ browser in Enumerable::OfType(_browserWrappers)) { delete browser; } _browserWrappers = nullptr; } delete _onBrowserCreated; delete _onBrowserDestroyed; } CefBrowserWrapper^ FindBrowserWrapper(int browserId); JavascriptRootObjectWrapper^ GetJsRootObjectWrapper(int browserId, CefString& 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 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_REFCOUNTINGM(CefAppUnmanagedWrapper); }; } }