1
0
mirror of synced 2026-08-05 15:06:54 +00:00

chore: throw on context.close() if it was closed externally (#1248)

This is a backport of https://github.com/microsoft/playwright/commit/09ff7eaaf2ab40fcaf0abb85f0308a91e1460a97
This commit is contained in:
Yury Semikhatsky
2023-03-27 14:00:42 -07:00
committed by GitHub
parent 96d74ef678
commit bc50392220
3 changed files with 21 additions and 58 deletions
@@ -47,7 +47,8 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
private final APIRequestContextImpl request;
final List<PageImpl> pages = new ArrayList<>();
final Router routes = new Router();
private boolean isClosedOrClosing;
private boolean closeWasCalled;
private final WaitableEvent<EventType, ?> closePromise;
final Map<String, BindingCallback> bindings = new HashMap<>();
PageImpl ownerPage;
private static final Map<EventType, String> eventSubscriptions() {
@@ -90,8 +91,9 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
} else {
browser = null;
}
this.tracing = connection.getExistingObject(initializer.getAsJsonObject("tracing").get("guid").getAsString());
this.request = connection.getExistingObject(initializer.getAsJsonObject("requestContext").get("guid").getAsString());
tracing = connection.getExistingObject(initializer.getAsJsonObject("tracing").get("guid").getAsString());
request = connection.getExistingObject(initializer.getAsJsonObject("requestContext").get("guid").getAsString());
closePromise = new WaitableEvent<>(listeners, EventType.CLOSE);
}
void setRecordHar(Path path, HarContentPolicy policy) {
@@ -199,11 +201,8 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
}
private void closeImpl() {
if (isClosedOrClosing) {
return;
}
isClosedOrClosing = true;
try {
if (!closeWasCalled) {
closeWasCalled = true;
for (Map.Entry<String, HarRecorder> entry : harRecorders.entrySet()) {
JsonObject params = new JsonObject();
params.addProperty("harId", entry.getKey());
@@ -225,13 +224,9 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
}
artifact.delete();
}
sendMessage("close");
} catch (PlaywrightException e) {
if (!isSafeCloseError(e)) {
throw e;
}
}
runUntil(() -> {}, closePromise);
}
@Override
@@ -624,7 +619,6 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
}
void didClose() {
isClosedOrClosing = true;
if (browser != null) {
browser.contexts.remove(this);
}
@@ -511,19 +511,21 @@ public class PageImpl extends ChannelOwner implements Page {
@Override
public void close(CloseOptions options) {
if (isClosed) {
return;
if (options == null) {
options = new CloseOptions();
}
JsonObject params = options == null ? new JsonObject() : gson().toJsonTree(options).getAsJsonObject();
try {
sendMessage("close", params);
} catch (PlaywrightException exception) {
if (!isSafeCloseError(exception)) {
throw exception;
if (ownedContext != null) {
ownedContext.close();
} else {
JsonObject params = gson().toJsonTree(options).getAsJsonObject();
sendMessage("close", params);
}
}
if (ownedContext != null) {
ownedContext.close();
} catch (PlaywrightException exception) {
if (isSafeCloseError(exception) && (options.runBeforeUnload == null || !options.runBeforeUnload)) {
return;
}
throw exception;
}
}
@@ -349,40 +349,7 @@ public class TestBrowserTypeConnect extends TestBase {
}
browser.close();
}
@Test
void shouldNotThrowOnContextCloseAfterDisconnect() throws InterruptedException {
BrowserServer remoteServer = launchBrowserServer(browserType);
Browser browser = browserType.connect(remoteServer.wsEndpoint);
BrowserContext context = browser.newContext();
Page page = context.newPage();
remoteServer.kill();
while (browser.isConnected()) {
try {
page.waitForTimeout(10);
} catch (PlaywrightException e) {
}
}
context.close();
}
@Test
void shouldNotThrowOnPageCloseAfterDisconnect() throws InterruptedException {
BrowserServer remoteServer = launchBrowserServer(browserType);
Browser browser = browserType.connect(remoteServer.wsEndpoint);
Page page = browser.newPage();
remoteServer.kill();
while (browser.isConnected()) {
try {
page.waitForTimeout(10);
} catch (PlaywrightException e) {
}
}
page.close();
}
@Test
void shouldSaveAsVideosFromRemoteBrowser(@TempDir Path tempDir) {
Path videosPath = tempDir.resolve("videosPath");