diff --git a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp index ac8deba8d4..cf88a23de9 100644 --- a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp +++ b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp @@ -82,4 +82,21 @@ namespace CefSharp return wrapper; }; + + bool CefAppUnmanagedWrapper::OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message) + { + bool handled = false; + + for (ProcessMessageDelegateSet::iterator it = _processMessageDelegates.begin(); it != _processMessageDelegates.end() && !handled; it++) + { + handled = (*it)->OnProcessMessageReceived(browser, source_process, message); + } + + return handled; + }; + + void CefAppUnmanagedWrapper::AddProcessMessageDelegate(CefRefPtr processMessageDelegate) + { + _processMessageDelegates.insert(processMessageDelegate); + }; } \ No newline at end of file diff --git a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h index 2d4c179e42..e83c91a840 100644 --- a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h +++ b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h @@ -10,15 +10,20 @@ #include "include/cef_base.h" #include "CefBrowserWrapper.h" +#include "../CefSharp.Core/Internals/Messaging/ProcessMessageDelegate.h" using namespace System::Collections::Generic; namespace CefSharp { + using namespace Internals::Messaging; + // This class is the native subprocess level CEF object wrapper. private class CefAppUnmanagedWrapper : CefApp, CefRenderProcessHandler { private: + ProcessMessageDelegateSet _processMessageDelegates; + gcroot^> _onBrowserCreated; gcroot^> _onBrowserDestroyed; gcroot^> _browserWrappers; @@ -44,6 +49,9 @@ namespace CefSharp 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< CefBrowser > browser, CefProcessId source_process, CefRefPtr< CefProcessMessage > message) OVERRIDE; + + void AddProcessMessageDelegate(CefRefPtr processMessageDelegate); IMPLEMENT_REFCOUNTING(CefAppUnmanagedWrapper); }; diff --git a/CefSharp.Core/CefSharp.Core.vcxproj b/CefSharp.Core/CefSharp.Core.vcxproj index 0471d257d9..03df538bb2 100644 --- a/CefSharp.Core/CefSharp.Core.vcxproj +++ b/CefSharp.Core/CefSharp.Core.vcxproj @@ -267,6 +267,7 @@ + @@ -279,6 +280,7 @@ + diff --git a/CefSharp.Core/CefSharp.Core.vcxproj.filters b/CefSharp.Core/CefSharp.Core.vcxproj.filters index 6c28533b63..ff4ad11d08 100644 --- a/CefSharp.Core/CefSharp.Core.vcxproj.filters +++ b/CefSharp.Core/CefSharp.Core.vcxproj.filters @@ -193,6 +193,12 @@ Header Files + + Header Files + + + Header Files + diff --git a/CefSharp.Core/Internals/ClientAdapter.cpp b/CefSharp.Core/Internals/ClientAdapter.cpp index c2b846b5dc..379c27a21e 100644 --- a/CefSharp.Core/Internals/ClientAdapter.cpp +++ b/CefSharp.Core/Internals/ClientAdapter.cpp @@ -798,5 +798,23 @@ namespace CefSharp handler->OnDownloadUpdated(browserWrapper, TypeConversion::FromNative(download_item), callbackWrapper); } } + + + bool ClientAdapter::OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message) + { + bool handled = false; + + for (ProcessMessageDelegateSet::iterator it = _processMessageDelegates.begin(); it != _processMessageDelegates.end() && !handled; it++) + { + handled = (*it)->OnProcessMessageReceived(browser, source_process, message); + } + + return handled; + } + + void ClientAdapter::AddProcessMessageDelegate(CefRefPtr processMessageDelegate) + { + _processMessageDelegates.insert(processMessageDelegate); + } } } diff --git a/CefSharp.Core/Internals/ClientAdapter.h b/CefSharp.Core/Internals/ClientAdapter.h index bda1488032..d9bbdd11ad 100644 --- a/CefSharp.Core/Internals/ClientAdapter.h +++ b/CefSharp.Core/Internals/ClientAdapter.h @@ -10,6 +10,7 @@ #include "include/cef_client.h" #include "include/cef_render_process_handler.h" #include "include/internal/cef_types.h" +#include "Internals/Messaging/ProcessMessageDelegate.h" using namespace System; @@ -17,6 +18,8 @@ namespace CefSharp { namespace Internals { + using namespace Messaging; + private class ClientAdapter : public CefClient, public CefLifeSpanHandler, public CefLoadHandler, @@ -35,6 +38,7 @@ namespace CefSharp gcroot _browserControl; HWND _browserHwnd; CefRefPtr _cefBrowser; + ProcessMessageDelegateSet _processMessageDelegates; gcroot^> _popupBrowsers; gcroot _tooltip; gcroot _browserAdapter; @@ -82,6 +86,8 @@ namespace CefSharp virtual DECL CefRefPtr GetDialogHandler() OVERRIDE { return this; } virtual DECL CefRefPtr GetDragHandler() OVERRIDE { return this; } virtual DECL CefRefPtr GetGeolocationHandler() OVERRIDE { return this; } + virtual DECL bool OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message) OVERRIDE; + // CefLifeSpanHandler virtual DECL bool OnBeforePopup(CefRefPtr browser, CefRefPtr frame, @@ -158,6 +164,9 @@ namespace CefSharp virtual void OnDownloadUpdated(CefRefPtr browser, CefRefPtr download_item, CefRefPtr callback) OVERRIDE; + void AddProcessMessageDelegate(CefRefPtr processMessageDelegate); + + IMPLEMENT_REFCOUNTING(ClientAdapter); }; } diff --git a/CefSharp.Core/Internals/Messaging/Messages.h b/CefSharp.Core/Internals/Messaging/Messages.h new file mode 100644 index 0000000000..05a5e80feb --- /dev/null +++ b/CefSharp.Core/Internals/Messaging/Messages.h @@ -0,0 +1,23 @@ +// Copyright © 2010-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. + +#pragma once + +#include "include/cef_base.h" + +namespace CefSharp +{ + namespace Internals + { + namespace Messaging + { + //contains process message names for all handled messages + + //Message containing a script to be evaluated + const CefString kEvaluateJavascript = "EvaluateJavascript"; + //Message containing the result for a given evaluation + const CefString kEvaluateJavascriptDone = "EvaluateJavascriptDone"; + } + } +} \ No newline at end of file diff --git a/CefSharp.Core/Internals/Messaging/ProcessMessageDelegate.h b/CefSharp.Core/Internals/Messaging/ProcessMessageDelegate.h new file mode 100644 index 0000000000..5e0fb347e4 --- /dev/null +++ b/CefSharp.Core/Internals/Messaging/ProcessMessageDelegate.h @@ -0,0 +1,32 @@ +// Copyright © 2010-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. + +#pragma once + +#include + +#include "include\cef_base.h" +#include "include\cef_app.h" + +namespace CefSharp +{ + namespace Internals + { + namespace Messaging + { + //Specific process message handler classes can inherit from this one + class ProcessMessageDelegate : public virtual CefBase + { + public: + //Will be called for uhandled received process messages. + //Returns false if message wasn't handled, true if it was + virtual bool OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message) = 0; + + IMPLEMENT_REFCOUNTING(ProcessMessageDelegate); + }; + + typedef std::set> ProcessMessageDelegateSet; + } + } +} \ No newline at end of file