From c3a3b09e9fed582c4bb7077c53b96ebfce87785f Mon Sep 17 00:00:00 2001 From: Josh Kasten Date: Tue, 19 Nov 2024 19:06:21 +0000 Subject: [PATCH] add tests for macOS15 chrome workaround --- __test__/unit/sw/serviceWorker.test.ts | 53 ++++++++++++++++++++++++++ src/sw/serviceWorker/ServiceWorker.ts | 10 ++--- 2 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 __test__/unit/sw/serviceWorker.test.ts diff --git a/__test__/unit/sw/serviceWorker.test.ts b/__test__/unit/sw/serviceWorker.test.ts new file mode 100644 index 000000000..de45e11ed --- /dev/null +++ b/__test__/unit/sw/serviceWorker.test.ts @@ -0,0 +1,53 @@ +import { ServiceWorker } from '../../../src/sw/serviceWorker/ServiceWorker'; + +// suppress all internal logging +jest.mock('../../../src/shared/libraries/Log'); + +function chromeUserAgentDataBrands(): Array<{ + brand: string; + version: string; +}> { + return [ + { brand: 'Google Chrome', version: '129' }, + { brand: 'Not=A?Brand', version: '8' }, + { brand: 'Chromium', version: '129' }, + ]; +} + +describe('ServiceWorker', () => { + describe('requiresMacOS15ChromiumAfterDisplayWorkaround', () => { + test('navigator.userAgentData undefined', async () => { + delete (navigator as any).userAgentData; + expect( + ServiceWorker.requiresMacOS15ChromiumAfterDisplayWorkaround(), + ).toBe(false); + }); + test('navigator.userAgentData null', async () => { + (navigator as any).userAgentData = null; + expect( + ServiceWorker.requiresMacOS15ChromiumAfterDisplayWorkaround(), + ).toBe(false); + }); + + test('navigator.userAgentData Chrome on Windows Desktop', async () => { + (navigator as any).userAgentData = { + mobile: false, + platform: 'Windows', + brands: chromeUserAgentDataBrands(), + }; + expect( + ServiceWorker.requiresMacOS15ChromiumAfterDisplayWorkaround(), + ).toBe(false); + }); + test('navigator.userAgentData Chrome on macOS', async () => { + (navigator as any).userAgentData = { + mobile: false, + platform: 'macOS', + brands: chromeUserAgentDataBrands(), + }; + expect( + ServiceWorker.requiresMacOS15ChromiumAfterDisplayWorkaround(), + ).toBe(true); + }); + }); +}); diff --git a/src/sw/serviceWorker/ServiceWorker.ts b/src/sw/serviceWorker/ServiceWorker.ts index 51a603da3..0c988310a 100755 --- a/src/sw/serviceWorker/ServiceWorker.ts +++ b/src/sw/serviceWorker/ServiceWorker.ts @@ -778,22 +778,22 @@ export class ServiceWorker { notificationOptions, ); - await this.afterNotificationDisplayMacOS15ChromiumWorkaround(); + if (this.requiresMacOS15ChromiumAfterDisplayWorkaround()) { + await awaitableTimeout(1_000); + } } // Workaround: For Chromium browsers displaying an extra notification, even // when background rules are followed. // For reference, the notification body is "This site has been updated in the background". // https://issues.chromium.org/issues/378103918 - static async afterNotificationDisplayMacOS15ChromiumWorkaround(): Promise { + static requiresMacOS15ChromiumAfterDisplayWorkaround(): boolean { const userAgentData = (navigator as any).userAgentData; const isMacOS = userAgentData?.platform === 'macOS'; const isChromium = !!userAgentData?.brands?.some( (item: { brand: string }) => item.brand === 'Chromium', ); - if (isMacOS && isChromium) { - await awaitableTimeout(1_000); - } + return isMacOS && isChromium; } /**