diff --git a/src/page.ts b/src/page.ts index 52b885109c77e..951b66b95a1bf 100644 --- a/src/page.ts +++ b/src/page.ts @@ -520,7 +520,10 @@ export class Page extends platform.EventEmitter { } _clearWorkers() { - this._workers.clear(); + for (const [workerId, worker] of this._workers) { + this.emit(Events.Page.WorkerDestroyed, worker); + this._workers.delete(workerId); + } } } diff --git a/test/workers.spec.js b/test/workers.spec.js index b810a136c6478..726563c7f2e61 100644 --- a/test/workers.spec.js +++ b/test/workers.spec.js @@ -80,7 +80,22 @@ module.exports.describe = function({testRunner, expect, FFOX, CHROMIUM, WEBKIT}) page.evaluate(() => new Worker(URL.createObjectURL(new Blob(['console.log(1)'], {type: 'application/javascript'})))); await workerCreatedPromise; expect(page.workers().length).toBe(1); + let destroyed = false; + page.once('workerdestroyed', () => destroyed = true); + await page.goto(server.PREFIX + '/one-style.html'); + expect(destroyed).toBe(true); + expect(page.workers().length).toBe(0); + }); + it('should clear upon cross-process navigation', async function({server, page}) { + await page.goto(server.EMPTY_PAGE); + const workerCreatedPromise = page.waitForEvent('workercreated'); + page.evaluate(() => new Worker(URL.createObjectURL(new Blob(['console.log(1)'], {type: 'application/javascript'})))); + await workerCreatedPromise; + expect(page.workers().length).toBe(1); + let destroyed = false; + page.once('workerdestroyed', () => destroyed = true); await page.goto(server.CROSS_PROCESS_PREFIX + '/empty.html'); + expect(destroyed).toBe(true); expect(page.workers().length).toBe(0); }); it('should report network activity', async function({page, server}) {