Skip to content

Commit 3e1add3

Browse files
authored
Wait for the page to close in the browser in page.close (#369)
1 parent 85259ff commit 3e1add3

File tree

4 files changed

+43
-25
lines changed

4 files changed

+43
-25
lines changed

lib/PuppeteerSharp.Tests/PageTests/CloseTests.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,14 @@ public async Task ShouldRejectAllPromisesWhenPageIsClosed()
2222

2323
Assert.Contains("Protocol error", exception.Message);
2424
}
25+
26+
[Fact]
27+
public async Task ShouldNotBeVisibleInBrowserPages()
28+
{
29+
var newPage = await Browser.NewPageAsync();
30+
Assert.Contains(newPage, await Browser.PagesAsync());
31+
await newPage.CloseAsync();
32+
Assert.DoesNotContain(newPage, await Browser.PagesAsync());
33+
}
2534
}
26-
}
35+
}

lib/PuppeteerSharp/Browser.cs

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,10 @@ public Browser(Connection connection, IBrowserOptions options, Process process,
136136
/// <returns>Task which resolves to a new <see cref="Page"/> object</returns>
137137
public async Task<Page> NewPageAsync()
138138
{
139-
string targetId = (await Connection.SendAsync("Target.createTarget", new Dictionary<string, object>(){
139+
string targetId = (await Connection.SendAsync("Target.createTarget", new Dictionary<string, object>
140+
{
140141
{"url", "about:blank"}
141-
})).targetId.ToString();
142+
})).targetId.ToString();
142143

143144
var target = _targets[targetId];
144145
await target.InitializedTask;
@@ -231,11 +232,11 @@ private async void Connect_MessageReceived(object sender, MessageEventArgs e)
231232
switch (e.MessageID)
232233
{
233234
case "Target.targetCreated":
234-
await CreateTarget(e.MessageData.ToObject<TargetCreatedResponse>());
235+
await CreateTargetAsync(e.MessageData.ToObject<TargetCreatedResponse>());
235236
return;
236237

237238
case "Target.targetDestroyed":
238-
DestroyTarget(e.MessageData.ToObject<TargetDestroyedResponse>());
239+
await DestroyTargetAsync(e.MessageData.ToObject<TargetDestroyedResponse>());
239240
return;
240241

241242
case "Target.targetInfoChanged":
@@ -250,32 +251,35 @@ private void ChangeTargetInfo(TargetCreatedResponse e)
250251
{
251252
throw new InvalidTargetException("Target should exists before ChangeTargetInfo");
252253
}
253-
254+
254255
var target = _targets[e.TargetInfo.TargetId];
255256
target.TargetInfoChanged(e.TargetInfo);
256257
}
257258

258-
private void DestroyTarget(TargetDestroyedResponse e)
259+
private async Task DestroyTargetAsync(TargetDestroyedResponse e)
259260
{
260261
if (!_targets.ContainsKey(e.TargetId))
261262
{
262263
throw new InvalidTargetException("Target should exists before DestroyTarget");
263264
}
264265

265266
var target = _targets[e.TargetId];
266-
if (!target.InitilizedTaskWrapper.Task.IsCompleted)
267-
{
268-
target.InitilizedTaskWrapper.SetResult(false);
269-
}
270267
_targets.Remove(e.TargetId);
271268

272-
TargetDestroyed?.Invoke(this, new TargetChangedArgs()
269+
if (!target.CloseTaskWrapper.Task.IsCompleted)
273270
{
274-
Target = target
275-
});
271+
target.CloseTaskWrapper.SetResult(true);
272+
}
273+
if (await target.InitializedTask)
274+
{
275+
TargetDestroyed?.Invoke(this, new TargetChangedArgs()
276+
{
277+
Target = target
278+
});
279+
}
276280
}
277281

278-
private async Task CreateTarget(TargetCreatedResponse e)
282+
private async Task CreateTargetAsync(TargetCreatedResponse e)
279283
{
280284
var target = new Target(this, e.TargetInfo);
281285
_targets[e.TargetInfo.TargetId] = target;
@@ -290,7 +294,10 @@ private async Task CreateTarget(TargetCreatedResponse e)
290294
}
291295

292296
internal static async Task<Browser> CreateAsync(
293-
Connection connection, IBrowserOptions options, Process process, Func<Task> closeCallBack)
297+
Connection connection,
298+
IBrowserOptions options,
299+
Process process,
300+
Func<Task> closeCallBack)
294301
{
295302
var browser = new Browser(connection, options, process, closeCallBack);
296303
await connection.SendAsync("Target.setDiscoverTargets", new
@@ -311,4 +318,4 @@ public void Dispose()
311318
}
312319
#endregion
313320
}
314-
}
321+
}

lib/PuppeteerSharp/Page.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -981,17 +981,17 @@ public async Task<byte[]> ScreenshotDataAsync(ScreenshotOptions options)
981981
/// Closes the page.
982982
/// </summary>
983983
/// <returns>Task.</returns>
984-
public Task CloseAsync()
984+
public async Task CloseAsync()
985985
{
986986
if (!(Client?.Connection?.IsClosed ?? true))
987987
{
988-
return Client.Connection.SendAsync("Target.closeTarget", new
988+
await Client.Connection.SendAsync("Target.closeTarget", new
989989
{
990990
targetId = Target.TargetId
991991
});
992-
}
993992

994-
return Task.CompletedTask;
993+
await Target.CloseTask;
994+
}
995995
}
996996

997997
/// <summary>
@@ -1525,7 +1525,7 @@ private decimal ConvertPrintParameterToInches(object parameter)
15251525
valueText = text;
15261526
}
15271527

1528-
if (Decimal.TryParse(valueText, NumberStyles.Any, CultureInfo.InvariantCulture.NumberFormat, out var number))
1528+
if (decimal.TryParse(valueText, NumberStyles.Any, CultureInfo.InvariantCulture.NumberFormat, out var number))
15291529
{
15301530
pixels = number * _unitToPixels[unit];
15311531
}
@@ -1750,8 +1750,7 @@ private static string EvaluationString(string fun, params object[] args)
17501750

17511751
string SerializeArgument(object arg)
17521752
{
1753-
if (arg == null) return "undefined";
1754-
return JsonConvert.SerializeObject(arg);
1753+
return arg == null ? "undefined" : JsonConvert.SerializeObject(arg);
17551754
}
17561755
}
17571756
#endregion

lib/PuppeteerSharp/Target.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ internal Target(Browser browser, TargetInfo targetInfo)
2323
_targetInfo = targetInfo;
2424

2525
InitilizedTaskWrapper = new TaskCompletionSource<bool>();
26+
CloseTaskWrapper = new TaskCompletionSource<bool>();
2627
IsInitialized = _targetInfo.Type != "page" || _targetInfo.Url != string.Empty;
2728

2829
if (IsInitialized)
@@ -49,6 +50,8 @@ internal Target(Browser browser, TargetInfo targetInfo)
4950
public string TargetId => _targetInfo.TargetId;
5051
internal Task<bool> InitializedTask => InitilizedTaskWrapper.Task;
5152
internal TaskCompletionSource<bool> InitilizedTaskWrapper { get; }
53+
internal Task<bool> CloseTask => CloseTaskWrapper.Task;
54+
internal TaskCompletionSource<bool> CloseTaskWrapper { get; }
5255
#endregion
5356

5457
/// <summary>
@@ -91,4 +94,4 @@ internal void TargetInfoChanged(TargetInfo targetInfo)
9194
/// <returns>A task that returns a <see cref="CDPSession"/></returns>
9295
public Task<CDPSession> CreateCDPSessionAsync() => _browser.Connection.CreateSessionAsync(TargetId);
9396
}
94-
}
97+
}

0 commit comments

Comments
 (0)