Skip to content

Commit

Permalink
added process message handlers and code to call them on both sides
Browse files Browse the repository at this point in the history
  • Loading branch information
arsher committed Jun 27, 2015
1 parent bf33f0b commit 7588259
Show file tree
Hide file tree
Showing 8 changed files with 115 additions and 0 deletions.
17 changes: 17 additions & 0 deletions CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,21 @@ namespace CefSharp

return wrapper;
};

bool CefAppUnmanagedWrapper::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefProcessId source_process, CefRefPtr<CefProcessMessage> 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> processMessageDelegate)
{
_processMessageDelegates.insert(processMessageDelegate);
};
}
8 changes: 8 additions & 0 deletions CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<Action<CefBrowserWrapper^>^> _onBrowserCreated;
gcroot<Action<CefBrowserWrapper^>^> _onBrowserDestroyed;
gcroot<Dictionary<int, CefBrowserWrapper^>^> _browserWrappers;
Expand All @@ -44,6 +49,9 @@ namespace CefSharp
virtual DECL void OnBrowserDestroyed(CefRefPtr<CefBrowser> browser) OVERRIDE;
virtual DECL void OnContextCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context) OVERRIDE;
virtual DECL void OnContextReleased(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context) OVERRIDE;
virtual DECL bool OnProcessMessageReceived(CefRefPtr< CefBrowser > browser, CefProcessId source_process, CefRefPtr< CefProcessMessage > message) OVERRIDE;

void AddProcessMessageDelegate(CefRefPtr<ProcessMessageDelegate> processMessageDelegate);

IMPLEMENT_REFCOUNTING(CefAppUnmanagedWrapper);
};
Expand Down
2 changes: 2 additions & 0 deletions CefSharp.Core/CefSharp.Core.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,7 @@
<ClInclude Include="Internals\CefRequestWrapper.h" />
<ClInclude Include="Internals\CefJSDialogCallbackWrapper.h" />
<ClInclude Include="Internals\MCefRefPtr.h" />
<ClInclude Include="Internals\Messaging\Messages.h" />
<ClInclude Include="Internals\PluginVisitor.h" />
<ClInclude Include="Internals\RenderClientAdapter.h" />
<ClInclude Include="Internals\ReportUnhandledExceptions.h" />
Expand All @@ -279,6 +280,7 @@
<ClInclude Include="ManagedCefBrowserAdapter.h" />
<ClInclude Include="CefSettings.h" />
<ClInclude Include="Internals\Serialization\Primitives.h" />
<ClInclude Include="Internals\Messaging\ProcessMessageDelegate.h" />
<ClInclude Include="SchemeHandlerFactoryWrapper.h" />
<ClInclude Include="ResourceHandlerWrapper.h" />
<ClInclude Include="CookieAsyncWrapper.h" />
Expand Down
6 changes: 6 additions & 0 deletions CefSharp.Core/CefSharp.Core.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,12 @@
<ClInclude Include="Internals\Serialization\Primitives.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Internals\Messaging\ProcessMessageDelegate.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Internals\Messaging\Messages.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClInclude Include="Internals\CefSharpBrowserWrapper.h">
Expand Down
18 changes: 18 additions & 0 deletions CefSharp.Core/Internals/ClientAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -798,5 +798,23 @@ namespace CefSharp
handler->OnDownloadUpdated(browserWrapper, TypeConversion::FromNative(download_item), callbackWrapper);
}
}


bool ClientAdapter::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefProcessId source_process, CefRefPtr<CefProcessMessage> 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<Internals::Messaging::ProcessMessageDelegate> processMessageDelegate)
{
_processMessageDelegates.insert(processMessageDelegate);
}
}
}
9 changes: 9 additions & 0 deletions CefSharp.Core/Internals/ClientAdapter.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,16 @@
#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;

namespace CefSharp
{
namespace Internals
{
using namespace Messaging;

private class ClientAdapter : public CefClient,
public CefLifeSpanHandler,
public CefLoadHandler,
Expand All @@ -35,6 +38,7 @@ namespace CefSharp
gcroot<IWebBrowserInternal^> _browserControl;
HWND _browserHwnd;
CefRefPtr<CefBrowser> _cefBrowser;
ProcessMessageDelegateSet _processMessageDelegates;
gcroot<Dictionary<int, IBrowser^>^> _popupBrowsers;
gcroot<String^> _tooltip;
gcroot<IBrowserAdapter^> _browserAdapter;
Expand Down Expand Up @@ -82,6 +86,8 @@ namespace CefSharp
virtual DECL CefRefPtr<CefDialogHandler> GetDialogHandler() OVERRIDE { return this; }
virtual DECL CefRefPtr<CefDragHandler> GetDragHandler() OVERRIDE { return this; }
virtual DECL CefRefPtr<CefGeolocationHandler> GetGeolocationHandler() OVERRIDE { return this; }
virtual DECL bool OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefProcessId source_process, CefRefPtr<CefProcessMessage> message) OVERRIDE;


// CefLifeSpanHandler
virtual DECL bool OnBeforePopup(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame,
Expand Down Expand Up @@ -158,6 +164,9 @@ namespace CefSharp
virtual void OnDownloadUpdated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefDownloadItem> download_item,
CefRefPtr<CefDownloadItemCallback> callback) OVERRIDE;

void AddProcessMessageDelegate(CefRefPtr<Internals::Messaging::ProcessMessageDelegate> processMessageDelegate);


IMPLEMENT_REFCOUNTING(ClientAdapter);
};
}
Expand Down
23 changes: 23 additions & 0 deletions CefSharp.Core/Internals/Messaging/Messages.h
Original file line number Diff line number Diff line change
@@ -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";
}
}
}
32 changes: 32 additions & 0 deletions CefSharp.Core/Internals/Messaging/ProcessMessageDelegate.h
Original file line number Diff line number Diff line change
@@ -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 <set>

#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<CefBrowser> browser, CefProcessId source_process, CefRefPtr<CefProcessMessage> message) = 0;

IMPLEMENT_REFCOUNTING(ProcessMessageDelegate);
};

typedef std::set<CefRefPtr<ProcessMessageDelegate>> ProcessMessageDelegateSet;
}
}
}

0 comments on commit 7588259

Please sign in to comment.