@@ -236,17 +236,21 @@ def _on_frame_detached(self, frame: Frame) -> None:
236236 self .emit (Page .Events .FrameDetached , frame )
237237
238238 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 ())
250254
251255 def _on_binding (self , binding_call : "BindingCall" ) -> None :
252256 func = self ._bindings .get (binding_call ._initializer ["name" ])
@@ -578,6 +582,7 @@ async def route(
578582 RouteHandler (
579583 URLMatcher (self ._browser_context ._options .get ("baseURL" ), url ),
580584 handler ,
585+ True if self ._dispatcher_fiber else False ,
581586 times ,
582587 ),
583588 )
0 commit comments