Skip to content

Commit

Permalink
added evaluatescriptasync message handlers and rerouted evalscript to…
Browse files Browse the repository at this point in the history
… cef ipc
  • Loading branch information
arsher committed Jun 27, 2015
1 parent 7588259 commit cc8a07c
Show file tree
Hide file tree
Showing 17 changed files with 423 additions and 17 deletions.
7 changes: 6 additions & 1 deletion CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,11 @@ 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;

_browserWrappers->TryGetValue(browserId, wrapper);
Expand All @@ -81,7 +86,7 @@ namespace CefSharp
}

return wrapper;
};
}

bool CefAppUnmanagedWrapper::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefProcessId source_process, CefRefPtr<CefProcessMessage> message)
{
Expand Down
8 changes: 8 additions & 0 deletions CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "include/cef_base.h"

#include "CefBrowserWrapper.h"
#include "Messaging/EvaluateScriptDelegate.h"
#include "../CefSharp.Core/Internals/Messaging/ProcessMessageDelegate.h"

using namespace System::Collections::Generic;
Expand All @@ -22,11 +23,15 @@ namespace CefSharp
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:

Expand All @@ -35,6 +40,9 @@ namespace CefSharp
_onBrowserCreated = onBrowserCreated;
_onBrowserDestroyed = onBrowserDestoryed;
_browserWrappers = gcnew Dictionary<int, CefBrowserWrapper^>();

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

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

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

JavascriptCallbackRegistry^ CefBrowserWrapper::CallbackRegistry::get()
{
return _callbackRegistry;
}

CefBrowserWrapper::!CefBrowserWrapper()
{
_cefBrowser = nullptr;
Expand Down
9 changes: 9 additions & 0 deletions CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,15 @@ namespace CefSharp
JavascriptCallbackRegistry^ _callbackRegistry;
JavascriptRootObjectWrapper^ _javascriptRootObjectWrapper;

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

property JavascriptCallbackRegistry^ CallbackRegistry
{
CefSharp::Internals::JavascriptCallbackRegistry^ get();
}

public:
CefBrowserWrapper(CefRefPtr<CefBrowser> cefBrowser);
!CefBrowserWrapper();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@
<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 @@ -182,6 +183,7 @@
<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,6 +74,9 @@
<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 @@ -124,6 +127,9 @@
<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: 112 additions & 0 deletions CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
// Copyright © 2010-2015 The CefSharp Project. All rights reserved.
//
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.

#include "stdafx.h"
#include "../CefSharp.Core/Internals/Messaging/Messages.h"
#include "../CefSharp.Core/Internals/Serialization/Primitives.h"

#include "Serialization/V8Serialization.h"
#include "../CefAppUnmanagedWrapper.h"
#include "EvaluateScriptDelegate.h"

namespace CefSharp
{
namespace Internals
{
using namespace Serialization;

namespace Messaging
{
EvaluateScriptDelegate::EvaluateScriptDelegate(CefRefPtr<CefAppUnmanagedWrapper> appUnmanagedWrapper)
:_appUnmanagedWrapper(appUnmanagedWrapper)
{

}

bool EvaluateScriptDelegate::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefProcessId source_process, CefRefPtr<CefProcessMessage> message)
{
auto handled = false;
auto name = message->GetName();
if (name == kEvaluateJavascript)
{
auto argList = message->GetArgumentList();
auto browserId = argList->GetInt(0);
auto frameId = argList->GetInt(1);
auto callbackId = GetInt64(argList, 2);
auto script = argList->GetString(3);

auto response = EvaluateScript(browserId, frameId, callbackId, script);
if (response.get())
{
browser->SendProcessMessage(source_process, response);
}

handled = true;
}

return handled;
}

CefRefPtr<CefProcessMessage> EvaluateScriptDelegate::EvaluateScript(int browserId, int frameId, int64 callbackId, CefString script)
{
CefRefPtr<CefProcessMessage> result;
auto browserWrapper = _appUnmanagedWrapper->FindBrowserWrapper(browserId, true);
auto browser = browserWrapper->GetWrapped();
auto frame = browser->GetFrame(frameId);
if (browser.get() && frame.get())
{
result = EvaluateScriptInFrame(frame, callbackId, script, browserWrapper->CallbackRegistry);
}
else
{
//TODO handle error
}
return result;
}

CefRefPtr<CefProcessMessage> EvaluateScriptDelegate::EvaluateScriptInFrame(CefRefPtr<CefFrame> frame, int64 callbackId, CefString script, JavascriptCallbackRegistry^ callbackRegistry)
{
CefRefPtr<CefProcessMessage> result;
auto context = frame->GetV8Context();

if (context.get() && context->Enter())
{
try
{
result = EvaluateScriptInContext(context, callbackId, script, callbackRegistry);
}
finally
{
context->Exit();
}
}

return result;
}

CefRefPtr<CefProcessMessage> EvaluateScriptDelegate::EvaluateScriptInContext(CefRefPtr<CefV8Context> context, int64 callbackId, CefString script, JavascriptCallbackRegistry^ callbackRegistry)
{
CefRefPtr<CefV8Value> result;
CefRefPtr<CefV8Exception> exception;
auto success = context->Eval(script, result, exception);
auto response = CefProcessMessage::Create(kEvaluateJavascriptDone);
auto argList = response->GetArgumentList();

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

return response;
}

}
}
}
34 changes: 34 additions & 0 deletions CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Copyright © 2010-2015 The CefSharp Project. 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 "../CefSharp.Core/Internals/Messaging/ProcessMessageDelegate.h"

namespace CefSharp
{
class CefAppUnmanagedWrapper;

namespace Internals
{
namespace Messaging
{
//This class handles incoming evaluate script messages and responses to them after fulfillment.
class EvaluateScriptDelegate : public ProcessMessageDelegate
{
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(EvaluateScriptDelegate);

CefRefPtr<CefAppUnmanagedWrapper> _appUnmanagedWrapper;

CefRefPtr<CefProcessMessage> EvaluateScript(int browserId, int frameId, int64 callbackId, CefString script);
CefRefPtr<CefProcessMessage> EvaluateScriptInFrame(CefRefPtr<CefFrame> frame, int64 callbackId, CefString script, JavascriptCallbackRegistry^ callbackRegistry);
CefRefPtr<CefProcessMessage> EvaluateScriptInContext(CefRefPtr<CefV8Context> context, int64 callbackId, CefString script, JavascriptCallbackRegistry^ callbackRegistry);
public:
EvaluateScriptDelegate(CefRefPtr<CefAppUnmanagedWrapper> appUnmanagedWrapper);
virtual bool OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefProcessId source_process, CefRefPtr<CefProcessMessage> message) override;
};
}
}
}
2 changes: 2 additions & 0 deletions CefSharp.Core/CefSharp.Core.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,7 @@
</ItemGroup>
<ItemGroup>
<ClCompile Include="AssemblyInfo.cpp" />
<ClCompile Include="Internals\Messaging\EvaluateScriptDoneDelegate.cpp" />
<ClCompile Include="Internals\CefBrowserHostWrapper.cpp" />
<ClCompile Include="Internals\CefContextMenuParamsWrapper.cpp" />
<ClCompile Include="Internals\CefFrameWrapper.cpp" />
Expand All @@ -245,6 +246,7 @@
<ItemGroup>
<ClInclude Include="BrowserSettings.h" />
<ClInclude Include="Cef.h" />
<ClInclude Include="Internals\Messaging\EvaluateScriptDoneDelegate.h" />
<ClInclude Include="Internals\AutoLock.h" />
<ClInclude Include="Internals\CefAuthCallbackWrapper.h" />
<ClInclude Include="Internals\CefBeforeDownloadCallbackWrapper.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 @@ -65,6 +65,9 @@
<ClCompile Include="Internals\Serialization\Primitives.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Internals\Messaging\EvaluateScriptDoneDelegate.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="vcclr_local.h">
Expand Down Expand Up @@ -199,6 +202,9 @@
<ClInclude Include="Internals\Messaging\Messages.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Internals\Messaging\EvaluateScriptDoneDelegate.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClInclude Include="Internals\CefSharpBrowserWrapper.h">
Expand Down
10 changes: 10 additions & 0 deletions CefSharp.Core/Internals/ClientAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -812,6 +812,16 @@ namespace CefSharp
return handled;
}

Task<JavascriptResponse^>^ ClientAdapter::EvaluateScriptAsync(int browserId, int frameId, String^ script, Nullable<TimeSpan> timeout)
{
Task<JavascriptResponse^>^ result = nullptr;
if (_cefBrowser.get())
{
result = _evalScriptDoneDelegate->EvaluateScriptAsync(_cefBrowser, browserId, frameId, script, timeout);
}
return result;
}

void ClientAdapter::AddProcessMessageDelegate(CefRefPtr<Internals::Messaging::ProcessMessageDelegate> processMessageDelegate)
{
_processMessageDelegates.insert(processMessageDelegate);
Expand Down
15 changes: 14 additions & 1 deletion CefSharp.Core/Internals/ClientAdapter.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "include/cef_render_process_handler.h"
#include "include/internal/cef_types.h"
#include "Internals/Messaging/ProcessMessageDelegate.h"
#include "Internals/Messaging/EvaluateScriptDoneDelegate.h"

using namespace System;

Expand Down Expand Up @@ -38,10 +39,16 @@ namespace CefSharp
gcroot<IWebBrowserInternal^> _browserControl;
HWND _browserHwnd;
CefRefPtr<CefBrowser> _cefBrowser;
//eval script handler
CefRefPtr<EvaluateScriptDoneDelegate> _evalScriptDoneDelegate;

ProcessMessageDelegateSet _processMessageDelegates;
gcroot<Dictionary<int, IBrowser^>^> _popupBrowsers;
gcroot<String^> _tooltip;
gcroot<IBrowserAdapter^> _browserAdapter;
//contains in-progress eval script tasks
gcroot<PendingTaskRepository<JavascriptResponse^>^> _pendingTaskRepository;


void ThrowUnknownPopupBrowser(String^ context)
{
Expand All @@ -54,8 +61,12 @@ namespace CefSharp
ClientAdapter(IWebBrowserInternal^ browserControl, IBrowserAdapter^ browserAdapter) :
_browserControl(browserControl),
_popupBrowsers(gcnew Dictionary<int, IBrowser^>()),
_pendingTaskRepository(gcnew PendingTaskRepository<JavascriptResponse^>()),
_browserAdapter(browserAdapter)
{
//create eval script message handler
_evalScriptDoneDelegate = new EvaluateScriptDoneDelegate(_pendingTaskRepository);
AddProcessMessageDelegate(_evalScriptDoneDelegate);
}

~ClientAdapter()
Expand Down Expand Up @@ -164,8 +175,10 @@ namespace CefSharp
virtual void OnDownloadUpdated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefDownloadItem> download_item,
CefRefPtr<CefDownloadItemCallback> callback) OVERRIDE;

void AddProcessMessageDelegate(CefRefPtr<Internals::Messaging::ProcessMessageDelegate> processMessageDelegate);
//sends out an eval script request to the render process
Task<JavascriptResponse^>^ EvaluateScriptAsync(int browserId, int frameId, String^ script, Nullable<TimeSpan> timeout);

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

IMPLEMENT_REFCOUNTING(ClientAdapter);
};
Expand Down
Loading

0 comments on commit cc8a07c

Please sign in to comment.