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:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user