Skip to content

Commit 2a0eefb

Browse files
authored
fix: handle service workers in extensions (#8807)
Closes #8800
1 parent 51b2f05 commit 2a0eefb

File tree

4 files changed

+44
-6
lines changed

4 files changed

+44
-6
lines changed

src/common/ChromeTargetManager.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -317,11 +317,12 @@ export class ChromeTargetManager extends EventEmitter implements TargetManager {
317317
) {
318318
this.#finishInitializationIfReady(targetInfo.targetId);
319319
await silentDetach();
320-
if (parentSession instanceof CDPSession) {
321-
const target = this.#targetFactory(targetInfo);
322-
this.#attachedTargetsByTargetId.set(targetInfo.targetId, target);
323-
this.emit(TargetManagerEmittedEvents.TargetAvailable, target);
320+
if (this.#attachedTargetsByTargetId.has(targetInfo.targetId)) {
321+
return;
324322
}
323+
const target = this.#targetFactory(targetInfo);
324+
this.#attachedTargetsByTargetId.set(targetInfo.targetId, target);
325+
this.emit(TargetManagerEmittedEvents.TargetAvailable, target);
325326
return;
326327
}
327328

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// empty
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"name": "Simple extension",
3+
"version": "0.1",
4+
"background": {
5+
"service_worker": "background.js"
6+
},
7+
"permissions": ["background", "activeTab"],
8+
"manifest_version": 3
9+
}

test/src/headful.spec.ts

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,13 @@ const mkdtempAsync = promisify(fs.mkdtemp);
3636
const TMP_FOLDER = path.join(os.tmpdir(), 'pptr_tmp_folder-');
3737

3838
const extensionPath = path.join(__dirname, '../assets', 'simple-extension');
39+
const serviceWorkerExtensionPath = path.join(
40+
__dirname,
41+
'..',
42+
'assets',
43+
'serviceworkers',
44+
'extension'
45+
);
3946

4047
describeChromeOnly('headful tests', function () {
4148
/* These tests fire up an actual browser so let's
@@ -120,22 +127,42 @@ describeChromeOnly('headful tests', function () {
120127
);
121128
const page = await browserWithExtension.newPage();
122129
const backgroundPageTarget = await browserWithExtension.waitForTarget(
123-
(target: {type: () => string}) => {
130+
target => {
124131
return target.type() === 'background_page';
125132
}
126133
);
127134
await page.close();
128135
await browserWithExtension.close();
129136
expect(backgroundPageTarget).toBeTruthy();
130137
});
138+
it('service_worker target type should be available', async () => {
139+
const {puppeteer, defaultBrowserOptions} = getTestState();
140+
const browserWithExtension = await launchBrowser(puppeteer, {
141+
...defaultBrowserOptions,
142+
headless: false,
143+
args: [
144+
`--disable-extensions-except=${serviceWorkerExtensionPath}`,
145+
`--load-extension=${serviceWorkerExtensionPath}`,
146+
],
147+
});
148+
const page = await browserWithExtension.newPage();
149+
const serviceWorkerTarget = await browserWithExtension.waitForTarget(
150+
target => {
151+
return target.type() === 'service_worker';
152+
}
153+
);
154+
await page.close();
155+
await browserWithExtension.close();
156+
expect(serviceWorkerTarget).toBeTruthy();
157+
});
131158
it('target.page() should return a background_page', async function () {
132159
const {puppeteer} = getTestState();
133160
const browserWithExtension = await launchBrowser(
134161
puppeteer,
135162
extensionOptions
136163
);
137164
const backgroundPageTarget = await browserWithExtension.waitForTarget(
138-
(target: {type: () => string}) => {
165+
target => {
139166
return target.type() === 'background_page';
140167
}
141168
);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy