@@ -904,3 +904,50 @@ async def test_CD_035_no_defaults_should_not_affect_new_contexts(
904904 await browser .close ()
905905 finally :
906906 await browser_server .close ()
907+
908+
909+ async def test_CD_053_should_connect_when_another_client_inspects_a_terminated_shared_worker (
910+ browser_type : BrowserType , server : Server , launch_arguments : Dict , port : int
911+ ) -> None :
912+ pytest .skip ("fixme" )
913+ browser = await launch (browser_type , launch_arguments , port )
914+ try :
915+ # Another client inspects the shared worker.
916+ page = await browser .new_page ()
917+ inspector = await browser .new_browser_cdp_session ()
918+ worker_created : asyncio .Future [str ] = asyncio .get_running_loop ().create_future ()
919+
920+ def on_target_created (event : Dict [str , Any ]) -> None :
921+ if event ["targetInfo" ]["type" ] == "shared_worker" :
922+ worker_created .set_result (event ["targetInfo" ]["targetId" ])
923+
924+ inspector .on ("Target.targetCreated" , on_target_created )
925+ await inspector .send ("Target.setDiscoverTargets" , {"discover" : True })
926+ await page .goto (server .PREFIX + "/shared-worker/shared-worker.html" )
927+ assert await page .evaluate ("window.sharedWorkerResponsePromise" ) == "echo:hello"
928+ worker_target_id = await worker_created
929+ await inspector .send (
930+ "Target.attachToTarget" , {"targetId" : worker_target_id , "flatten" : True }
931+ )
932+
933+ # The last client of the shared worker goes away, so the worker is terminated.
934+ # The inspector stays attached, so the worker target lingers without a browser context.
935+ await page .close ()
936+ # Python: poll the CDP target list instead of expect.poll.
937+ deadline = asyncio .get_running_loop ().time () + 5
938+ while True :
939+ targets = await inspector .send ("Target.getTargets" )
940+ if not any (
941+ info ["targetId" ] == worker_target_id for info in targets ["targetInfos" ]
942+ ):
943+ break
944+ assert asyncio .get_running_loop ().time () < deadline
945+ await asyncio .sleep (0.1 )
946+
947+ # A new client auto-attaches to the lingering worker target.
948+ cdp_browser = await browser_type .connect_over_cdp (f"http://127.0.0.1:{ port } /" )
949+ page2 = await cdp_browser .contexts [0 ].new_page ()
950+ assert await page2 .evaluate ("1 + 1" ) == 2
951+ await cdp_browser .close ()
952+ finally :
953+ await browser .close ()
0 commit comments