diff --git a/src/common/ChromeTargetManager.ts b/src/common/ChromeTargetManager.ts index f08001e0b6b74..445225edf352b 100644 --- a/src/common/ChromeTargetManager.ts +++ b/src/common/ChromeTargetManager.ts @@ -317,11 +317,12 @@ export class ChromeTargetManager extends EventEmitter implements TargetManager { ) { this.#finishInitializationIfReady(targetInfo.targetId); await silentDetach(); - if (parentSession instanceof CDPSession) { - const target = this.#targetFactory(targetInfo); - this.#attachedTargetsByTargetId.set(targetInfo.targetId, target); - this.emit(TargetManagerEmittedEvents.TargetAvailable, target); + if (this.#attachedTargetsByTargetId.has(targetInfo.targetId)) { + return; } + const target = this.#targetFactory(targetInfo); + this.#attachedTargetsByTargetId.set(targetInfo.targetId, target); + this.emit(TargetManagerEmittedEvents.TargetAvailable, target); return; } diff --git a/test/assets/serviceworkers/extension/background.js b/test/assets/serviceworkers/extension/background.js new file mode 100644 index 0000000000000..8b1a393741c96 --- /dev/null +++ b/test/assets/serviceworkers/extension/background.js @@ -0,0 +1 @@ +// empty diff --git a/test/assets/serviceworkers/extension/manifest.json b/test/assets/serviceworkers/extension/manifest.json new file mode 100644 index 0000000000000..25828b6d2b1df --- /dev/null +++ b/test/assets/serviceworkers/extension/manifest.json @@ -0,0 +1,9 @@ +{ + "name": "Simple extension", + "version": "0.1", + "background": { + "service_worker": "background.js" + }, + "permissions": ["background", "activeTab"], + "manifest_version": 3 +} diff --git a/test/src/headful.spec.ts b/test/src/headful.spec.ts index 1e5469785752b..95abfaa2c6e4b 100644 --- a/test/src/headful.spec.ts +++ b/test/src/headful.spec.ts @@ -36,6 +36,13 @@ const mkdtempAsync = promisify(fs.mkdtemp); const TMP_FOLDER = path.join(os.tmpdir(), 'pptr_tmp_folder-'); const extensionPath = path.join(__dirname, '../assets', 'simple-extension'); +const serviceWorkerExtensionPath = path.join( + __dirname, + '..', + 'assets', + 'serviceworkers', + 'extension' +); describeChromeOnly('headful tests', function () { /* These tests fire up an actual browser so let's @@ -120,7 +127,7 @@ describeChromeOnly('headful tests', function () { ); const page = await browserWithExtension.newPage(); const backgroundPageTarget = await browserWithExtension.waitForTarget( - (target: {type: () => string}) => { + target => { return target.type() === 'background_page'; } ); @@ -128,6 +135,26 @@ describeChromeOnly('headful tests', function () { await browserWithExtension.close(); expect(backgroundPageTarget).toBeTruthy(); }); + it('service_worker target type should be available', async () => { + const {puppeteer, defaultBrowserOptions} = getTestState(); + const browserWithExtension = await launchBrowser(puppeteer, { + ...defaultBrowserOptions, + headless: false, + args: [ + `--disable-extensions-except=${serviceWorkerExtensionPath}`, + `--load-extension=${serviceWorkerExtensionPath}`, + ], + }); + const page = await browserWithExtension.newPage(); + const serviceWorkerTarget = await browserWithExtension.waitForTarget( + target => { + return target.type() === 'service_worker'; + } + ); + await page.close(); + await browserWithExtension.close(); + expect(serviceWorkerTarget).toBeTruthy(); + }); it('target.page() should return a background_page', async function () { const {puppeteer} = getTestState(); const browserWithExtension = await launchBrowser( @@ -135,7 +162,7 @@ describeChromeOnly('headful tests', function () { extensionOptions ); const backgroundPageTarget = await browserWithExtension.waitForTarget( - (target: {type: () => string}) => { + target => { return target.type() === 'background_page'; } );