Skip to content

Commit

Permalink
Merge pull request #2 from amaitland/feature/ipc
Browse files Browse the repository at this point in the history
IPC Changes
  • Loading branch information
arsher committed Jun 29, 2015
2 parents 93a61c1 + 81a2202 commit dc5bfdf
Show file tree
Hide file tree
Showing 37 changed files with 223 additions and 577 deletions.
86 changes: 67 additions & 19 deletions CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,15 @@
#include "CefBrowserWrapper.h"
#include "CefAppUnmanagedWrapper.h"
#include "JavascriptRootObjectWrapper.h"
#include "Serialization\V8Serialization.h"
#include "..\CefSharp.Core\Internals\Messaging\Messages.h"
#include "..\CefSharp.Core\Internals\Serialization\Primitives.h"

using namespace System;
using namespace System::Diagnostics;
using namespace System::Collections::Generic;
using namespace CefSharp::Internals::Messaging;
using namespace CefSharp::Internals::Serialization;

namespace CefSharp
{
Expand All @@ -32,7 +37,7 @@ namespace CefSharp

void CefAppUnmanagedWrapper::OnBrowserDestroyed(CefRefPtr<CefBrowser> browser)
{
auto wrapper = FindBrowserWrapper(browser, false);
auto wrapper = FindBrowserWrapper(browser->GetIdentifier(), false);

if (wrapper != nullptr)
{
Expand All @@ -44,7 +49,7 @@ namespace CefSharp

void CefAppUnmanagedWrapper::OnContextCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context)
{
auto wrapper = FindBrowserWrapper(browser, true);
auto wrapper = FindBrowserWrapper(browser->GetIdentifier(), true);

if (wrapper->JavascriptRootObject != nullptr)
{
Expand All @@ -59,7 +64,7 @@ namespace CefSharp

void CefAppUnmanagedWrapper::OnContextReleased(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context)
{
auto wrapper = FindBrowserWrapper(browser, true);
auto wrapper = FindBrowserWrapper(browser->GetIdentifier(), true);

if (wrapper->JavascriptRootObjectWrapper != nullptr)
{
Expand All @@ -68,12 +73,6 @@ namespace CefSharp
}
};

CefBrowserWrapper^ CefAppUnmanagedWrapper::FindBrowserWrapper(CefRefPtr<CefBrowser> browser, bool mustExist)
{
auto browserId = browser->GetIdentifier();
return FindBrowserWrapper(browserId, mustExist);
};

CefBrowserWrapper^ CefAppUnmanagedWrapper::FindBrowserWrapper(int browserId, bool mustExist)
{
CefBrowserWrapper^ wrapper = nullptr;
Expand All @@ -88,20 +87,69 @@ namespace CefSharp
return wrapper;
}

bool CefAppUnmanagedWrapper::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefProcessId source_process, CefRefPtr<CefProcessMessage> message)
bool CefAppUnmanagedWrapper::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefProcessId sourceProcessId, CefRefPtr<CefProcessMessage> message)
{
bool handled = false;

for (ProcessMessageDelegateSet::iterator it = _processMessageDelegates.begin(); it != _processMessageDelegates.end() && !handled; it++)
auto handled = false;
auto name = message->GetName();
if (name == kEvaluateJavascriptRequest)
{
handled = (*it)->OnProcessMessageReceived(browser, source_process, message);
auto argList = message->GetArgumentList();
auto browserId = argList->GetInt(0);
auto frameId = GetInt64(argList, 1);
auto callbackId = GetInt64(argList, 2);
auto script = argList->GetString(3);

if(browser->GetIdentifier() != browserId)
{
throw gcnew InvalidOperationException(String::Format("Request BrowserId : {0} does not match browser Id : {1}", browserId, browser->GetIdentifier()));
}

auto browserWrapper = FindBrowserWrapper(browserId, true);
auto frame = browser->GetFrame(frameId);
if (frame.get())
{
auto context = frame->GetV8Context();

if (context.get() && context->Enter())
{
try
{
CefRefPtr<CefV8Value> result;
CefRefPtr<CefV8Exception> exception;
auto success = context->Eval(script, result, exception);
auto response = CefProcessMessage::Create(kEvaluateJavascriptResponse);
auto argList = response->GetArgumentList();

argList->SetBool(0, success);
SetInt64(callbackId, argList, 1);
if (success)
{
SerializeV8Object(result, argList, 2, browserWrapper->CallbackRegistry);
}
else
{
argList->SetString(2, exception->GetMessage());
}

if (response.get())
{
browser->SendProcessMessage(sourceProcessId, response);
}
}
finally
{
context->Exit();
}
}
}
else
{
//TODO handle error
}

handled = true;
}

return handled;
};

void CefAppUnmanagedWrapper::AddProcessMessageDelegate(CefRefPtr<ProcessMessageDelegate> processMessageDelegate)
{
_processMessageDelegates.insert(processMessageDelegate);
};
}
19 changes: 3 additions & 16 deletions CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,39 +10,26 @@
#include "include/cef_base.h"

#include "CefBrowserWrapper.h"
#include "Messaging/EvaluateScriptDelegate.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:
friend EvaluateScriptDelegate;

ProcessMessageDelegateSet _processMessageDelegates;

gcroot<Action<CefBrowserWrapper^>^> _onBrowserCreated;
gcroot<Action<CefBrowserWrapper^>^> _onBrowserDestroyed;
gcroot<Dictionary<int, CefBrowserWrapper^>^> _browserWrappers;

CefBrowserWrapper^ FindBrowserWrapper(int browserId, bool mustExist);
CefBrowserWrapper^ FindBrowserWrapper(CefRefPtr<CefBrowser> browser, bool mustExist);
public:

CefAppUnmanagedWrapper(Action<CefBrowserWrapper^>^ onBrowserCreated, Action<CefBrowserWrapper^>^ onBrowserDestoryed)
{
_onBrowserCreated = onBrowserCreated;
_onBrowserDestroyed = onBrowserDestoryed;
_browserWrappers = gcnew Dictionary<int, CefBrowserWrapper^>();

//Register evaluate script request handler
AddProcessMessageDelegate(new EvaluateScriptDelegate(this));
}

~CefAppUnmanagedWrapper()
Expand All @@ -52,14 +39,14 @@ namespace CefSharp
delete _onBrowserDestroyed;
}

CefBrowserWrapper^ FindBrowserWrapper(int browserId, bool mustExist);

virtual DECL CefRefPtr<CefRenderProcessHandler> GetRenderProcessHandler() OVERRIDE;
virtual DECL void OnBrowserCreated(CefRefPtr<CefBrowser> browser) OVERRIDE;
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);
virtual DECL bool OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefProcessId sourceProcessId, CefRefPtr<CefProcessMessage> message) OVERRIDE;

IMPLEMENT_REFCOUNTING(CefAppUnmanagedWrapper);
};
Expand Down
5 changes: 0 additions & 5 deletions CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,6 @@ namespace CefSharp
_callbackRegistry->Deregister(id);
}

CefRefPtr<CefBrowser> CefBrowserWrapper::GetWrapped()
{
return _cefBrowser.get();
}

JavascriptCallbackRegistry^ CefBrowserWrapper::CallbackRegistry::get()
{
return _callbackRegistry;
Expand Down
3 changes: 0 additions & 3 deletions CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,6 @@ namespace CefSharp
JavascriptRootObjectWrapper^ _javascriptRootObjectWrapper;

internal:
//used by EvaluateScriptDelegate
CefRefPtr<CefBrowser> GetWrapped();

property JavascriptCallbackRegistry^ CallbackRegistry
{
CefSharp::Internals::JavascriptCallbackRegistry^ get();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,6 @@
<ClInclude Include="CefBrowserWrapper.h" />
<ClInclude Include="..\CefSharp.Core\Internals\CefTaskScheduler.h" />
<ClInclude Include="..\CefSharp.Core\Internals\CefTaskWrapper.h" />
<ClInclude Include="Messaging\EvaluateScriptDelegate.h" />
<ClInclude Include="JavascriptCallbackRegistry.h" />
<ClInclude Include="JavascriptCallbackWrapper.h" />
<ClInclude Include="JavascriptMethodWrapper.h" />
Expand All @@ -183,7 +182,6 @@
<ClCompile Include="CefAppUnmanagedWrapper.cpp" />
<ClCompile Include="CefAppWrapper.cpp" />
<ClCompile Include="CefBrowserWrapper.cpp" />
<ClCompile Include="Messaging\EvaluateScriptDelegate.cpp" />
<ClCompile Include="JavascriptCallbackRegistry.cpp" />
<ClCompile Include="JavascriptCallbackWrapper.cpp" />
<ClCompile Include="JavascriptMethodHandler.cpp" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,6 @@
<ClInclude Include="Serialization\V8Serialization.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Messaging\EvaluateScriptDelegate.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="AssemblyInfo.cpp">
Expand Down Expand Up @@ -127,9 +124,6 @@
<ClCompile Include="Serialization\V8Serialization.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Messaging\EvaluateScriptDelegate.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
Expand Down
112 changes: 0 additions & 112 deletions CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp

This file was deleted.

Loading

0 comments on commit dc5bfdf

Please sign in to comment.