Skip to content

Commit a478acf

Browse files
authored
test: response.finished() respects page.close (#1206)
1 parent da36841 commit a478acf

File tree

1 file changed

+49
-1
lines changed

1 file changed

+49
-1
lines changed

playwright/src/test/java/com/microsoft/playwright/TestPageNetworkResponse.java

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@
1919
import com.microsoft.playwright.options.HttpHeader;
2020
import org.junit.jupiter.api.Test;
2121

22+
import java.io.OutputStreamWriter;
2223
import java.util.List;
2324
import java.util.stream.Collectors;
2425

2526
import static java.util.Arrays.asList;
26-
import static org.junit.jupiter.api.Assertions.assertEquals;
27+
import static org.junit.jupiter.api.Assertions.*;
2728

2829
public class TestPageNetworkResponse extends TestBase {
2930
@Test
@@ -45,4 +46,51 @@ void shouldReportMultipleSetCookieHeaders() {
4546
assertEquals(asList("a=b", "c=d"), response.headerValues("set-cookie"));
4647
}
4748

49+
@Test
50+
void shouldRejectResponseFinishedIfPageCloses() {
51+
page.navigate(server.EMPTY_PAGE);
52+
server.setRoute("/get", exchange -> {
53+
// In Firefox, |fetch| will be hanging until it receives |Content-Type| header
54+
// from server.
55+
exchange.getResponseHeaders().add("Content-Type", "text/plain; charset=utf-8");
56+
exchange.sendResponseHeaders(200, 0);
57+
OutputStreamWriter writer = new OutputStreamWriter(exchange.getResponseBody());
58+
writer.write("hello ");
59+
});
60+
61+
// send request and wait for server response
62+
Response pageResponse = page.waitForResponse("**/get", () -> {
63+
page.evaluate("() => fetch('./get', { method: 'GET' })");
64+
});
65+
// In 1s send a request which will trigger a request event while pageResponse.finished() is still
66+
// on the callstack.
67+
page.onRequest(request -> page.close());
68+
page.evaluate("() => setTimeout(() => fetch('./empty.html', { method: 'GET' }), 1000)");
69+
PlaywrightException e = assertThrows(PlaywrightException.class, () -> pageResponse.finished());
70+
assertTrue(e.getMessage().contains("closed"), e.getMessage());
71+
}
72+
73+
@Test
74+
void shouldRejectResponseFinishedIfContextCloses() {
75+
page.navigate(server.EMPTY_PAGE);
76+
server.setRoute("/get", exchange -> {
77+
// In Firefox, |fetch| will be hanging until it receives |Content-Type| header
78+
// from server.
79+
exchange.getResponseHeaders().add("Content-Type", "text/plain; charset=utf-8");
80+
exchange.sendResponseHeaders(200, 0);
81+
OutputStreamWriter writer = new OutputStreamWriter(exchange.getResponseBody());
82+
writer.write("hello ");
83+
});
84+
85+
// send request and wait for server response
86+
Response pageResponse = page.waitForResponse("**/get", () -> {
87+
page.evaluate("() => fetch('./get', { method: 'GET' })");
88+
});
89+
// In 1s send a request which will trigger a request event while pageResponse.finished() is still
90+
// on the callstack.
91+
page.onRequest(request -> context.close());
92+
page.evaluate("() => setTimeout(() => fetch('./empty.html', { method: 'GET' }), 1000)");
93+
PlaywrightException e = assertThrows(PlaywrightException.class, () -> pageResponse.finished());
94+
assertTrue(e.getMessage().contains("closed"), e.getMessage());
95+
}
4896
}

0 commit comments

Comments
 (0)