Skip to content

Commit

Permalink
add tests for macOS15 chrome workaround
Browse files Browse the repository at this point in the history
  • Loading branch information
jkasten2 committed Nov 19, 2024
1 parent b38c964 commit c3a3b09
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 5 deletions.
53 changes: 53 additions & 0 deletions __test__/unit/sw/serviceWorker.test.ts
Original file line number Diff line number Diff line change
@@ -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);
});
});
});
10 changes: 5 additions & 5 deletions src/sw/serviceWorker/ServiceWorker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<void> {
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;
}

/**
Expand Down

0 comments on commit c3a3b09

Please sign in to comment.