diff --git a/tests/library/chromium/chromium.spec.ts b/tests/library/chromium/chromium.spec.ts index 2960c9b12c..61e006ef3b 100644 --- a/tests/library/chromium/chromium.spec.ts +++ b/tests/library/chromium/chromium.spec.ts @@ -233,6 +233,116 @@ test('should intercept only serviceworker request, not page', async ({ context, expect(response).toBe('from sw'); }); +test('should emit new service worker on update', async ({ context, page, server }) => { + let version = 0; + server.setRoute('/worker.js', (req, res) => { + res.writeHead(200, 'OK', { 'Content-Type': 'text/javascript' }); + res.write(`self.PW_VERSION = ${version++};`); + res.end(); + }); + + server.setRoute('/home', (req, res) => { + res.write(` + + + + Service Worker Update Demo + + + + + + + `); + res.end(); + }); + + const [ sw ] = await Promise.all([ + context.waitForEvent('serviceworker'), + page.goto(server.PREFIX + '/home'), + ]); + + await expect.poll(() => sw.evaluate(() => self['PW_VERSION'])).toBe(0); + + const [ updatedSW ] = await Promise.all([ + context.waitForEvent('serviceworker'), + page.click('#update'), + ]); + + await expect.poll(() => updatedSW.evaluate(() => self['PW_VERSION'])).toBe(1); +}); + +test('should intercept service worker update requests', async ({ context, page, server }) => { + test.fixme(); + test.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/14711' }); + + let version = 0; + server.setRoute('/worker.js', (req, res) => { + res.writeHead(200, 'OK', { 'Content-Type': 'text/javascript' }); + res.write(`self.PW_VERSION = ${version++};`); + res.end(); + }); + + server.setRoute('/home', (req, res) => { + res.write(` + + + + Service Worker Update Demo + + + + + + + `); + res.end(); + }); + + const [ sw ] = await Promise.all([ + context.waitForEvent('serviceworker'), + page.goto(server.PREFIX + '/home'), + ]); + + await expect.poll(() => sw.evaluate(() => self['PW_VERSION'])).toBe(0); + + // Before triggering, let's intercept the update request + await context.route('**/worker.js', async route => { + await route.fulfill({ + status: 200, + body: `self.PW_VERSION = "intercepted";`, + contentType: 'text/javascript', + }); + }); + + const [ updatedSW ] = await Promise.all([ + context.waitForEvent('serviceworker'), + // currently times out here + context.waitForEvent('request', r => r.url().endsWith('worker.js')), + page.click('#update'), + ]); + + await expect.poll(() => updatedSW.evaluate(() => self['PW_VERSION'])).toBe('intercepted'); +}); + test('setOffline', async ({ context, page, server }) => { const [worker] = await Promise.all([ context.waitForEvent('serviceworker'),