From 060fbf74281e37bb4f7dc9d13627c0cb9f878c68 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Thu, 23 Jan 2020 17:52:06 -0800 Subject: [PATCH] fix(workers): emit workerdestroyed event when clearing workers (#618) --- src/page.ts | 5 ++++- test/workers.spec.js | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) 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}) {