Skip to content

Commit 953f1e2

Browse files
committed
fix event names for when there are more than one window, view or webcontent Id
1 parent fb99dbd commit 953f1e2

File tree

10 files changed

+168
-133
lines changed

10 files changed

+168
-133
lines changed

ElectronNET.API/BridgeConnector.cs

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ public static void Once<T>(string eventString, Action<T> fn)
153153

154154
public static async Task<T> OnResult<T>(string triggerEvent, string completedEvent, params object[] args)
155155
{
156-
string eventKey = triggerEvent;
156+
string eventKey = completedEvent;
157157

158158
if (args is object && args.Length > 0) // If there are arguments passed, we generate a unique event key with the arguments
159159
// this allow us to wait for previous events first before registering new ones
@@ -166,7 +166,7 @@ public static async Task<T> OnResult<T>(string triggerEvent, string completedEve
166166
eventKey = $"{eventKey}-{(uint)hash.ToHashCode()}";
167167
}
168168

169-
if (EventTasks<T>.TryGetOrAdd(triggerEvent, eventKey, out var taskCompletionSource, out var waitThisFirstAndThenTryAgain))
169+
if (EventTasks<T>.TryGetOrAdd(completedEvent, eventKey, out var taskCompletionSource, out var waitThisFirstAndThenTryAgain))
170170
{
171171
if (waitThisFirstAndThenTryAgain is object)
172172
{
@@ -192,7 +192,7 @@ public static async Task<T> OnResult<T>(string triggerEvent, string completedEve
192192
{
193193
Off(completedEvent);
194194
taskCompletionSource.SetResult(result);
195-
EventTasks<T>.DoneWith(triggerEvent, eventKey, taskCompletionSource);
195+
EventTasks<T>.DoneWith(completedEvent, eventKey, taskCompletionSource);
196196
});
197197

198198
Emit(triggerEvent, args);
@@ -205,21 +205,56 @@ public static async Task<T> OnResult<T>(string triggerEvent, string completedEve
205205

206206
public static async Task<T> OnResult<T>(string triggerEvent, string completedEvent, CancellationToken cancellationToken, params object[] args)
207207
{
208-
var taskCompletionSource = new TaskCompletionSource<T>(TaskCreationOptions.RunContinuationsAsynchronously);
208+
string eventKey = completedEvent;
209209

210-
using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled()))
210+
if (args is object && args.Length > 0) // If there are arguments passed, we generate a unique event key with the arguments
211+
// this allow us to wait for previous events first before registering new ones
211212
{
213+
var hash = new HashCode();
214+
foreach (var obj in args)
215+
{
216+
hash.Add(obj);
217+
}
218+
eventKey = $"{eventKey}-{(uint)hash.ToHashCode()}";
219+
}
220+
221+
if (EventTasks<T>.TryGetOrAdd(completedEvent, eventKey, out var taskCompletionSource, out var waitThisFirstAndThenTryAgain))
222+
{
223+
if (waitThisFirstAndThenTryAgain is object)
224+
{
225+
//There was a pending call with different parameters, so we need to wait that first and then call here again
226+
try
227+
{
228+
await Task.Run(() => waitThisFirstAndThenTryAgain, cancellationToken);
229+
}
230+
catch
231+
{
232+
//Ignore any exceptions here so we can set a new event below
233+
//The exception will also be visible to the original first caller due to taskCompletionSource.Task
234+
}
212235

213-
On<T>(completedEvent, (result) =>
236+
//Try again to set the event
237+
return await OnResult<T>(triggerEvent, completedEvent, cancellationToken, args);
238+
}
239+
else
214240
{
215-
Off(completedEvent);
216-
taskCompletionSource.SetResult(result);
217-
});
241+
using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled()))
242+
{
243+
//A new TaskCompletionSource was added, so we need to register the completed event here
218244

219-
Emit(triggerEvent, args);
245+
On<T>(completedEvent, (result) =>
246+
{
247+
Off(completedEvent);
248+
taskCompletionSource.SetResult(result);
249+
EventTasks<T>.DoneWith(completedEvent, eventKey, taskCompletionSource);
250+
});
220251

221-
return await taskCompletionSource.Task.ConfigureAwait(false);
252+
Emit(triggerEvent, args);
253+
}
254+
}
222255
}
256+
257+
return await taskCompletionSource.Task;
223258
}
224259
private static SocketIO Socket
225260
{

ElectronNET.API/BrowserView.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public class BrowserView
3131
///
3232
/// (experimental)
3333
/// </summary>
34-
public Task<Rectangle> GetBoundsAsync() => BridgeConnector.OnResult<Rectangle>("browserView-getBounds", "browserView-getBounds-reply", Id);
34+
public Task<Rectangle> GetBoundsAsync() => BridgeConnector.OnResult<Rectangle>("browserView-getBounds", "browserView-getBounds-reply" + Id, Id);
3535

3636
public void SetBounds(Rectangle value)
3737
{

0 commit comments

Comments
 (0)