From b9e3100994791b5a96934f0bc093e7e995fcbded Mon Sep 17 00:00:00 2001 From: amaitland Date: Mon, 29 Jun 2015 11:25:57 +1000 Subject: [PATCH 01/19] Simplify PendingTaskRepository TaskCompletionSource creation - use KeyValuePair --- .../Messaging/EvaluateScriptDoneDelegate.cpp | 10 ++-- CefSharp/Internals/PendingTaskRepository.cs | 48 +++++++------------ 2 files changed, 21 insertions(+), 37 deletions(-) diff --git a/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp b/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp index eb8f22fd3a..5de9163fba 100644 --- a/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp +++ b/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp @@ -24,21 +24,19 @@ namespace CefSharp Task^ EvaluateScriptDoneDelegate::EvaluateScriptAsync(CefRefPtr cefBrowser, int browserId, int frameId, String^ script, Nullable timeout) { - TaskCompletionSource^ completionSource = nullptr; - //create a new taskcompletionsource based on wether we do or do not have a timeout - auto callbackId = timeout.HasValue ? _pendingTasks->CreatePendingTaskWithTimeout(completionSource, timeout.Value) : - _pendingTasks->CreatePendingTask(completionSource); + //create a new taskcompletionsource + auto idAndComplectionSource = _pendingTasks->CreatePendingTask(timeout); auto message = CefProcessMessage::Create(kEvaluateJavascript); auto argList = message->GetArgumentList(); argList->SetInt(0, browserId); argList->SetInt(1, frameId); - SetInt64(callbackId, argList, 2); + SetInt64(idAndComplectionSource.Key, argList, 2); argList->SetString(3, StringUtils::ToNative(script)); cefBrowser->SendProcessMessage(CefProcessId::PID_RENDERER, message); - return completionSource->Task; + return idAndComplectionSource.Value->Task; } bool EvaluateScriptDoneDelegate::OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message) diff --git a/CefSharp/Internals/PendingTaskRepository.cs b/CefSharp/Internals/PendingTaskRepository.cs index a15be32330..5d07e7a6a9 100644 --- a/CefSharp/Internals/PendingTaskRepository.cs +++ b/CefSharp/Internals/PendingTaskRepository.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Concurrent; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -18,40 +19,32 @@ public sealed class PendingTaskRepository private readonly ConcurrentDictionary> pendingTasks = new ConcurrentDictionary>(); //should only be accessed by Interlocked.Increment - private long lastId = 0; - - /// - /// Creates a new pending task. - /// - /// The newly created - /// The unique id of the newly created pending task. - public long CreatePendingTask(out TaskCompletionSource completionSource) - { - completionSource = new TaskCompletionSource(); - return SaveCompletionSource(completionSource); - } + private long lastId; /// /// Creates a new pending task with a timeout. /// /// The maximum running time of the task. - /// The newly created - /// The unique id of the newly created pending task. - public long CreatePendingTaskWithTimeout(out TaskCompletionSource completionSource, TimeSpan timeout) + /// The unique id of the newly created pending task and the newly created . + public KeyValuePair> CreatePendingTask(TimeSpan? timeout = null) { var taskCompletionSource = new TaskCompletionSource(); - completionSource = taskCompletionSource; - var id = SaveCompletionSource(completionSource); - Timer timer = null; - timer = new Timer(state => + var id = Interlocked.Increment(ref lastId); + pendingTasks.TryAdd(id, taskCompletionSource); + + if (timeout.HasValue) { - timer.Dispose(); - RemovePendingTask(id); - taskCompletionSource.TrySetCanceled(); - }, null, timeout, TimeSpan.FromMilliseconds(-1)); + Timer timer = null; + timer = new Timer(state => + { + timer.Dispose(); + RemovePendingTask(id); + taskCompletionSource.TrySetCanceled(); + }, null, timeout.Value, TimeSpan.FromMilliseconds(-1)); + } - return id; + return new KeyValuePair>(id, taskCompletionSource); } /// @@ -67,12 +60,5 @@ public TaskCompletionSource RemovePendingTask(long id) pendingTasks.TryRemove(id, out result); return result; } - - private long SaveCompletionSource(TaskCompletionSource completionSource) - { - var id = Interlocked.Increment(ref lastId); - pendingTasks.TryAdd(id, completionSource); - return id; - } } } \ No newline at end of file From d188382d20989a812902ea0ac6613a6a5006bbd3 Mon Sep 17 00:00:00 2001 From: amaitland Date: Mon, 29 Jun 2015 11:34:43 +1000 Subject: [PATCH 02/19] Move PendingTaskRepository into matching namespace (resharper cleanup) - there is no messaging folder --- CefSharp/Internals/PendingTaskRepository.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CefSharp/Internals/PendingTaskRepository.cs b/CefSharp/Internals/PendingTaskRepository.cs index 5d07e7a6a9..97eb769e27 100644 --- a/CefSharp/Internals/PendingTaskRepository.cs +++ b/CefSharp/Internals/PendingTaskRepository.cs @@ -8,7 +8,7 @@ using System.Threading; using System.Threading.Tasks; -namespace CefSharp.Internals.Messaging +namespace CefSharp.Internals { /// /// Class to store TaskCompletionSources indexed by a unique id. From 6d28f97a1423e6b0493044711b3292c9b6372cc4 Mon Sep 17 00:00:00 2001 From: amaitland Date: Mon, 29 Jun 2015 11:36:29 +1000 Subject: [PATCH 03/19] Prefer using statements directly after inclues - they get a little lost if we put them further down --- .../Internals/Messaging/EvaluateScriptDoneDelegate.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp b/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp index 5de9163fba..67b47979d9 100644 --- a/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp +++ b/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp @@ -7,13 +7,13 @@ #include "../Serialization/Primitives.h" #include "../Serialization/V8Serialization.h" #include "EvaluateScriptDoneDelegate.h" + +using namespace CefSharp::Internals::Serialization; namespace CefSharp { namespace Internals { - using namespace Serialization; - namespace Messaging { EvaluateScriptDoneDelegate::EvaluateScriptDoneDelegate(PendingTaskRepository^ pendingTasks, Dictionary^ callbackFactories) From 03a893bdac1f2b16f51714d8fe15e2980d043ecc Mon Sep 17 00:00:00 2001 From: amaitland Date: Mon, 29 Jun 2015 11:42:25 +1000 Subject: [PATCH 04/19] Inline some of the EvaluateScriptDoneDelegate methods - as they're not used in multiple places it's easier to debug this way --- .../Messaging/EvaluateScriptDoneDelegate.cpp | 44 +++++++------------ .../Messaging/EvaluateScriptDoneDelegate.h | 3 -- 2 files changed, 17 insertions(+), 30 deletions(-) diff --git a/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp b/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp index 67b47979d9..3a051f428b 100644 --- a/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp +++ b/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp @@ -52,39 +52,29 @@ namespace CefSharp IJavascriptCallbackFactory^ callbackFactory; _callbackFactories->TryGetValue(browser->GetIdentifier(), callbackFactory); - FinishTask(callbackId, success, argList, callbackFactory); + auto pendingTask = _pendingTasks->RemovePendingTask(callbackId); + if (pendingTask != nullptr) + { + auto response = gcnew JavascriptResponse(); + response->Success = success; + + if (success) + { + response->Result = DeserializeV8Object(argList, 2, callbackFactory); + } + else + { + response->Message = StringUtils::ToClr(argList->GetString(2)); + } + + pendingTask->SetResult(response); + } handled = true; } return handled; } - - void EvaluateScriptDoneDelegate::FinishTask(int64 callbackId, bool success, CefRefPtr message, IJavascriptCallbackFactory^ callbackFactory) - { - auto pendingTask = _pendingTasks->RemovePendingTask(callbackId); - if (pendingTask != nullptr) - { - pendingTask->SetResult(CreateResponse(success, message, callbackFactory)); - } - } - - JavascriptResponse^ EvaluateScriptDoneDelegate::CreateResponse(bool success, CefRefPtr message, IJavascriptCallbackFactory^ callbackFactory) - { - auto result = gcnew JavascriptResponse(); - result->Success = success; - - if (success) - { - result->Result = DeserializeV8Object(message, 2, callbackFactory); - } - else - { - result->Message = StringUtils::ToClr(message->GetString(2)); - } - - return result; - } } } } \ No newline at end of file diff --git a/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.h b/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.h index 8db0acb62e..03a894645f 100644 --- a/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.h +++ b/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.h @@ -20,9 +20,6 @@ namespace CefSharp gcroot^> _callbackFactories; gcroot^> _pendingTasks; - - void FinishTask(int64 callbackId, bool success, CefRefPtr message, IJavascriptCallbackFactory^ callbackFactory); - JavascriptResponse^ CreateResponse(bool success, CefRefPtr message, IJavascriptCallbackFactory^ callbackFactory); public: EvaluateScriptDoneDelegate(PendingTaskRepository^ pendingTasks, Dictionary^ callbackFactories); Task^ EvaluateScriptAsync(CefRefPtr cefBrowser, int browserId, int frameId, String^ script, Nullable timeout); From f8954dcffea3a47143d12d34b01c75bfeb6dfcdd Mon Sep 17 00:00:00 2001 From: amaitland Date: Mon, 29 Jun 2015 11:49:12 +1000 Subject: [PATCH 05/19] Rename messaging keys to include Request/Response suffix Would be nice to move them into a class so they're not just out there on their own - whilst it's valid c++, it's not very .net --- .../Messaging/EvaluateScriptDelegate.cpp | 4 ++-- .../Internals/Messaging/EvaluateScriptDoneDelegate.cpp | 4 ++-- CefSharp.Core/Internals/Messaging/Messages.h | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp b/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp index 95a0a9276b..7ae2f10b01 100644 --- a/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp +++ b/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp @@ -28,7 +28,7 @@ namespace CefSharp { auto handled = false; auto name = message->GetName(); - if (name == kEvaluateJavascript) + if (name == kEvaluateJavascriptRequest) { auto argList = message->GetArgumentList(); auto browserId = argList->GetInt(0); @@ -90,7 +90,7 @@ namespace CefSharp CefRefPtr result; CefRefPtr exception; auto success = context->Eval(script, result, exception); - auto response = CefProcessMessage::Create(kEvaluateJavascriptDone); + auto response = CefProcessMessage::Create(kEvaluateJavascriptResponse); auto argList = response->GetArgumentList(); argList->SetBool(0, success); diff --git a/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp b/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp index 3a051f428b..6dff6a26d8 100644 --- a/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp +++ b/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp @@ -27,7 +27,7 @@ namespace CefSharp //create a new taskcompletionsource auto idAndComplectionSource = _pendingTasks->CreatePendingTask(timeout); - auto message = CefProcessMessage::Create(kEvaluateJavascript); + auto message = CefProcessMessage::Create(kEvaluateJavascriptRequest); auto argList = message->GetArgumentList(); argList->SetInt(0, browserId); argList->SetInt(1, frameId); @@ -43,7 +43,7 @@ namespace CefSharp { auto handled = false; auto name = message->GetName(); - if (name == kEvaluateJavascriptDone) + if (name == kEvaluateJavascriptResponse) { auto argList = message->GetArgumentList(); auto success = argList->GetBool(0); diff --git a/CefSharp.Core/Internals/Messaging/Messages.h b/CefSharp.Core/Internals/Messaging/Messages.h index 05a5e80feb..dad7864dcc 100644 --- a/CefSharp.Core/Internals/Messaging/Messages.h +++ b/CefSharp.Core/Internals/Messaging/Messages.h @@ -15,9 +15,9 @@ namespace CefSharp //contains process message names for all handled messages //Message containing a script to be evaluated - const CefString kEvaluateJavascript = "EvaluateJavascript"; + const CefString kEvaluateJavascriptRequest = "EvaluateJavascriptRequest"; //Message containing the result for a given evaluation - const CefString kEvaluateJavascriptDone = "EvaluateJavascriptDone"; + const CefString kEvaluateJavascriptResponse = "EvaluateJavascriptDoneResponse"; } } } \ No newline at end of file From 0a220f2f96c302f559abf55050f8fd999767eaeb Mon Sep 17 00:00:00 2001 From: amaitland Date: Mon, 29 Jun 2015 11:57:16 +1000 Subject: [PATCH 06/19] Inline most of the methods in EvaluateScriptDelegate - much easier to step through now (with the CefRefPtrs, it's a lot harder to step into a function than normal) --- .../Messaging/EvaluateScriptDelegate.cpp | 110 +++++++----------- .../Messaging/EvaluateScriptDelegate.h | 4 - 2 files changed, 44 insertions(+), 70 deletions(-) diff --git a/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp b/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp index 7ae2f10b01..fd7319fb96 100644 --- a/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp +++ b/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp @@ -9,13 +9,13 @@ #include "Serialization/V8Serialization.h" #include "../CefAppUnmanagedWrapper.h" #include "EvaluateScriptDelegate.h" + +using namespace CefSharp::Internals::Serialization; namespace CefSharp { namespace Internals { - using namespace Serialization; - namespace Messaging { EvaluateScriptDelegate::EvaluateScriptDelegate(CefRefPtr appUnmanagedWrapper) @@ -24,7 +24,7 @@ namespace CefSharp } - bool EvaluateScriptDelegate::OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message) + bool EvaluateScriptDelegate::OnProcessMessageReceived(CefRefPtr browser, CefProcessId sourceProcessId, CefRefPtr message) { auto handled = false; auto name = message->GetName(); @@ -36,77 +36,55 @@ namespace CefSharp 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 EvaluateScriptDelegate::EvaluateScript(int browserId, int frameId, int64 callbackId, CefString script) - { - CefRefPtr 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 EvaluateScriptDelegate::EvaluateScriptInFrame(CefRefPtr frame, int64 callbackId, CefString script, JavascriptCallbackRegistry^ callbackRegistry) - { - CefRefPtr result; - auto context = frame->GetV8Context(); - - if (context.get() && context->Enter()) - { - try + auto browserWrapper = _appUnmanagedWrapper->FindBrowserWrapper(browserId, true); + auto browser = browserWrapper->GetWrapped(); + auto frame = browser->GetFrame(frameId); + if (browser.get() && frame.get()) { - result = EvaluateScriptInContext(context, callbackId, script, callbackRegistry); + auto context = frame->GetV8Context(); + + if (context.get() && context->Enter()) + { + try + { + CefRefPtr result; + CefRefPtr 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(); + } + } } - finally + else { - context->Exit(); + //TODO handle error } - } - - return result; - } - CefRefPtr EvaluateScriptDelegate::EvaluateScriptInContext(CefRefPtr context, int64 callbackId, CefString script, JavascriptCallbackRegistry^ callbackRegistry) - { - CefRefPtr result; - CefRefPtr 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, callbackRegistry); - } - else - { - argList->SetString(2, exception->GetMessage()); + handled = true; } - return response; + return handled; } - } } } \ No newline at end of file diff --git a/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.h b/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.h index fd38919519..4b59f5dbfd 100644 --- a/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.h +++ b/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.h @@ -21,10 +21,6 @@ namespace CefSharp DISALLOW_IMPLICIT_CONSTRUCTORS(EvaluateScriptDelegate); CefRefPtr _appUnmanagedWrapper; - - CefRefPtr EvaluateScript(int browserId, int frameId, int64 callbackId, CefString script); - CefRefPtr EvaluateScriptInFrame(CefRefPtr frame, int64 callbackId, CefString script, JavascriptCallbackRegistry^ callbackRegistry); - CefRefPtr EvaluateScriptInContext(CefRefPtr context, int64 callbackId, CefString script, JavascriptCallbackRegistry^ callbackRegistry); public: EvaluateScriptDelegate(CefRefPtr appUnmanagedWrapper); virtual bool OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message) override; From d21808b5823bdf53fc969019969f700573a8eb69 Mon Sep 17 00:00:00 2001 From: amaitland Date: Mon, 29 Jun 2015 11:58:42 +1000 Subject: [PATCH 07/19] Rename variable to be more .net like --- .../Messaging/EvaluateScriptDelegate.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.h b/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.h index 4b59f5dbfd..264d9859c0 100644 --- a/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.h +++ b/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.h @@ -23,7 +23,7 @@ namespace CefSharp CefRefPtr _appUnmanagedWrapper; public: EvaluateScriptDelegate(CefRefPtr appUnmanagedWrapper); - virtual bool OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message) override; + virtual bool OnProcessMessageReceived(CefRefPtr browser, CefProcessId sourceProcessId, CefRefPtr message) override; }; } } From af39be37bb6ad41f260faed8718d54d1ccd02762 Mon Sep 17 00:00:00 2001 From: amaitland Date: Mon, 29 Jun 2015 12:00:33 +1000 Subject: [PATCH 08/19] Remove FindBrowserWrapper overload - not really required --- .../CefAppUnmanagedWrapper.cpp | 12 +++--------- .../CefAppUnmanagedWrapper.h | 1 - 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp index 6598ba493b..553b521f74 100644 --- a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp +++ b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp @@ -32,7 +32,7 @@ namespace CefSharp void CefAppUnmanagedWrapper::OnBrowserDestroyed(CefRefPtr browser) { - auto wrapper = FindBrowserWrapper(browser, false); + auto wrapper = FindBrowserWrapper(browser->GetIdentifier(), false); if (wrapper != nullptr) { @@ -44,7 +44,7 @@ namespace CefSharp void CefAppUnmanagedWrapper::OnContextCreated(CefRefPtr browser, CefRefPtr frame, CefRefPtr context) { - auto wrapper = FindBrowserWrapper(browser, true); + auto wrapper = FindBrowserWrapper(browser->GetIdentifier(), true); if (wrapper->JavascriptRootObject != nullptr) { @@ -59,7 +59,7 @@ namespace CefSharp void CefAppUnmanagedWrapper::OnContextReleased(CefRefPtr browser, CefRefPtr frame, CefRefPtr context) { - auto wrapper = FindBrowserWrapper(browser, true); + auto wrapper = FindBrowserWrapper(browser->GetIdentifier(), true); if (wrapper->JavascriptRootObjectWrapper != nullptr) { @@ -68,12 +68,6 @@ namespace CefSharp } }; - CefBrowserWrapper^ CefAppUnmanagedWrapper::FindBrowserWrapper(CefRefPtr browser, bool mustExist) - { - auto browserId = browser->GetIdentifier(); - return FindBrowserWrapper(browserId, mustExist); - }; - CefBrowserWrapper^ CefAppUnmanagedWrapper::FindBrowserWrapper(int browserId, bool mustExist) { CefBrowserWrapper^ wrapper = nullptr; diff --git a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h index c0c4100def..932427d8a8 100644 --- a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h +++ b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h @@ -32,7 +32,6 @@ namespace CefSharp gcroot^> _browserWrappers; CefBrowserWrapper^ FindBrowserWrapper(int browserId, bool mustExist); - CefBrowserWrapper^ FindBrowserWrapper(CefRefPtr browser, bool mustExist); public: CefAppUnmanagedWrapper(Action^ onBrowserCreated, Action^ onBrowserDestoryed) From a40590405a127ac201efc2310a290b600b7f312a Mon Sep 17 00:00:00 2001 From: amaitland Date: Mon, 29 Jun 2015 12:01:41 +1000 Subject: [PATCH 09/19] Remove AddProcessMessageDelegate method from CefAppUnmanagedWrapper - not required --- CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp | 5 ----- CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h | 4 +--- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp index 553b521f74..ea70c9bb3b 100644 --- a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp +++ b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp @@ -93,9 +93,4 @@ namespace CefSharp 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 932427d8a8..a6c8ef90ff 100644 --- a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h +++ b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h @@ -41,7 +41,7 @@ namespace CefSharp _browserWrappers = gcnew Dictionary(); //Register evaluate script request handler - AddProcessMessageDelegate(new EvaluateScriptDelegate(this)); + _processMessageDelegates.insert(new EvaluateScriptDelegate(this)); } ~CefAppUnmanagedWrapper() @@ -58,8 +58,6 @@ namespace CefSharp 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); }; } From ccbc97ffc4e418830ea43c24957d91fa8c8e58d0 Mon Sep 17 00:00:00 2001 From: amaitland Date: Mon, 29 Jun 2015 12:03:01 +1000 Subject: [PATCH 10/19] Minor code formatting --- CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp | 4 ++-- CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp index ea70c9bb3b..dae6fa26cb 100644 --- a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp +++ b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp @@ -82,13 +82,13 @@ namespace CefSharp return wrapper; } - bool CefAppUnmanagedWrapper::OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message) + bool CefAppUnmanagedWrapper::OnProcessMessageReceived(CefRefPtr browser, CefProcessId sourceProcessId, CefRefPtr message) { bool handled = false; for (ProcessMessageDelegateSet::iterator it = _processMessageDelegates.begin(); it != _processMessageDelegates.end() && !handled; it++) { - handled = (*it)->OnProcessMessageReceived(browser, source_process, message); + handled = (*it)->OnProcessMessageReceived(browser, sourceProcessId, message); } return handled; diff --git a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h index a6c8ef90ff..bfeae18259 100644 --- a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h +++ b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h @@ -56,7 +56,7 @@ 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; + virtual DECL bool OnProcessMessageReceived(CefRefPtr browser, CefProcessId sourceProcessId, CefRefPtr message) OVERRIDE; IMPLEMENT_REFCOUNTING(CefAppUnmanagedWrapper); }; From 53221506f207479e8c622e8213bba28745762b5e Mon Sep 17 00:00:00 2001 From: amaitland Date: Mon, 29 Jun 2015 12:33:42 +1000 Subject: [PATCH 11/19] Remove redundant AddProcessMessageDelegate method from ClientAdapter --- CefSharp.Core/Internals/ClientAdapter.cpp | 5 ----- CefSharp.Core/Internals/ClientAdapter.h | 5 ++--- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/CefSharp.Core/Internals/ClientAdapter.cpp b/CefSharp.Core/Internals/ClientAdapter.cpp index 770a24a55c..5ef661ca6e 100644 --- a/CefSharp.Core/Internals/ClientAdapter.cpp +++ b/CefSharp.Core/Internals/ClientAdapter.cpp @@ -824,10 +824,5 @@ namespace CefSharp } return result; } - - void ClientAdapter::AddProcessMessageDelegate(CefRefPtr processMessageDelegate) - { - _processMessageDelegates.insert(processMessageDelegate); - } } } diff --git a/CefSharp.Core/Internals/ClientAdapter.h b/CefSharp.Core/Internals/ClientAdapter.h index 123784feca..cf7496c3c4 100644 --- a/CefSharp.Core/Internals/ClientAdapter.h +++ b/CefSharp.Core/Internals/ClientAdapter.h @@ -68,7 +68,8 @@ namespace CefSharp { //create eval script message handler _evalScriptDoneDelegate = new EvaluateScriptDoneDelegate(_pendingTaskRepository, _javascriptCallbackFactories); - AddProcessMessageDelegate(_evalScriptDoneDelegate); + + _processMessageDelegates.insert(_evalScriptDoneDelegate); } ~ClientAdapter() @@ -184,8 +185,6 @@ namespace CefSharp //sends out an eval script request to the render process Task^ EvaluateScriptAsync(int browserId, int frameId, String^ script, Nullable timeout); - void AddProcessMessageDelegate(CefRefPtr processMessageDelegate); - IMPLEMENT_REFCOUNTING(ClientAdapter); }; } From 833db43a1d02a79d0dd7c0500603991b8ffdd78d Mon Sep 17 00:00:00 2001 From: amaitland Date: Mon, 29 Jun 2015 12:38:54 +1000 Subject: [PATCH 12/19] FrameId is actually a 64bit int --- .../Messaging/EvaluateScriptDelegate.cpp | 2 +- CefSharp.Core/Internals/ClientAdapter.cpp | 2 +- CefSharp.Core/Internals/ClientAdapter.h | 2 +- .../Internals/Messaging/EvaluateScriptDoneDelegate.cpp | 4 ++-- .../Internals/Messaging/EvaluateScriptDoneDelegate.h | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp b/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp index fd7319fb96..5221ab00bb 100644 --- a/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp +++ b/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp @@ -32,7 +32,7 @@ namespace CefSharp { auto argList = message->GetArgumentList(); auto browserId = argList->GetInt(0); - auto frameId = argList->GetInt(1); + auto frameId = GetInt64(argList, 1); auto callbackId = GetInt64(argList, 2); auto script = argList->GetString(3); diff --git a/CefSharp.Core/Internals/ClientAdapter.cpp b/CefSharp.Core/Internals/ClientAdapter.cpp index 5ef661ca6e..f71cf7f418 100644 --- a/CefSharp.Core/Internals/ClientAdapter.cpp +++ b/CefSharp.Core/Internals/ClientAdapter.cpp @@ -815,7 +815,7 @@ namespace CefSharp return handled; } - Task^ ClientAdapter::EvaluateScriptAsync(int browserId, int frameId, String^ script, Nullable timeout) + Task^ ClientAdapter::EvaluateScriptAsync(int browserId, int64 frameId, String^ script, Nullable timeout) { Task^ result = nullptr; if (_cefBrowser.get()) diff --git a/CefSharp.Core/Internals/ClientAdapter.h b/CefSharp.Core/Internals/ClientAdapter.h index cf7496c3c4..710fb3c5d7 100644 --- a/CefSharp.Core/Internals/ClientAdapter.h +++ b/CefSharp.Core/Internals/ClientAdapter.h @@ -183,7 +183,7 @@ namespace CefSharp CefRefPtr callback) OVERRIDE; //sends out an eval script request to the render process - Task^ EvaluateScriptAsync(int browserId, int frameId, String^ script, Nullable timeout); + Task^ EvaluateScriptAsync(int browserId, int64 frameId, String^ script, Nullable timeout); IMPLEMENT_REFCOUNTING(ClientAdapter); }; diff --git a/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp b/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp index 6dff6a26d8..5d029b08e2 100644 --- a/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp +++ b/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp @@ -22,7 +22,7 @@ namespace CefSharp } - Task^ EvaluateScriptDoneDelegate::EvaluateScriptAsync(CefRefPtr cefBrowser, int browserId, int frameId, String^ script, Nullable timeout) + Task^ EvaluateScriptDoneDelegate::EvaluateScriptAsync(CefRefPtr cefBrowser, int browserId, int64 frameId, String^ script, Nullable timeout) { //create a new taskcompletionsource auto idAndComplectionSource = _pendingTasks->CreatePendingTask(timeout); @@ -30,7 +30,7 @@ namespace CefSharp auto message = CefProcessMessage::Create(kEvaluateJavascriptRequest); auto argList = message->GetArgumentList(); argList->SetInt(0, browserId); - argList->SetInt(1, frameId); + SetInt64(frameId, argList, 1); SetInt64(idAndComplectionSource.Key, argList, 2); argList->SetString(3, StringUtils::ToNative(script)); diff --git a/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.h b/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.h index 03a894645f..25e17bcb1f 100644 --- a/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.h +++ b/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.h @@ -22,7 +22,7 @@ namespace CefSharp gcroot^> _pendingTasks; public: EvaluateScriptDoneDelegate(PendingTaskRepository^ pendingTasks, Dictionary^ callbackFactories); - Task^ EvaluateScriptAsync(CefRefPtr cefBrowser, int browserId, int frameId, String^ script, Nullable timeout); + Task^ EvaluateScriptAsync(CefRefPtr cefBrowser, int browserId, int64 frameId, String^ script, Nullable timeout); virtual bool OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message) override; }; } From 819dfd54f9cb1864ab7e860a3b516dfdf0fdfa86 Mon Sep 17 00:00:00 2001 From: amaitland Date: Fri, 26 Jun 2015 11:19:51 +1000 Subject: [PATCH 13/19] Move WcfEnabled option into CefSharpSettings class Reduce code duplication - move EvaluateScriptAsync in WebBrowserExtensions --- CefSharp.Core/Cef.h | 13 ------ CefSharp.Core/CefSettings.h | 8 ---- CefSharp.Core/Internals/CefSharpApp.h | 2 +- CefSharp.Core/ManagedCefBrowserAdapter.cpp | 40 +------------------ CefSharp.Core/ManagedCefBrowserAdapter.h | 5 +-- CefSharp.Example/CefExample.cs | 2 +- CefSharp.OffScreen/ChromiumWebBrowser.cs | 5 --- CefSharp.WinForms/ChromiumWebBrowser.cs | 10 ----- .../Views/BrowserTabView.xaml.cs | 2 +- CefSharp.Wpf/ChromiumWebBrowser.cs | 10 ----- CefSharp/CefSharp.csproj | 1 + CefSharp/CefSharpSettings.cs | 21 ++++++++++ CefSharp/IWebBrowser.cs | 10 ----- CefSharp/Internals/IBrowserAdapter.cs | 2 - CefSharp/WebBrowserExtensions.cs | 20 ++++++++++ 15 files changed, 48 insertions(+), 103 deletions(-) create mode 100644 CefSharp/CefSharpSettings.cs diff --git a/CefSharp.Core/Cef.h b/CefSharp.Core/Cef.h index 63c24de9d4..676e1e0bc1 100644 --- a/CefSharp.Core/Cef.h +++ b/CefSharp.Core/Cef.h @@ -33,7 +33,6 @@ namespace CefSharp private: static Object^ _sync; - static bool _wcfEnabled = false; static bool _initialized = false; static HashSet^ _disposables; @@ -75,14 +74,6 @@ namespace CefSharp _disposables->Remove(item); } - static property bool WcfEnabled - { - bool get() - { - return _wcfEnabled; - } - } - /// Gets a value that indicates whether CefSharp is initialized. /// true if CefSharp is initialized; otherwise, false. static property bool IsInitialized @@ -191,10 +182,6 @@ namespace CefSharp } _initialized = success; - if (success) - { - _wcfEnabled = cefSettings->WcfEnabled; - } if (_initialized && shutdownOnProcessExit) { diff --git a/CefSharp.Core/CefSettings.h b/CefSharp.Core/CefSettings.h index 8b6471ad10..d3e8898644 100644 --- a/CefSharp.Core/CefSettings.h +++ b/CefSharp.Core/CefSettings.h @@ -30,19 +30,11 @@ namespace CefSharp BrowserSubprocessPath = "CefSharp.BrowserSubprocess.exe"; _cefCustomSchemes = gcnew List(); _cefCommandLineArgs = gcnew Dictionary(); - WcfEnabled = true; } !CefSettings() { delete _cefSettings; } ~CefSettings() { delete _cefSettings; } - /// - /// WCF is used by JavascriptBinding and EvaluateScriptAsync. - /// Disabling effectively disables both of these features. - /// Defaults to true - /// - virtual property bool WcfEnabled; - virtual property IEnumerable^ CefCustomSchemes { IEnumerable^ get() { return _cefCustomSchemes; } diff --git a/CefSharp.Core/Internals/CefSharpApp.h b/CefSharp.Core/Internals/CefSharpApp.h index e023272f28..59b8e791ee 100644 --- a/CefSharp.Core/Internals/CefSharpApp.h +++ b/CefSharp.Core/Internals/CefSharpApp.h @@ -45,7 +45,7 @@ namespace CefSharp virtual void OnBeforeChildProcessLaunch(CefRefPtr command_line) OVERRIDE { - if (_cefSettings->WcfEnabled) + if (CefSharpSettings::WcfEnabled) { command_line->AppendArgument(StringUtils::ToNative(CefSharpArguments::WcfEnabledArgument)); } diff --git a/CefSharp.Core/ManagedCefBrowserAdapter.cpp b/CefSharp.Core/ManagedCefBrowserAdapter.cpp index ef43c91f92..246f03375c 100644 --- a/CefSharp.Core/ManagedCefBrowserAdapter.cpp +++ b/CefSharp.Core/ManagedCefBrowserAdapter.cpp @@ -39,9 +39,7 @@ void ManagedCefBrowserAdapter::LoadUrl(String^ address) void ManagedCefBrowserAdapter::OnAfterBrowserCreated(int browserId) { - _wcfEnabled = Cef::WcfEnabled; - - if (_wcfEnabled) + if (CefSharpSettings::WcfEnabled) { _browserProcessServiceHost = gcnew BrowserProcessServiceHost(_javaScriptObjectRepository, Process::GetCurrentProcess()->Id, browserId); //NOTE: Attempt to solve timing issue where browser is opened and rapidly disposed. In some cases a call to Open throws @@ -284,40 +282,6 @@ void ManagedCefBrowserAdapter::OnMouseWheel(int x, int y, int deltaX, int deltaY } } -Task^ ManagedCefBrowserAdapter::EvaluateScriptAsync(int browserId, Int64 frameId, String^ script, Nullable timeout) -{ - if (timeout.HasValue && timeout.Value.TotalMilliseconds > UInt32::MaxValue) - { - throw gcnew ArgumentOutOfRangeException("timeout", "Timeout greater than Maximum allowable value of " + UInt32::MaxValue); - } - - return _clientAdapter->EvaluateScriptAsync(browserId, frameId, script, timeout); -} - -Task^ ManagedCefBrowserAdapter::EvaluateScriptAsync(String^ script, Nullable timeout) -{ - if (timeout.HasValue && timeout.Value.TotalMilliseconds > UInt32::MaxValue) - { - throw gcnew ArgumentOutOfRangeException("timeout", "Timeout greater than Maximum allowable value of " + UInt32::MaxValue); - } - - auto browser = _clientAdapter->GetCefBrowser(); - - if (browser == nullptr) - { - return nullptr; - } - - auto frame = browser->GetMainFrame(); - - if (frame == nullptr) - { - return nullptr; - } - - return _clientAdapter->EvaluateScriptAsync(browser->GetIdentifier(), frame->GetIdentifier(), script, timeout); -} - void ManagedCefBrowserAdapter::CreateBrowser(BrowserSettings^ browserSettings, IntPtr sourceHandle, String^ address) { HWND hwnd = static_cast(sourceHandle.ToPointer()); @@ -371,7 +335,7 @@ void ManagedCefBrowserAdapter::NotifyScreenInfoChanged() void ManagedCefBrowserAdapter::RegisterJsObject(String^ name, Object^ object, bool lowerCaseJavascriptNames) { - if (!_wcfEnabled) + if (!CefSharpSettings::WcfEnabled) { throw gcnew InvalidOperationException("To enable synchronous JS bindings set WcfEnabled true in CefSettings during initialization."); } diff --git a/CefSharp.Core/ManagedCefBrowserAdapter.h b/CefSharp.Core/ManagedCefBrowserAdapter.h index 7eb9d8e1f7..494de58aa8 100644 --- a/CefSharp.Core/ManagedCefBrowserAdapter.h +++ b/CefSharp.Core/ManagedCefBrowserAdapter.h @@ -34,7 +34,6 @@ namespace CefSharp JavascriptObjectRepository^ _javaScriptObjectRepository; IBrowser^ _browserWrapper; bool _isDisposed; - bool _wcfEnabled; private: // Private keyboard functions: @@ -79,7 +78,7 @@ namespace CefSharp delete _browserWrapper; _browserWrapper = nullptr; - if (_wcfEnabled) + if (CefSharpSettings::WcfEnabled) { _browserProcessServiceHost->Close(); _browserProcessServiceHost = nullptr; @@ -108,8 +107,6 @@ namespace CefSharp void OnMouseMove(int x, int y, bool mouseLeave, CefEventFlags modifiers); void OnMouseButton(int x, int y, int mouseButtonType, bool mouseUp, int clickCount, CefEventFlags modifiers); void OnMouseWheel(int x, int y, int deltaX, int deltaY); - virtual Task^ EvaluateScriptAsync(int browserId, Int64 frameId, String^ script, Nullable timeout); - virtual Task^ EvaluateScriptAsync(String^ script, Nullable timeout); void Resize(int width, int height); void NotifyMoveOrResizeStarted(); void NotifyScreenInfoChanged(); diff --git a/CefSharp.Example/CefExample.cs b/CefSharp.Example/CefExample.cs index 6a8c7fc961..a8e4fa9147 100644 --- a/CefSharp.Example/CefExample.cs +++ b/CefSharp.Example/CefExample.cs @@ -29,7 +29,7 @@ public static void Init() var settings = new CefSettings(); settings.RemoteDebuggingPort = 8088; //This will disable WCF (Effectively disabling JavascriptBinding and EvaluateScriptAsync) - //settings.WcfEnabled = false; + //CefSharpSettings.WcfEnabled = false; //The location where cache data will be stored on disk. If empty an in-memory cache will be used for some features and a temporary disk cache for others. //HTML5 databases such as localStorage will only persist across sessions if a cache path is specified. settings.CachePath = "cache"; diff --git a/CefSharp.OffScreen/ChromiumWebBrowser.cs b/CefSharp.OffScreen/ChromiumWebBrowser.cs index d326e08b80..5bfd68ff06 100644 --- a/CefSharp.OffScreen/ChromiumWebBrowser.cs +++ b/CefSharp.OffScreen/ChromiumWebBrowser.cs @@ -228,11 +228,6 @@ public Task ScreenshotAsync() return completionSource.Task; } - public Task EvaluateScriptAsync(string script, TimeSpan? timeout = null) - { - return managedCefBrowserAdapter.EvaluateScriptAsync(script, timeout); - } - public void Load(string url) { Address = url; diff --git a/CefSharp.WinForms/ChromiumWebBrowser.cs b/CefSharp.WinForms/ChromiumWebBrowser.cs index a4dc05225f..b9d2a41f21 100644 --- a/CefSharp.WinForms/ChromiumWebBrowser.cs +++ b/CefSharp.WinForms/ChromiumWebBrowser.cs @@ -155,16 +155,6 @@ public void RegisterJsObject(string name, object objectToBind, bool camelCaseJav managedCefBrowserAdapter.RegisterJsObject(name, objectToBind, camelCaseJavascriptNames); } - public Task EvaluateScriptAsync(string script) - { - return EvaluateScriptAsync(script, timeout: null); - } - - public Task EvaluateScriptAsync(string script, TimeSpan? timeout) - { - return managedCefBrowserAdapter.EvaluateScriptAsync(script, timeout); - } - public void SendMouseWheelEvent(int x, int y, int deltaX, int deltaY) { managedCefBrowserAdapter.OnMouseWheel(x, y, deltaX, deltaY); diff --git a/CefSharp.Wpf.Example/Views/BrowserTabView.xaml.cs b/CefSharp.Wpf.Example/Views/BrowserTabView.xaml.cs index fed3bfbfcd..0f18a4ea3c 100644 --- a/CefSharp.Wpf.Example/Views/BrowserTabView.xaml.cs +++ b/CefSharp.Wpf.Example/Views/BrowserTabView.xaml.cs @@ -15,7 +15,7 @@ public BrowserTabView() InitializeComponent(); browser.RequestHandler = new RequestHandler(); - if (Cef.WcfEnabled) + if (CefSharpSettings.WcfEnabled) { browser.RegisterJsObject("bound", new BoundObject()); } diff --git a/CefSharp.Wpf/ChromiumWebBrowser.cs b/CefSharp.Wpf/ChromiumWebBrowser.cs index c8da90ab77..3e0e8c0416 100644 --- a/CefSharp.Wpf/ChromiumWebBrowser.cs +++ b/CefSharp.Wpf/ChromiumWebBrowser.cs @@ -1292,16 +1292,6 @@ public void RegisterJsObject(string name, object objectToBind, bool camelCaseJav managedCefBrowserAdapter.RegisterJsObject(name, objectToBind, camelCaseJavascriptNames); } - public Task EvaluateScriptAsync(string script) - { - return EvaluateScriptAsync(script, timeout: null); - } - - public Task EvaluateScriptAsync(string script, TimeSpan? timeout) - { - return managedCefBrowserAdapter.EvaluateScriptAsync(script, timeout); - } - /// /// Raises Rendering event /// diff --git a/CefSharp/CefSharp.csproj b/CefSharp/CefSharp.csproj index 9c253140e6..ee33d38b5a 100644 --- a/CefSharp/CefSharp.csproj +++ b/CefSharp/CefSharp.csproj @@ -92,6 +92,7 @@ + diff --git a/CefSharp/CefSharpSettings.cs b/CefSharp/CefSharpSettings.cs new file mode 100644 index 0000000000..22d7d7f762 --- /dev/null +++ b/CefSharp/CefSharpSettings.cs @@ -0,0 +1,21 @@ +// 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. + +namespace CefSharp +{ + public static class CefSharpSettings + { + static CefSharpSettings() + { + WcfEnabled = true; + } + + /// + /// WCF is used by JavascriptBinding and EvaluateScriptAsync. + /// Disabling effectively disables both of these features. + /// Defaults to true + /// + public static bool WcfEnabled { get; set; } + } +} diff --git a/CefSharp/IWebBrowser.cs b/CefSharp/IWebBrowser.cs index a4353011ab..b753373bc9 100644 --- a/CefSharp/IWebBrowser.cs +++ b/CefSharp/IWebBrowser.cs @@ -3,7 +3,6 @@ // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. using System; -using System.Threading.Tasks; namespace CefSharp { @@ -60,15 +59,6 @@ public interface IWebBrowser : IDisposable /// camel case the javascript names of properties/methods, defaults to true void RegisterJsObject(string name, object objectToBind, bool camelCaseJavascriptNames = true); - /// - /// Execute some Javascript code in the context of this WebBrowser, and return the result of the evaluation - /// in an Async fashion - /// - /// The Javascript code that should be executed. - /// The timeout after which the Javascript code execution should be aborted. - /// A Task that can be awaited to perform the script execution - Task EvaluateScriptAsync(string script, TimeSpan? timeout = null); - /// /// Implement and assign to handle dialog events. /// diff --git a/CefSharp/Internals/IBrowserAdapter.cs b/CefSharp/Internals/IBrowserAdapter.cs index 2c256a78fe..c9c651d0e3 100644 --- a/CefSharp/Internals/IBrowserAdapter.cs +++ b/CefSharp/Internals/IBrowserAdapter.cs @@ -14,8 +14,6 @@ namespace CefSharp.Internals public interface IBrowserAdapter { IJavascriptCallbackFactory JavascriptCallbackFactory { get; } - Task EvaluateScriptAsync(string script, TimeSpan? timeout); - Task EvaluateScriptAsync(int browserId, Int64 frameId, string script, TimeSpan? timeout); void OnAfterBrowserCreated(int browserId); IBrowser GetBrowser(); } diff --git a/CefSharp/WebBrowserExtensions.cs b/CefSharp/WebBrowserExtensions.cs index f61825b445..ebc25c17bf 100644 --- a/CefSharp/WebBrowserExtensions.cs +++ b/CefSharp/WebBrowserExtensions.cs @@ -538,6 +538,26 @@ public static void AddWordToDictionary(this IWebBrowser browser, string word) cefBrowser.AddWordToDictionary(word); } + public static Task EvaluateScriptAsync(this IWebBrowser browser, string script, TimeSpan? timeout = null) + { + if (timeout.HasValue && timeout.Value.TotalMilliseconds > UInt32.MaxValue) + { + throw new ArgumentOutOfRangeException("timeout", "Timeout greater than Maximum allowable value of " + UInt32.MaxValue); + } + + if (!CefSharpSettings.WcfEnabled) + { + throw new InvalidOperationException("To wait for javascript code set WcfEnabled true in CefSettings during initialization."); + } + + using (var frame = browser.GetMainFrame()) + { + ThrowExceptionIfFrameNull(frame); + + return frame.EvaluateScriptAsync(script, timeout); + } + } + private static void ThrowExceptionIfFrameNull(IFrame frame) { if (frame == null) From 2129c1907ef215e36d32a420cbc8f4273d0a0b55 Mon Sep 17 00:00:00 2001 From: amaitland Date: Mon, 29 Jun 2015 14:03:10 +1000 Subject: [PATCH 14/19] Remove IBrowserAdapter from Frame and Browser wrappers - now directly cast CefClient to ClientAdapter so can execute js --- CefSharp.Core/Internals/CefFrameWrapper.cpp | 15 ++++---- CefSharp.Core/Internals/CefFrameWrapper.h | 6 ++-- .../Internals/CefSharpBrowserWrapper.cpp | 8 ++--- .../Internals/CefSharpBrowserWrapper.h | 6 ++-- CefSharp.Core/Internals/ClientAdapter.cpp | 34 +++++++++---------- CefSharp.Core/ManagedCefBrowserAdapter.cpp | 10 +++--- CefSharp.Core/SchemeHandlerFactoryWrapper.h | 4 +-- CefSharp/WebBrowserExtensions.cs | 5 --- 8 files changed, 40 insertions(+), 48 deletions(-) diff --git a/CefSharp.Core/Internals/CefFrameWrapper.cpp b/CefSharp.Core/Internals/CefFrameWrapper.cpp index 9a523ff08d..2e59f9834d 100644 --- a/CefSharp.Core/Internals/CefFrameWrapper.cpp +++ b/CefSharp.Core/Internals/CefFrameWrapper.cpp @@ -175,11 +175,12 @@ void CefFrameWrapper::ExecuteJavaScriptAsync(String^ code, String^ scriptUrl, in Task^ CefFrameWrapper::EvaluateScriptAsync(String^ script, Nullable timeout) { ThrowIfDisposed(); - if (_browserAdapter == nullptr) - { - throw gcnew InvalidOperationException(gcnew String(L"IBrowserAdapter is NULL, EvaluateScriptAsync MUST NOT be called from the render process!")); - } - return _browserAdapter->EvaluateScriptAsync(_frame->GetBrowser()->GetIdentifier(), _frame->GetIdentifier(), script, timeout); + + auto host = _frame->GetBrowser()->GetHost(); + + auto client = static_cast(host->GetClient().get()); + + return client->EvaluateScriptAsync(_frame->GetBrowser()->GetIdentifier(), _frame->GetIdentifier(), script, timeout); } /// @@ -242,7 +243,7 @@ IFrame^ CefFrameWrapper::Parent::get() auto parent = _frame->GetParent(); if (parent != nullptr && _parentFrame != nullptr) { - _parentFrame = gcnew CefFrameWrapper(parent, _browserAdapter); + _parentFrame = gcnew CefFrameWrapper(parent); } else if (parent == nullptr) { @@ -286,7 +287,7 @@ IBrowser^ CefFrameWrapper::Browser::get() return _owningBrowser; } - _owningBrowser = gcnew CefSharpBrowserWrapper(_frame->GetBrowser(), _browserAdapter); + _owningBrowser = gcnew CefSharpBrowserWrapper(_frame->GetBrowser()); return _owningBrowser; } diff --git a/CefSharp.Core/Internals/CefFrameWrapper.h b/CefSharp.Core/Internals/CefFrameWrapper.h index 45fecf6940..07d5abd4dd 100644 --- a/CefSharp.Core/Internals/CefFrameWrapper.h +++ b/CefSharp.Core/Internals/CefFrameWrapper.h @@ -24,15 +24,14 @@ namespace CefSharp { private: MCefRefPtr _frame; - IBrowserAdapter^ _browserAdapter; IFrame^ _parentFrame; IBrowser^ _owningBrowser; Object^ _syncRoot; bool _disposed; internal: - CefFrameWrapper::CefFrameWrapper(CefRefPtr &frame, IBrowserAdapter^ browserAdapter) - : _frame(frame), _browserAdapter(browserAdapter), _disposed(false), + CefFrameWrapper::CefFrameWrapper(CefRefPtr &frame) + : _frame(frame), _disposed(false), _parentFrame(nullptr), _owningBrowser(nullptr), _syncRoot(gcnew Object()) { } @@ -46,7 +45,6 @@ namespace CefSharp { this->!CefFrameWrapper(); - _browserAdapter = nullptr; delete _parentFrame; delete _owningBrowser; _parentFrame = nullptr; diff --git a/CefSharp.Core/Internals/CefSharpBrowserWrapper.cpp b/CefSharp.Core/Internals/CefSharpBrowserWrapper.cpp index 1605c96ce1..87cc4c30f1 100644 --- a/CefSharp.Core/Internals/CefSharpBrowserWrapper.cpp +++ b/CefSharp.Core/Internals/CefSharpBrowserWrapper.cpp @@ -154,7 +154,7 @@ IFrame^ CefSharpBrowserWrapper::MainFrame::get() { ThrowIfDisposed(); auto frame = _browser->GetMainFrame(); - return gcnew CefFrameWrapper(frame, _browserAdapter); + return gcnew CefFrameWrapper(frame); } /// @@ -164,7 +164,7 @@ IFrame^ CefSharpBrowserWrapper::MainFrame::get() IFrame^ CefSharpBrowserWrapper::FocusedFrame::get() { ThrowIfDisposed(); - return gcnew CefFrameWrapper(_browser->GetFocusedFrame(), _browserAdapter); + return gcnew CefFrameWrapper(_browser->GetFocusedFrame()); } /// @@ -174,7 +174,7 @@ IFrame^ CefSharpBrowserWrapper::FocusedFrame::get() IFrame^ CefSharpBrowserWrapper::GetFrame(Int64 identifier) { ThrowIfDisposed(); - return gcnew CefFrameWrapper(_browser->GetFrame(identifier), _browserAdapter); + return gcnew CefFrameWrapper(_browser->GetFrame(identifier)); } /// @@ -184,7 +184,7 @@ IFrame^ CefSharpBrowserWrapper::GetFrame(Int64 identifier) IFrame^ CefSharpBrowserWrapper::GetFrame(String^ name) { ThrowIfDisposed(); - return gcnew CefFrameWrapper(_browser->GetFrame(StringUtils::ToNative(name)), _browserAdapter); + return gcnew CefFrameWrapper(_browser->GetFrame(StringUtils::ToNative(name))); } /// diff --git a/CefSharp.Core/Internals/CefSharpBrowserWrapper.h b/CefSharp.Core/Internals/CefSharpBrowserWrapper.h index 2c2587f41f..a1b0d93790 100644 --- a/CefSharp.Core/Internals/CefSharpBrowserWrapper.h +++ b/CefSharp.Core/Internals/CefSharpBrowserWrapper.h @@ -17,13 +17,12 @@ namespace CefSharp { private: MCefRefPtr _browser; - IBrowserAdapter^ _browserAdapter; IBrowserHost^ _browserHost; bool _disposed; internal: - CefSharpBrowserWrapper::CefSharpBrowserWrapper(CefRefPtr &browser, IBrowserAdapter^ browserAdapter) - : _browser(browser), _browserAdapter(browserAdapter), _disposed(false) + CefSharpBrowserWrapper::CefSharpBrowserWrapper(CefRefPtr &browser) + : _browser(browser), _disposed(false) { } @@ -36,7 +35,6 @@ namespace CefSharp ~CefSharpBrowserWrapper() { this->!CefSharpBrowserWrapper(); - _browserAdapter = nullptr; delete _browserHost; _browserHost = nullptr; _disposed = true; diff --git a/CefSharp.Core/Internals/ClientAdapter.cpp b/CefSharp.Core/Internals/ClientAdapter.cpp index f71cf7f418..3af45dee83 100644 --- a/CefSharp.Core/Internals/ClientAdapter.cpp +++ b/CefSharp.Core/Internals/ClientAdapter.cpp @@ -71,7 +71,7 @@ namespace CefSharp bool createdWrapper = false; IBrowser^ browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup()); - CefFrameWrapper frameWrapper(frame, _browserAdapter); + CefFrameWrapper frameWrapper(frame); auto result = handler->OnBeforePopup( _browserControl, browserWrapper, %frameWrapper, StringUtils::ToClr(target_url), @@ -83,7 +83,7 @@ namespace CefSharp { if (browser->IsPopup()) { - auto browserWrapper = gcnew CefSharpBrowserWrapper(browser, _browserAdapter); + auto browserWrapper = gcnew CefSharpBrowserWrapper(browser); // Add to the list of popup browsers. _popupBrowsers->Add(browser->GetIdentifier(), browserWrapper); auto handler = _browserControl->PopupHandler; @@ -315,14 +315,14 @@ namespace CefSharp if (popupHandler != nullptr) { IBrowser^ browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), true); - CefFrameWrapper frameWrapper(frame, _browserAdapter); + CefFrameWrapper frameWrapper(frame); popupHandler->OnFrameLoadStart(_browserControl, gcnew FrameLoadStartEventArgs(browserWrapper, %frameWrapper)); } } else { IBrowser^ browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), false); - CefFrameWrapper frameWrapper(frame, _browserAdapter); + CefFrameWrapper frameWrapper(frame); _browserControl->OnFrameLoadStart(gcnew FrameLoadStartEventArgs(browserWrapper, %frameWrapper)); } } @@ -336,13 +336,13 @@ namespace CefSharp { IBrowser^ browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), true); - CefFrameWrapper frameWrapper(frame, _browserAdapter); + CefFrameWrapper frameWrapper(frame); popupHandler->OnFrameLoadEnd(_browserControl, gcnew FrameLoadEndEventArgs(browserWrapper, %frameWrapper, httpStatusCode)); } } else { - CefFrameWrapper frameWrapper(frame, _browserAdapter); + CefFrameWrapper frameWrapper(frame); auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), false); _browserControl->OnFrameLoadEnd(gcnew FrameLoadEndEventArgs(browserWrapper, %frameWrapper, httpStatusCode)); } @@ -356,14 +356,14 @@ namespace CefSharp if (popupHandler != nullptr) { IBrowser^ browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), true); - CefFrameWrapper frameWrapper(frame, _browserAdapter); + CefFrameWrapper frameWrapper(frame); popupHandler->OnLoadError(_browserControl, browserWrapper, gcnew LoadErrorEventArgs(%frameWrapper, static_cast(errorCode), StringUtils::ToClr(errorText), StringUtils::ToClr(failedUrl))); } } else { - CefFrameWrapper frameWrapper(frame, _browserAdapter); + CefFrameWrapper frameWrapper(frame); _browserControl->OnLoadError(%frameWrapper, (CefErrorCode)errorCode, StringUtils::ToClr(errorText), StringUtils::ToClr(failedUrl)); } } @@ -380,7 +380,7 @@ namespace CefSharp IBrowser^ browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), true); - CefFrameWrapper frameWrapper(frame, _browserAdapter); + CefFrameWrapper frameWrapper(frame); CefRequestWrapper requestWrapper(request); return popupHandler->OnBeforeBrowse(_browserControl, browserWrapper, %requestWrapper, isRedirect, %frameWrapper); } @@ -393,7 +393,7 @@ namespace CefSharp } IBrowser^ browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), false); - CefFrameWrapper frameWrapper(frame, _browserAdapter); + CefFrameWrapper frameWrapper(frame); CefRequestWrapper requestWrapper(request); return handler->OnBeforeBrowse(_browserControl, browserWrapper, %frameWrapper, %requestWrapper, isRedirect); @@ -488,7 +488,7 @@ namespace CefSharp { auto managedNewUrl = StringUtils::ToClr(newUrl); IBrowser^ browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), true);; - CefFrameWrapper frameWrapper(frame, _browserAdapter); + CefFrameWrapper frameWrapper(frame); popupHandler->OnResourceRedirect(_browserControl, browserWrapper, %frameWrapper, managedNewUrl); @@ -501,7 +501,7 @@ namespace CefSharp if (handler != nullptr) { auto managedNewUrl = StringUtils::ToClr(newUrl); - CefFrameWrapper frameWrapper(frame, _browserAdapter); + CefFrameWrapper frameWrapper(frame); handler->OnResourceRedirect(_browserControl, %frameWrapper, managedNewUrl); @@ -536,7 +536,7 @@ namespace CefSharp } IBrowser^ browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup()); - auto frameWrapper = gcnew CefFrameWrapper(frame, _browserAdapter); + auto frameWrapper = gcnew CefFrameWrapper(frame); auto requestWrapper = gcnew CefRequestWrapper(request); auto resourceHandler = factory->GetResourceHandler(_browserControl, browserWrapper, frameWrapper, requestWrapper); @@ -570,7 +570,7 @@ namespace CefSharp auto popupHandler = _browserControl->PopupHandler; if (popupHandler != nullptr) { - auto frameWrapper = gcnew CefFrameWrapper(frame, _browserAdapter); + auto frameWrapper = gcnew CefFrameWrapper(frame); auto requestWrapper = gcnew CefRequestWrapper(request); IBrowser^ browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), true); @@ -581,7 +581,7 @@ namespace CefSharp } else { - auto frameWrapper = gcnew CefFrameWrapper(frame, _browserAdapter); + auto frameWrapper = gcnew CefFrameWrapper(frame); auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), false); auto requestWrapper = gcnew CefRequestWrapper(request); auto requestCallback = gcnew CefRequestCallbackWrapper(callback, frameWrapper, requestWrapper); @@ -601,7 +601,7 @@ namespace CefSharp } auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup()); - auto frameWrapper = gcnew CefFrameWrapper(frame, _browserAdapter); + auto frameWrapper = gcnew CefFrameWrapper(frame); auto callbackWrapper = gcnew CefAuthCallbackWrapper(callback, frameWrapper); return handler->GetAuthCredentials( @@ -618,7 +618,7 @@ namespace CefSharp // Context menu params CefContextMenuParamsWrapper contextMenuParamsWrapper(params); - CefFrameWrapper frameWrapper(frame, _browserAdapter); + CefFrameWrapper frameWrapper(frame); auto result = handler->OnBeforeContextMenu(_browserControl, %frameWrapper, %contextMenuParamsWrapper); if (!result) { diff --git a/CefSharp.Core/ManagedCefBrowserAdapter.cpp b/CefSharp.Core/ManagedCefBrowserAdapter.cpp index 246f03375c..298649bd70 100644 --- a/CefSharp.Core/ManagedCefBrowserAdapter.cpp +++ b/CefSharp.Core/ManagedCefBrowserAdapter.cpp @@ -54,7 +54,7 @@ void ManagedCefBrowserAdapter::OnAfterBrowserCreated(int browserId) auto browser = _clientAdapter->GetCefBrowser(); if (browser != nullptr) { - _browserWrapper = gcnew CefSharpBrowserWrapper(browser, this); + _browserWrapper = gcnew CefSharpBrowserWrapper(browser); } if (_webBrowserInternal != nullptr) @@ -459,7 +459,7 @@ IFrame^ ManagedCefBrowserAdapter::GetMainFrame() { return nullptr; } - return gcnew CefFrameWrapper(browser->GetMainFrame(), this); + return gcnew CefFrameWrapper(browser->GetMainFrame()); } /// @@ -474,7 +474,7 @@ IFrame^ ManagedCefBrowserAdapter::GetFocusedFrame() return nullptr; } - return gcnew CefFrameWrapper(browser->GetFocusedFrame(), this); + return gcnew CefFrameWrapper(browser->GetFocusedFrame()); } /// @@ -494,7 +494,7 @@ IFrame^ ManagedCefBrowserAdapter::GetFrame(System::Int64 identifier) return nullptr; } - return gcnew CefFrameWrapper(result, this); + return gcnew CefFrameWrapper(result); } /// @@ -514,7 +514,7 @@ IFrame^ ManagedCefBrowserAdapter::GetFrame(String^ name) return nullptr; } - return gcnew CefFrameWrapper(result, this); + return gcnew CefFrameWrapper(result); } /// diff --git a/CefSharp.Core/SchemeHandlerFactoryWrapper.h b/CefSharp.Core/SchemeHandlerFactoryWrapper.h index 6edef9f812..b728b4942d 100644 --- a/CefSharp.Core/SchemeHandlerFactoryWrapper.h +++ b/CefSharp.Core/SchemeHandlerFactoryWrapper.h @@ -32,8 +32,8 @@ namespace CefSharp // NOTE: NOT supplying a browser adapter here means they currently // can't issue a JavaScript ExecuteScriptAsync call from any IFrame generated via browserWrapper // and IFrame itself. - auto browserWrapper = gcnew CefSharpBrowserWrapper(browser, nullptr); - auto frameWrapper = gcnew CefFrameWrapper(frame, nullptr); + auto browserWrapper = gcnew CefSharpBrowserWrapper(browser); + auto frameWrapper = gcnew CefFrameWrapper(frame); auto requestWrapper = gcnew CefRequestWrapper(request); auto handler = _factory->Create(browserWrapper, frameWrapper, StringUtils::ToClr(schemeName), requestWrapper); diff --git a/CefSharp/WebBrowserExtensions.cs b/CefSharp/WebBrowserExtensions.cs index ebc25c17bf..dafe1c10fe 100644 --- a/CefSharp/WebBrowserExtensions.cs +++ b/CefSharp/WebBrowserExtensions.cs @@ -545,11 +545,6 @@ public static Task EvaluateScriptAsync(this IWebBrowser brow throw new ArgumentOutOfRangeException("timeout", "Timeout greater than Maximum allowable value of " + UInt32.MaxValue); } - if (!CefSharpSettings.WcfEnabled) - { - throw new InvalidOperationException("To wait for javascript code set WcfEnabled true in CefSettings during initialization."); - } - using (var frame = browser.GetMainFrame()) { ThrowExceptionIfFrameNull(frame); From 192f6e7783ddcb6a317a49cd17be5f2d9ce16dda Mon Sep 17 00:00:00 2001 From: amaitland Date: Mon, 29 Jun 2015 14:04:08 +1000 Subject: [PATCH 15/19] Make FindBrowserWrapper public - preferable to using friend which --- CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h index bfeae18259..4a383478af 100644 --- a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h +++ b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h @@ -14,24 +14,19 @@ #include "../CefSharp.Core/Internals/Messaging/ProcessMessageDelegate.h" using namespace System::Collections::Generic; +using namespace CefSharp::Internals::Messaging; 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^> _onBrowserCreated; gcroot^> _onBrowserDestroyed; gcroot^> _browserWrappers; - - CefBrowserWrapper^ FindBrowserWrapper(int browserId, bool mustExist); public: CefAppUnmanagedWrapper(Action^ onBrowserCreated, Action^ onBrowserDestoryed) @@ -51,6 +46,8 @@ namespace CefSharp delete _onBrowserDestroyed; } + CefBrowserWrapper^ FindBrowserWrapper(int browserId, bool mustExist); + virtual DECL CefRefPtr GetRenderProcessHandler() OVERRIDE; virtual DECL void OnBrowserCreated(CefRefPtr browser) OVERRIDE; virtual DECL void OnBrowserDestroyed(CefRefPtr browser) OVERRIDE; From 02ddbd702ba7b397ed600cacaa4f929f79156dce Mon Sep 17 00:00:00 2001 From: amaitland Date: Mon, 29 Jun 2015 14:08:24 +1000 Subject: [PATCH 16/19] Change GetWrapped to Browser - consistent with other code e.g. cefframewrapper --- CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.cpp | 2 +- CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.h | 5 ++++- .../Messaging/EvaluateScriptDelegate.cpp | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.cpp b/CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.cpp index 11f4172c38..3ecdff6574 100644 --- a/CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.cpp +++ b/CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.cpp @@ -41,7 +41,7 @@ namespace CefSharp _callbackRegistry->Deregister(id); } - CefRefPtr CefBrowserWrapper::GetWrapped() + CefRefPtr CefBrowserWrapper::Browser::get() { return _cefBrowser.get(); } diff --git a/CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.h b/CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.h index 832d7d0909..ee73c9df32 100644 --- a/CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.h +++ b/CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.h @@ -32,7 +32,10 @@ namespace CefSharp internal: //used by EvaluateScriptDelegate - CefRefPtr GetWrapped(); + property CefRefPtr Browser + { + CefRefPtr get(); + } property JavascriptCallbackRegistry^ CallbackRegistry { diff --git a/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp b/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp index 5221ab00bb..f3d3f90d19 100644 --- a/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp +++ b/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp @@ -37,7 +37,7 @@ namespace CefSharp auto script = argList->GetString(3); auto browserWrapper = _appUnmanagedWrapper->FindBrowserWrapper(browserId, true); - auto browser = browserWrapper->GetWrapped(); + auto browser = browserWrapper->Browser; auto frame = browser->GetFrame(frameId); if (browser.get() && frame.get()) { From ddd7ec168794c7aba0e6d5e6b6af08595e3551ec Mon Sep 17 00:00:00 2001 From: amaitland Date: Mon, 29 Jun 2015 14:14:12 +1000 Subject: [PATCH 17/19] Cleanup usings --- CefSharp/Internals/IBrowserAdapter.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/CefSharp/Internals/IBrowserAdapter.cs b/CefSharp/Internals/IBrowserAdapter.cs index c9c651d0e3..1dda9138cb 100644 --- a/CefSharp/Internals/IBrowserAdapter.cs +++ b/CefSharp/Internals/IBrowserAdapter.cs @@ -2,9 +2,6 @@ // // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. -using System; -using System.Threading.Tasks; - namespace CefSharp.Internals { /// From 7090ac9cda3b375953ce5cb581e4323e1b4df578 Mon Sep 17 00:00:00 2001 From: amaitland Date: Mon, 29 Jun 2015 15:08:53 +1000 Subject: [PATCH 18/19] For now simplify message handing - remove delegates Will look at implementing a managed class to handle/route messages later --- .../CefAppUnmanagedWrapper.cpp | 67 +++++++++++++- .../CefAppUnmanagedWrapper.h | 7 -- .../CefSharp.BrowserSubprocess.Core.vcxproj | 2 - ...arp.BrowserSubprocess.Core.vcxproj.filters | 6 -- .../Messaging/EvaluateScriptDelegate.cpp | 90 ------------------- .../Messaging/EvaluateScriptDelegate.h | 30 ------- CefSharp.Core/CefSharp.Core.vcxproj | 3 - CefSharp.Core/CefSharp.Core.vcxproj.filters | 9 -- CefSharp.Core/Internals/ClientAdapter.cpp | 58 +++++++++--- CefSharp.Core/Internals/ClientAdapter.h | 12 +-- .../Messaging/EvaluateScriptDoneDelegate.cpp | 80 ----------------- .../Messaging/EvaluateScriptDoneDelegate.h | 30 ------- .../Messaging/ProcessMessageDelegate.h | 32 ------- 13 files changed, 112 insertions(+), 314 deletions(-) delete mode 100644 CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp delete mode 100644 CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.h delete mode 100644 CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp delete mode 100644 CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.h delete mode 100644 CefSharp.Core/Internals/Messaging/ProcessMessageDelegate.h diff --git a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp index dae6fa26cb..f97c7e7215 100644 --- a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp +++ b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp @@ -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 { @@ -84,11 +89,65 @@ namespace CefSharp bool CefAppUnmanagedWrapper::OnProcessMessageReceived(CefRefPtr browser, CefProcessId sourceProcessId, CefRefPtr 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, sourceProcessId, 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) + { + //TODO: Re-add lookup + } + + auto browserWrapper = FindBrowserWrapper(browserId, true); + auto frame = browser->GetFrame(frameId); + if (frame.get()) + { + auto context = frame->GetV8Context(); + + if (context.get() && context->Enter()) + { + try + { + CefRefPtr result; + CefRefPtr 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; diff --git a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h index 4a383478af..c04091d44d 100644 --- a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h +++ b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h @@ -10,11 +10,8 @@ #include "include/cef_base.h" #include "CefBrowserWrapper.h" -#include "Messaging/EvaluateScriptDelegate.h" -#include "../CefSharp.Core/Internals/Messaging/ProcessMessageDelegate.h" using namespace System::Collections::Generic; -using namespace CefSharp::Internals::Messaging; namespace CefSharp { @@ -22,7 +19,6 @@ namespace CefSharp private class CefAppUnmanagedWrapper : CefApp, CefRenderProcessHandler { private: - ProcessMessageDelegateSet _processMessageDelegates; gcroot^> _onBrowserCreated; gcroot^> _onBrowserDestroyed; @@ -34,9 +30,6 @@ namespace CefSharp _onBrowserCreated = onBrowserCreated; _onBrowserDestroyed = onBrowserDestoryed; _browserWrappers = gcnew Dictionary(); - - //Register evaluate script request handler - _processMessageDelegates.insert(new EvaluateScriptDelegate(this)); } ~CefAppUnmanagedWrapper() diff --git a/CefSharp.BrowserSubprocess.Core/CefSharp.BrowserSubprocess.Core.vcxproj b/CefSharp.BrowserSubprocess.Core/CefSharp.BrowserSubprocess.Core.vcxproj index 35bfc0f7d8..3c11f2d64c 100644 --- a/CefSharp.BrowserSubprocess.Core/CefSharp.BrowserSubprocess.Core.vcxproj +++ b/CefSharp.BrowserSubprocess.Core/CefSharp.BrowserSubprocess.Core.vcxproj @@ -162,7 +162,6 @@ - @@ -183,7 +182,6 @@ - diff --git a/CefSharp.BrowserSubprocess.Core/CefSharp.BrowserSubprocess.Core.vcxproj.filters b/CefSharp.BrowserSubprocess.Core/CefSharp.BrowserSubprocess.Core.vcxproj.filters index 0958c2a4e3..5c744c4a0f 100644 --- a/CefSharp.BrowserSubprocess.Core/CefSharp.BrowserSubprocess.Core.vcxproj.filters +++ b/CefSharp.BrowserSubprocess.Core/CefSharp.BrowserSubprocess.Core.vcxproj.filters @@ -74,9 +74,6 @@ Header Files - - Header Files - @@ -127,9 +124,6 @@ Source Files - - Source Files - diff --git a/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp b/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp deleted file mode 100644 index f3d3f90d19..0000000000 --- a/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.cpp +++ /dev/null @@ -1,90 +0,0 @@ -// 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" - -using namespace CefSharp::Internals::Serialization; - -namespace CefSharp -{ - namespace Internals - { - namespace Messaging - { - EvaluateScriptDelegate::EvaluateScriptDelegate(CefRefPtr appUnmanagedWrapper) - :_appUnmanagedWrapper(appUnmanagedWrapper) - { - - } - - bool EvaluateScriptDelegate::OnProcessMessageReceived(CefRefPtr browser, CefProcessId sourceProcessId, CefRefPtr message) - { - auto handled = false; - auto name = message->GetName(); - if (name == kEvaluateJavascriptRequest) - { - auto argList = message->GetArgumentList(); - auto browserId = argList->GetInt(0); - auto frameId = GetInt64(argList, 1); - auto callbackId = GetInt64(argList, 2); - auto script = argList->GetString(3); - - auto browserWrapper = _appUnmanagedWrapper->FindBrowserWrapper(browserId, true); - auto browser = browserWrapper->Browser; - auto frame = browser->GetFrame(frameId); - if (browser.get() && frame.get()) - { - auto context = frame->GetV8Context(); - - if (context.get() && context->Enter()) - { - try - { - CefRefPtr result; - CefRefPtr 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; - } - } - } -} \ No newline at end of file diff --git a/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.h b/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.h deleted file mode 100644 index 264d9859c0..0000000000 --- a/CefSharp.BrowserSubprocess.Core/Messaging/EvaluateScriptDelegate.h +++ /dev/null @@ -1,30 +0,0 @@ -// 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 _appUnmanagedWrapper; - public: - EvaluateScriptDelegate(CefRefPtr appUnmanagedWrapper); - virtual bool OnProcessMessageReceived(CefRefPtr browser, CefProcessId sourceProcessId, CefRefPtr message) override; - }; - } - } -} \ No newline at end of file diff --git a/CefSharp.Core/CefSharp.Core.vcxproj b/CefSharp.Core/CefSharp.Core.vcxproj index d48771ed26..4859ba5e43 100644 --- a/CefSharp.Core/CefSharp.Core.vcxproj +++ b/CefSharp.Core/CefSharp.Core.vcxproj @@ -219,7 +219,6 @@ - @@ -246,7 +245,6 @@ - @@ -282,7 +280,6 @@ - diff --git a/CefSharp.Core/CefSharp.Core.vcxproj.filters b/CefSharp.Core/CefSharp.Core.vcxproj.filters index 5348e7be72..5bb8eb369a 100644 --- a/CefSharp.Core/CefSharp.Core.vcxproj.filters +++ b/CefSharp.Core/CefSharp.Core.vcxproj.filters @@ -65,9 +65,6 @@ Source Files - - Source Files - @@ -196,15 +193,9 @@ Header Files - - Header Files - Header Files - - Header Files - diff --git a/CefSharp.Core/Internals/ClientAdapter.cpp b/CefSharp.Core/Internals/ClientAdapter.cpp index 3af45dee83..fede990d96 100644 --- a/CefSharp.Core/Internals/ClientAdapter.cpp +++ b/CefSharp.Core/Internals/ClientAdapter.cpp @@ -18,6 +18,12 @@ #include "CefAuthCallbackWrapper.h" #include "CefJSDialogCallbackWrapper.h" #include "CefRequestCallbackWrapper.h" +#include "Serialization\Primitives.h" +#include "Serialization\V8Serialization.h" +#include "Messaging\Messages.h" + +using namespace CefSharp::Internals::Messaging; +using namespace CefSharp::Internals::Serialization; namespace CefSharp { @@ -805,11 +811,36 @@ namespace CefSharp bool ClientAdapter::OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message) { - bool handled = false; - - for (ProcessMessageDelegateSet::iterator it = _processMessageDelegates.begin(); it != _processMessageDelegates.end() && !handled; it++) + auto handled = false; + auto name = message->GetName(); + if (name == kEvaluateJavascriptResponse) { - handled = (*it)->OnProcessMessageReceived(browser, source_process, message); + auto argList = message->GetArgumentList(); + auto success = argList->GetBool(0); + auto callbackId = GetInt64(argList, 1); + + IJavascriptCallbackFactory^ callbackFactory; + _javascriptCallbackFactories->TryGetValue(browser->GetIdentifier(), callbackFactory); + + auto pendingTask = _pendingTaskRepository->RemovePendingTask(callbackId); + if (pendingTask != nullptr) + { + auto response = gcnew JavascriptResponse(); + response->Success = success; + + if (success) + { + response->Result = DeserializeV8Object(argList, 2, callbackFactory); + } + else + { + response->Message = StringUtils::ToClr(argList->GetString(2)); + } + + pendingTask->SetResult(response); + } + + handled = true; } return handled; @@ -817,12 +848,19 @@ namespace CefSharp Task^ ClientAdapter::EvaluateScriptAsync(int browserId, int64 frameId, String^ script, Nullable timeout) { - Task^ result = nullptr; - if (_cefBrowser.get()) - { - result = _evalScriptDoneDelegate->EvaluateScriptAsync(_cefBrowser, browserId, frameId, script, timeout); - } - return result; + //create a new taskcompletionsource + auto idAndComplectionSource = _pendingTaskRepository->CreatePendingTask(timeout); + + auto message = CefProcessMessage::Create(kEvaluateJavascriptRequest); + auto argList = message->GetArgumentList(); + argList->SetInt(0, browserId); + SetInt64(frameId, argList, 1); + SetInt64(idAndComplectionSource.Key, argList, 2); + argList->SetString(3, StringUtils::ToNative(script)); + + _cefBrowser->SendProcessMessage(CefProcessId::PID_RENDERER, message); + + return idAndComplectionSource.Value->Task; } } } diff --git a/CefSharp.Core/Internals/ClientAdapter.h b/CefSharp.Core/Internals/ClientAdapter.h index 710fb3c5d7..4985591dae 100644 --- a/CefSharp.Core/Internals/ClientAdapter.h +++ b/CefSharp.Core/Internals/ClientAdapter.h @@ -10,8 +10,6 @@ #include "include/cef_client.h" #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; @@ -19,8 +17,6 @@ namespace CefSharp { namespace Internals { - using namespace Messaging; - private class ClientAdapter : public CefClient, public CefLifeSpanHandler, public CefLoadHandler, @@ -39,10 +35,7 @@ namespace CefSharp gcroot _browserControl; HWND _browserHwnd; CefRefPtr _cefBrowser; - //eval script handler - CefRefPtr _evalScriptDoneDelegate; - ProcessMessageDelegateSet _processMessageDelegates; gcroot^> _popupBrowsers; gcroot _tooltip; gcroot _browserAdapter; @@ -66,10 +59,7 @@ namespace CefSharp _javascriptCallbackFactories(gcnew Dictionary()), _browserAdapter(browserAdapter) { - //create eval script message handler - _evalScriptDoneDelegate = new EvaluateScriptDoneDelegate(_pendingTaskRepository, _javascriptCallbackFactories); - - _processMessageDelegates.insert(_evalScriptDoneDelegate); + } ~ClientAdapter() diff --git a/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp b/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp deleted file mode 100644 index 5d029b08e2..0000000000 --- a/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.cpp +++ /dev/null @@ -1,80 +0,0 @@ -// 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. - -#include "Stdafx.h" -#include "Messages.h" -#include "../Serialization/Primitives.h" -#include "../Serialization/V8Serialization.h" -#include "EvaluateScriptDoneDelegate.h" - -using namespace CefSharp::Internals::Serialization; - -namespace CefSharp -{ - namespace Internals - { - namespace Messaging - { - EvaluateScriptDoneDelegate::EvaluateScriptDoneDelegate(PendingTaskRepository^ pendingTasks, Dictionary^ callbackFactories) - :_pendingTasks(pendingTasks), _callbackFactories(callbackFactories) - { - - } - - Task^ EvaluateScriptDoneDelegate::EvaluateScriptAsync(CefRefPtr cefBrowser, int browserId, int64 frameId, String^ script, Nullable timeout) - { - //create a new taskcompletionsource - auto idAndComplectionSource = _pendingTasks->CreatePendingTask(timeout); - - auto message = CefProcessMessage::Create(kEvaluateJavascriptRequest); - auto argList = message->GetArgumentList(); - argList->SetInt(0, browserId); - SetInt64(frameId, argList, 1); - SetInt64(idAndComplectionSource.Key, argList, 2); - argList->SetString(3, StringUtils::ToNative(script)); - - cefBrowser->SendProcessMessage(CefProcessId::PID_RENDERER, message); - - return idAndComplectionSource.Value->Task; - } - - bool EvaluateScriptDoneDelegate::OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message) - { - auto handled = false; - auto name = message->GetName(); - if (name == kEvaluateJavascriptResponse) - { - auto argList = message->GetArgumentList(); - auto success = argList->GetBool(0); - auto callbackId = GetInt64(argList, 1); - - IJavascriptCallbackFactory^ callbackFactory; - _callbackFactories->TryGetValue(browser->GetIdentifier(), callbackFactory); - - auto pendingTask = _pendingTasks->RemovePendingTask(callbackId); - if (pendingTask != nullptr) - { - auto response = gcnew JavascriptResponse(); - response->Success = success; - - if (success) - { - response->Result = DeserializeV8Object(argList, 2, callbackFactory); - } - else - { - response->Message = StringUtils::ToClr(argList->GetString(2)); - } - - pendingTask->SetResult(response); - } - - handled = true; - } - - return handled; - } - } - } -} \ No newline at end of file diff --git a/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.h b/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.h deleted file mode 100644 index 25e17bcb1f..0000000000 --- a/CefSharp.Core/Internals/Messaging/EvaluateScriptDoneDelegate.h +++ /dev/null @@ -1,30 +0,0 @@ -// 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 "ProcessMessageDelegate.h" - -namespace CefSharp -{ - namespace Internals - { - namespace Messaging - { - //This class will handle result messages of eval script calls - class EvaluateScriptDoneDelegate : public ProcessMessageDelegate - { - private: - DISALLOW_IMPLICIT_CONSTRUCTORS(EvaluateScriptDoneDelegate); - - gcroot^> _callbackFactories; - gcroot^> _pendingTasks; - public: - EvaluateScriptDoneDelegate(PendingTaskRepository^ pendingTasks, Dictionary^ callbackFactories); - Task^ EvaluateScriptAsync(CefRefPtr cefBrowser, int browserId, int64 frameId, String^ script, Nullable timeout); - virtual bool OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message) override; - }; - } - } -} \ No newline at end of file diff --git a/CefSharp.Core/Internals/Messaging/ProcessMessageDelegate.h b/CefSharp.Core/Internals/Messaging/ProcessMessageDelegate.h deleted file mode 100644 index 5e0fb347e4..0000000000 --- a/CefSharp.Core/Internals/Messaging/ProcessMessageDelegate.h +++ /dev/null @@ -1,32 +0,0 @@ -// 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 From 81a220275356525ec8064b49c4ffd854f9b78edf Mon Sep 17 00:00:00 2001 From: amaitland Date: Mon, 29 Jun 2015 15:35:30 +1000 Subject: [PATCH 19/19] Throw exception if browser Id's don't match Use the provided browser object rather than get the wrapped one - should be the same --- CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp | 2 +- CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.cpp | 5 ----- CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.h | 6 ------ 3 files changed, 1 insertion(+), 12 deletions(-) diff --git a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp index f97c7e7215..8f9606f00f 100644 --- a/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp +++ b/CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp @@ -101,7 +101,7 @@ namespace CefSharp if(browser->GetIdentifier() != browserId) { - //TODO: Re-add lookup + throw gcnew InvalidOperationException(String::Format("Request BrowserId : {0} does not match browser Id : {1}", browserId, browser->GetIdentifier())); } auto browserWrapper = FindBrowserWrapper(browserId, true); diff --git a/CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.cpp b/CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.cpp index 3ecdff6574..f89b213e16 100644 --- a/CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.cpp +++ b/CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.cpp @@ -41,11 +41,6 @@ namespace CefSharp _callbackRegistry->Deregister(id); } - CefRefPtr CefBrowserWrapper::Browser::get() - { - return _cefBrowser.get(); - } - JavascriptCallbackRegistry^ CefBrowserWrapper::CallbackRegistry::get() { return _callbackRegistry; diff --git a/CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.h b/CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.h index ee73c9df32..9c20cd855c 100644 --- a/CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.h +++ b/CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.h @@ -31,12 +31,6 @@ namespace CefSharp JavascriptRootObjectWrapper^ _javascriptRootObjectWrapper; internal: - //used by EvaluateScriptDelegate - property CefRefPtr Browser - { - CefRefPtr get(); - } - property JavascriptCallbackRegistry^ CallbackRegistry { CefSharp::Internals::JavascriptCallbackRegistry^ get();