1919import com .microsoft .playwright .options .HttpHeader ;
2020import org .junit .jupiter .api .Test ;
2121
22+ import java .io .OutputStreamWriter ;
2223import java .util .List ;
2324import java .util .stream .Collectors ;
2425
2526import static java .util .Arrays .asList ;
26- import static org .junit .jupiter .api .Assertions .assertEquals ;
27+ import static org .junit .jupiter .api .Assertions .* ;
2728
2829public 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