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'),