Skip to content

Commit 0d03855

Browse files
authored
Avoid unhandled exceptions on unawaited async path (#2289)
* Avoid unhandled exceptions on unawaited async path * Add "Async" suffix to Task returning methods
1 parent c44322d commit 0d03855

File tree

4 files changed

+30
-23
lines changed

4 files changed

+30
-23
lines changed

lib/PuppeteerSharp/ChromeTargetManager.cs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ private void StoreExistingTargetsForInit()
129129
}
130130
}
131131

132-
private async Task EnsureTargetsIdsForInit()
132+
private async Task EnsureTargetsIdsForInitAsync()
133133
{
134134
if (_targetDiscoveryTimeout > 0)
135135
{
@@ -160,7 +160,7 @@ private void OnMessageReceived(object sender, MessageEventArgs e)
160160
return;
161161

162162
case "Target.targetDestroyed":
163-
OnTargetDestroyed(e.MessageData.ToObject<TargetDestroyedResponse>(true));
163+
_ = OnTargetDestroyedAsync(e.MessageID, e.MessageData.ToObject<TargetDestroyedResponse>(true));
164164
return;
165165

166166
case "Target.targetInfoChanged":
@@ -198,15 +198,22 @@ private void OnTargetCreated(TargetCreatedResponse e)
198198
}
199199
}
200200

201-
private async void OnTargetDestroyed(TargetDestroyedResponse e)
201+
private async Task OnTargetDestroyedAsync(string messageId, TargetDestroyedResponse e)
202202
{
203-
_discoveredTargetsByTargetId.TryRemove(e.TargetId, out var targetInfo);
204-
await EnsureTargetsIdsForInit().ConfigureAwait(false);
205-
FinishInitializationIfReady(e.TargetId);
203+
try
204+
{
205+
_discoveredTargetsByTargetId.TryRemove(e.TargetId, out var targetInfo);
206+
await EnsureTargetsIdsForInitAsync().ConfigureAwait(false);
207+
FinishInitializationIfReady(e.TargetId);
206208

207-
if (targetInfo?.Type == TargetType.ServiceWorker && _availableTargetsByTargetIdDictionary.TryRemove(e.TargetId, out var target))
209+
if (targetInfo?.Type == TargetType.ServiceWorker && _availableTargetsByTargetIdDictionary.TryRemove(e.TargetId, out var target))
210+
{
211+
TargetGone?.Invoke(this, new TargetChangedArgs { Target = target, TargetInfo = targetInfo });
212+
}
213+
}
214+
catch (Exception ex)
208215
{
209-
TargetGone?.Invoke(this, new TargetChangedArgs { Target = target, TargetInfo = targetInfo });
216+
HandleExceptionOnMessageReceived(messageId, ex);
210217
}
211218
}
212219

@@ -224,7 +231,7 @@ private void OnTargetInfoChanged(TargetCreatedResponse e)
224231
TargetChanged?.Invoke(this, new TargetChangedArgs { Target = target, TargetInfo = e.TargetInfo });
225232
}
226233

227-
private async Task OnAttachedToTarget(object sender, TargetAttachedToTargetResponse e)
234+
private async Task OnAttachedToTargetAsync(object sender, TargetAttachedToTargetResponse e)
228235
{
229236
var parent = sender as ICDPConnection;
230237
var targetInfo = e.TargetInfo;
@@ -256,7 +263,7 @@ await parent.SendAsync(
256263
if (targetInfo.Type == TargetType.ServiceWorker &&
257264
_connection.IsAutoAttached(targetInfo.TargetId))
258265
{
259-
await EnsureTargetsIdsForInit().ConfigureAwait(false);
266+
await EnsureTargetsIdsForInitAsync().ConfigureAwait(false);
260267
FinishInitializationIfReady(targetInfo.TargetId);
261268
await SilentDetach().ConfigureAwait(false);
262269
if (_availableTargetsByTargetIdDictionary.ContainsKey(targetInfo.TargetId))
@@ -273,7 +280,7 @@ await parent.SendAsync(
273280
if (_targetFilterFunc?.Invoke(targetInfo) == false)
274281
{
275282
_ignoredTargets.Add(targetInfo.TargetId);
276-
await EnsureTargetsIdsForInit().ConfigureAwait(false);
283+
await EnsureTargetsIdsForInitAsync().ConfigureAwait(false);
277284
FinishInitializationIfReady(targetInfo.TargetId);
278285
await SilentDetach().ConfigureAwait(false);
279286
return;
@@ -311,7 +318,7 @@ await parent.SendAsync(
311318
}
312319
}
313320

314-
await EnsureTargetsIdsForInit().ConfigureAwait(false);
321+
await EnsureTargetsIdsForInitAsync().ConfigureAwait(false);
315322
_targetsIdsForInit.Remove(target.TargetId);
316323

317324
if (!existingTarget)
@@ -342,7 +349,7 @@ private async Task OnAttachedToTargetHandlingExceptionsAsync(object sender, stri
342349
{
343350
try
344351
{
345-
await OnAttachedToTarget(sender, e).ConfigureAwait(false);
352+
await OnAttachedToTargetAsync(sender, e).ConfigureAwait(false);
346353
}
347354
catch (Exception ex)
348355
{

lib/PuppeteerSharp/IsolatedWorld.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ private async void Client_MessageReceived(object sender, MessageEventArgs e)
448448
switch (e.MessageID)
449449
{
450450
case "Runtime.bindingCalled":
451-
await OnBindingCalled(e.MessageData.ToObject<BindingCalledResponse>(true)).ConfigureAwait(false);
451+
await OnBindingCalledAsync(e.MessageData.ToObject<BindingCalledResponse>(true)).ConfigureAwait(false);
452452
break;
453453
}
454454
}
@@ -460,7 +460,7 @@ private async void Client_MessageReceived(object sender, MessageEventArgs e)
460460
}
461461
}
462462

463-
private async Task OnBindingCalled(BindingCalledResponse e)
463+
private async Task OnBindingCalledAsync(BindingCalledResponse e)
464464
{
465465
var payload = e.BindingPayload;
466466

lib/PuppeteerSharp/Page.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -329,9 +329,9 @@ public Task<IJSHandle> QuerySelectorAllHandleAsync(string selector)
329329
=> MainFrame.QuerySelectorAllHandleAsync(selector);
330330

331331
/// <inheritdoc/>
332-
#pragma warning disable CS0618 // Using obsolets
332+
#pragma warning disable CS0618 // Using obsolets
333333
public Task<IElementHandle[]> XPathAsync(string expression) => MainFrame.XPathAsync(expression);
334-
#pragma warning restore CS0618
334+
#pragma warning restore CS0618
335335

336336
/// <inheritdoc/>
337337
public async Task<IJSHandle> EvaluateExpressionHandleAsync(string script)
@@ -784,10 +784,10 @@ public Task<IElementHandle> WaitForSelectorAsync(string selector, WaitForSelecto
784784
=> MainFrame.WaitForSelectorAsync(selector, options ?? new WaitForSelectorOptions());
785785

786786
/// <inheritdoc/>
787-
#pragma warning disable CS0618 // WaitForXPathAsync is obsolete
787+
#pragma warning disable CS0618 // WaitForXPathAsync is obsolete
788788
public Task<IElementHandle> WaitForXPathAsync(string xpath, WaitForSelectorOptions options = null)
789789
=> MainFrame.WaitForXPathAsync(xpath, options ?? new WaitForSelectorOptions());
790-
#pragma warning restore CS0618
790+
#pragma warning restore CS0618
791791

792792
/// <inheritdoc/>
793793
public Task<IResponse> WaitForNavigationAsync(NavigationOptions options = null)
@@ -1470,7 +1470,7 @@ private async void Client_MessageReceived(object sender, MessageEventArgs e)
14701470
await OnLogEntryAddedAsync(e.MessageData.ToObject<LogEntryAddedResponse>(true)).ConfigureAwait(false);
14711471
break;
14721472
case "Runtime.bindingCalled":
1473-
await OnBindingCalled(e.MessageData.ToObject<BindingCalledResponse>(true)).ConfigureAwait(false);
1473+
await OnBindingCalledAsync(e.MessageData.ToObject<BindingCalledResponse>(true)).ConfigureAwait(false);
14741474
break;
14751475
case "Page.fileChooserOpened":
14761476
await OnFileChooserAsync(e.MessageData.ToObject<PageFileChooserOpenedResponse>(true)).ConfigureAwait(false);
@@ -1519,7 +1519,7 @@ private async Task OnFileChooserAsync(PageFileChooserOpenedResponse e)
15191519
}
15201520
}
15211521

1522-
private async Task OnBindingCalled(BindingCalledResponse e)
1522+
private async Task OnBindingCalledAsync(BindingCalledResponse e)
15231523
{
15241524
if (e.BindingPayload.Type != "exposedFun" || !_bindings.ContainsKey(e.BindingPayload.Name))
15251525
{

lib/PuppeteerSharp/Worker.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ internal async void OnMessageReceived(object sender, MessageEventArgs e)
138138
OnExecutionContextCreated(e.MessageData.ToObject<RuntimeExecutionContextCreatedResponse>(true));
139139
break;
140140
case "Runtime.consoleAPICalled":
141-
await OnConsoleAPICalled(e).ConfigureAwait(false);
141+
await OnConsoleAPICalledAsync(e).ConfigureAwait(false);
142142
break;
143143
case "Runtime.exceptionThrown":
144144
OnExceptionThrown(e.MessageData.ToObject<RuntimeExceptionThrownResponse>(true));
@@ -155,7 +155,7 @@ internal async void OnMessageReceived(object sender, MessageEventArgs e)
155155

156156
private void OnExceptionThrown(RuntimeExceptionThrownResponse e) => _exceptionThrown(e.ExceptionDetails);
157157

158-
private async Task OnConsoleAPICalled(MessageEventArgs e)
158+
private async Task OnConsoleAPICalledAsync(MessageEventArgs e)
159159
{
160160
var consoleData = e.MessageData.ToObject<PageConsoleResponse>(true);
161161
await _consoleAPICalled(

0 commit comments

Comments
 (0)