@@ -225,7 +225,14 @@ protected void handleEvent(String event, JsonObject params) {
225225 route .browserContext = browserContext ;
226226 Router .HandleResult handled = routes .handle (route );
227227 if (handled != Router .HandleResult .NoMatchingHandler ) {
228- updateInterceptionPatterns ();
228+ try {
229+ updateInterceptionPatterns ();
230+ } catch (PlaywrightException e ) {
231+ // Like the Node.js client, ignore the error when the page or the context was closed meanwhile.
232+ if (!isSafeCloseError (e )) {
233+ throw e ;
234+ }
235+ }
229236 }
230237 if (handled == Router .HandleResult .NoMatchingHandler || handled == Router .HandleResult .Fallback ) {
231238 browserContext .handleRoute (route );
@@ -1513,12 +1520,25 @@ <T> Waitable<T> createWaitableFrameDetach(Frame frame) {
15131520 }
15141521
15151522 <T > Waitable <T > createWaitForCloseHelper () {
1516- return new WaitableRace <T >(asList (new WaitablePageClose (), new WaitablePageCrash ()));
1523+ return createWaitForCloseHelper (false );
1524+ }
1525+
1526+ /** With {@code rejectIfClosed}, it is done at once when the page is already closed, like the navigation waiter of the Node.js client. */
1527+ <T > Waitable <T > createWaitForCloseHelper (boolean rejectIfClosed ) {
1528+ return new WaitableRace <T >(asList (new WaitablePageClose (rejectIfClosed && isClosed ), new WaitablePageCrash ()));
15171529 }
15181530
15191531 private class WaitablePageClose <T > extends WaitableEvent <EventType , T > {
1520- WaitablePageClose () {
1532+ private final boolean closedBefore ;
1533+
1534+ WaitablePageClose (boolean closedBefore ) {
15211535 super (PageImpl .this .listeners , EventType .CLOSE );
1536+ this .closedBefore = closedBefore ;
1537+ }
1538+
1539+ @ Override
1540+ public boolean isDone () {
1541+ return closedBefore || super .isDone ();
15221542 }
15231543
15241544 @ Override
0 commit comments