Skip to content

Commit 60f2316

Browse files
committed
Dispose browser
1 parent 676e571 commit 60f2316

File tree

5 files changed

+58
-14
lines changed

5 files changed

+58
-14
lines changed

lib/PuppeteerSharp.Tests/Puppeteer/PuppeteerLaunch.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public async Task should_support_ignoreHTTPSErrors_option()
4040
var response = await page.GoToAsync(HttpsPrefix + "/empty.html");
4141
Assert.Equal(response.Status.ToString(), "OK");
4242

43-
browser.Close();
43+
await browser.CloseAsync();
4444
}
4545
}
4646
}

lib/PuppeteerSharp/Browser.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,10 @@ public async Task<string> GetVersionAsync()
8080
return version.product.ToString();
8181
}
8282

83-
public void Close()
83+
public async Task CloseAsync()
8484
{
85+
await _closeCallBack();
86+
Connection.Dispose();
8587
Closed?.Invoke(this, new EventArgs());
8688
}
8789
#endregion
@@ -119,14 +121,17 @@ private void ChangeTargetInfo(MessageEventArgs args)
119121

120122
private void DestroyTarget(MessageEventArgs args)
121123
{
122-
if (!_targets.ContainsKey(args.MessageData.targetInfo.targetId.Value))
124+
if (!_targets.ContainsKey(args.MessageData.targetId.ToString()))
123125
{
124126
throw new InvalidTargetException("Target should exists before DestroyTarget");
125127
}
126128

127-
var target = _targets[args.MessageData.targetInfo.targetId.Value];
128-
target.InitilizedTaskWrapper.SetResult(false);
129-
_targets.Remove(args.MessageData.targetInfo.targetId.Value);
129+
var target = _targets[args.MessageData.targetId.ToString()];
130+
if (!target.InitilizedTaskWrapper.Task.IsCompleted)
131+
{
132+
target.InitilizedTaskWrapper.SetResult(false);
133+
}
134+
_targets.Remove(args.MessageData.targetId.ToString());
130135

131136
TargetDestroyed?.Invoke(this, new TargetChangedArgs()
132137
{

lib/PuppeteerSharp/Connection.cs

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
namespace PuppeteerSharp
1212
{
13-
public class Connection
13+
public class Connection : IDisposable
1414
{
1515
public Connection(string url, int delay, ClientWebSocket ws)
1616
{
@@ -20,6 +20,7 @@ public Connection(string url, int delay, ClientWebSocket ws)
2020

2121
_responses = new Dictionary<int, TaskCompletionSource<dynamic>>();
2222
_sessions = new Dictionary<string, Session>();
23+
_connectionCloseTask = new TaskCompletionSource<bool>();
2324

2425
Task task = Task.Factory.StartNew(async () =>
2526
{
@@ -32,7 +33,7 @@ public Connection(string url, int delay, ClientWebSocket ws)
3233
private Dictionary<int, TaskCompletionSource<dynamic>> _responses;
3334
private Dictionary<string, Session> _sessions;
3435
private bool _closed = false;
35-
36+
private TaskCompletionSource<bool> _connectionCloseTask;
3637
#endregion
3738

3839
#region Properties
@@ -80,10 +81,10 @@ public async Task<Session> CreateSession(string targetId)
8081
private void OnClose()
8182
{
8283
_closed = true;
83-
if (Closed != null)
84-
{
85-
Closed.Invoke(this, new EventArgs());
86-
}
84+
_connectionCloseTask.SetResult(true);
85+
86+
Closed?.Invoke(this, new EventArgs());
87+
8788
_responses.Clear();
8889
_sessions.Clear();
8990
}
@@ -109,7 +110,20 @@ private async Task<object> GetResponseAsync()
109110

110111
while (!endOfMessage)
111112
{
112-
var result = await WebSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
113+
var socketTask = WebSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
114+
115+
await Task.WhenAny(
116+
_connectionCloseTask.Task,
117+
socketTask
118+
);
119+
120+
if (_closed)
121+
{
122+
return null;
123+
}
124+
125+
var result = socketTask.Result;
126+
113127
endOfMessage = result.EndOfMessage;
114128

115129
if (result.MessageType == WebSocketMessageType.Text)
@@ -183,6 +197,12 @@ public static async Task<Connection> Create(string url, int delay = 0)
183197
return new Connection(url, delay, ws);
184198
}
185199

200+
public void Dispose()
201+
{
202+
OnClose();
203+
WebSocket.Dispose();
204+
}
205+
186206
#endregion
187207
}
188208
}

lib/PuppeteerSharp/Session.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,14 @@ internal void OnMessage(string message)
137137

138138
internal void Close()
139139
{
140-
throw new NotImplementedException();
140+
foreach (var callback in _callbacks.Values)
141+
{
142+
callback.TaskWrapper.SetException(new TargetClosedException(
143+
$"Protocol error({callback.Method}): Target closed."
144+
));
145+
}
146+
_callbacks.Clear();
147+
Connection = null;
141148
}
142149

143150
#endregion
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace PuppeteerSharp
5+
{
6+
internal class TargetClosedException : Exception
7+
{
8+
public TargetClosedException(string message) : base(message)
9+
{
10+
}
11+
}
12+
}

0 commit comments

Comments
 (0)