Skip to content

Commit 898b843

Browse files
authored
DevTools - Add GetNextDevToolsMessageId to IBrowserHost (#3774)
1 parent d069714 commit 898b843

File tree

4 files changed

+18
-9
lines changed

4 files changed

+18
-9
lines changed

CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,11 @@ IRegistration^ CefBrowserHostWrapper::AddDevToolsMessageObserver(IDevToolsMessag
270270
return gcnew CefRegistrationWrapper(registration);
271271
}
272272

273+
int CefBrowserHostWrapper::GetNextDevToolsMessageId()
274+
{
275+
return Interlocked::Increment(_lastDevToolsMessageId);
276+
}
277+
273278
void CefBrowserHostWrapper::AddWordToDictionary(String^ word)
274279
{
275280
ThrowIfDisposed();

CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ namespace CefSharp
2121
{
2222
private:
2323
MCefRefPtr<CefBrowserHost> _browserHost;
24+
int _lastDevToolsMessageId = 0;
2425

2526
double GetZoomLevelOnUI();
2627

@@ -75,6 +76,7 @@ namespace CefSharp
7576
virtual int ExecuteDevToolsMethod(int messageId, String^ method, String^ paramsAsJson);
7677
virtual int ExecuteDevToolsMethod(int messageId, String^ method, IDictionary<String^, Object^>^ paramaters);
7778
virtual IRegistration^ AddDevToolsMessageObserver(IDevToolsMessageObserver^ observer);
79+
virtual int GetNextDevToolsMessageId();
7880

7981
virtual void AddWordToDictionary(String^ word);
8082
virtual void ReplaceMisspelling(String^ word);

CefSharp/DevTools/DevToolsClient.cs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,6 @@ namespace CefSharp.DevTools
1919
/// </summary>
2020
public partial class DevToolsClient : IDevToolsMessageObserver, IDevToolsClient
2121
{
22-
//TODO: Message Id is now global, limits the number of messages to int.MaxValue
23-
//Needs to be unique and incrementing per browser with the option to have multiple
24-
//DevToolsClient instances per browser.
25-
private static int lastMessageId = 0;
26-
2722
private readonly ConcurrentDictionary<int, DevToolsMethodResponseContext> queuedCommandResults = new ConcurrentDictionary<int, DevToolsMethodResponseContext>();
2823
private readonly ConcurrentDictionary<string, EventHandler<Stream>> eventHandlers = new ConcurrentDictionary<string, EventHandler<Stream>>();
2924
private IBrowser browser;
@@ -138,8 +133,6 @@ public Task<T> ExecuteDevToolsMethodAsync<T>(string method, IDictionary<string,
138133
throw new ObjectDisposedException(nameof(IBrowser));
139134
}
140135

141-
var messageId = Interlocked.Increment(ref lastMessageId);
142-
143136
var taskCompletionSource = new TaskCompletionSource<T>();
144137

145138
var methodResultContext = new DevToolsMethodResponseContext(
@@ -149,13 +142,15 @@ public Task<T> ExecuteDevToolsMethodAsync<T>(string method, IDictionary<string,
149142
syncContext: CaptureSyncContext ? SynchronizationContext.Current : SyncContext
150143
);
151144

145+
var browserHost = browser.GetHost();
146+
147+
var messageId = browserHost.GetNextDevToolsMessageId();
148+
152149
if (!queuedCommandResults.TryAdd(messageId, methodResultContext))
153150
{
154151
throw new DevToolsClientException(string.Format("Unable to add MessageId {0} to queuedCommandResults ConcurrentDictionary.", messageId));
155152
}
156153

157-
var browserHost = browser.GetHost();
158-
159154
//Currently on CEF UI Thread we can directly execute
160155
if (CefThread.CurrentlyOnUiThread)
161156
{

CefSharp/IBrowserHost.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,13 @@ public interface IBrowserHost : IDisposable
127127
/// successfully submitted for validation, otherwise 0</returns>
128128
int ExecuteDevToolsMethod(int messageId, string method, IDictionary<string, object> parameters = null);
129129

130+
/// <summary>
131+
/// Returns the next unique message id which can be used in <see cref="ExecuteDevToolsMethod(int, string, string)"/> or
132+
/// <see cref="ExecuteDevToolsMethod(int, string, IDictionary{string, object})"/>.
133+
/// </summary>
134+
/// <returns>The next unique message id.</returns>
135+
int GetNextDevToolsMessageId();
136+
130137
/// <summary>
131138
/// Add an observer for DevTools protocol messages (method results and events).
132139
/// The observer will remain registered until the returned Registration object

0 commit comments

Comments
 (0)