@@ -236,17 +236,21 @@ def _on_frame_detached(self, frame: Frame) -> None:
236
236
self .emit (Page .Events .FrameDetached , frame )
237
237
238
238
def _on_route (self , route : Route , request : Request ) -> None :
239
- for handler_entry in self ._routes :
240
- if handler_entry .matches (request .url ):
241
- try :
242
- handler_entry .handle (route , request )
243
- finally :
244
- if not handler_entry .is_active :
245
- self ._routes .remove (handler_entry )
246
- if len (self ._routes ) == 0 :
247
- asyncio .create_task (self ._disable_interception ())
248
- return
249
- self ._browser_context ._on_route (route , request )
239
+ # Make this artificially async so that we could chain routes.
240
+ async def inner_route () -> None :
241
+ for handler_entry in self ._routes :
242
+ if handler_entry .matches (request .url ):
243
+ try :
244
+ handler_entry .handle (route , request )
245
+ finally :
246
+ if not handler_entry .is_active :
247
+ self ._routes .remove (handler_entry )
248
+ if len (self ._routes ) == 0 :
249
+ asyncio .create_task (self ._disable_interception ())
250
+ return
251
+ self ._browser_context ._on_route (route , request )
252
+
253
+ asyncio .create_task (inner_route ())
250
254
251
255
def _on_binding (self , binding_call : "BindingCall" ) -> None :
252
256
func = self ._bindings .get (binding_call ._initializer ["name" ])
@@ -578,6 +582,7 @@ async def route(
578
582
RouteHandler (
579
583
URLMatcher (self ._browser_context ._options .get ("baseURL" ), url ),
580
584
handler ,
585
+ True if self ._dispatcher_fiber else False ,
581
586
times ,
582
587
),
583
588
)
0 commit comments