Skip to content

Commit 398ae9c

Browse files
silverwindclaude
andcommitted
Fix relative-time RangeError in headless browsers
Add 'en' fallback for navigator.language which can be undefined in headless browsers (e.g. Playwright Firefox), causing RangeError in Intl.DateTimeFormat. Add e2e test and shared assertNoJsError helper. Co-Authored-By: Claude (Opus 4.6) <[email protected]>
1 parent 896e483 commit 398ae9c

File tree

3 files changed

+26
-5
lines changed

3 files changed

+26
-5
lines changed

tests/e2e/relative-time.test.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import {test, expect} from '@playwright/test';
2+
import {apiCreateUser, apiDeleteUser, apiCreateRepo, apiUserHeaders, assertNoJsError} from './utils.ts';
3+
4+
test('relative-time renders without errors', async ({page, request}) => {
5+
const name = `rt-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
6+
await apiCreateUser(request, name);
7+
await apiCreateRepo(request, {name, headers: apiUserHeaders(name)});
8+
9+
// Explore page shows repos with relative-time elements, no login needed
10+
await page.goto('/explore/repos');
11+
const relativeTime = page.locator('relative-time').first();
12+
await expect(relativeTime).toHaveAttribute('data-tooltip-content', /.+/);
13+
await expect(relativeTime).toContainText(/now|ago|minute|hour|day/);
14+
await assertNoJsError(page);
15+
16+
await apiDeleteUser(request, name);
17+
});

tests/e2e/utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ export async function login(page: Page, username = env.GITEA_TEST_E2E_USER, pass
104104
await expect(page.getByRole('link', {name: 'Sign In'})).toBeHidden();
105105
}
106106

107+
export async function assertNoJsError(page: Page) {
108+
await expect(page.locator('.js-global-error')).toHaveCount(0);
109+
}
110+
107111
export async function logout(page: Page) {
108112
await page.context().clearCookies(); // workaround issues related to fomantic dropdown
109113
await page.goto('/');

web_src/js/webcomponents/relative-time.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -259,12 +259,12 @@ class RelativeTime extends HTMLElement {
259259

260260
get #lang(): string {
261261
const lang = this.closest('[lang]')?.getAttribute('lang');
262-
if (!lang) return navigator.language;
263-
try {
264-
return new Intl.Locale(lang).toString();
265-
} catch {
266-
return navigator.language;
262+
if (lang) {
263+
try {
264+
return new Intl.Locale(lang).toString();
265+
} catch { /* invalid locale, fall through */ }
267266
}
267+
return navigator.language ?? 'en';
268268
}
269269

270270
get second(): 'numeric' | '2-digit' | undefined {

0 commit comments

Comments
 (0)