Files
readest/apps/readest-app/src/__tests__/utils/viewport.test.ts
T
Huang Xin cc8f917cdd fix(layout): silence viewport meta warning on non-Android browsers (#4097)
`interactive-widget=resizes-content` was set in the SSR viewport
metadata so Android Chrome would shrink the layout viewport when
the on-screen keyboard opens (matching iOS default behavior).
Other browsers — Safari on macOS / iOS, desktop Chrome, Firefox —
log a console warning every page load because they don't recognize
the key.

Move the attachment client-side, gated on a UA sniff for Android,
so the meta tag stays clean for everyone else. The Android-specific
behavior (modals centered above the keyboard) is preserved on the
platform that actually needed it.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 21:16:52 +02:00

39 lines
1.6 KiB
TypeScript

import { describe, test, expect } from 'vitest';
import { getAndroidPatchedViewportContent } from '@/utils/viewport';
const ANDROID_UA =
'Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Mobile Safari/537.36';
const IOS_UA =
'Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Mobile/15E148 Safari/604.1';
const MACOS_UA =
'Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15';
const BASE_VIEWPORT =
'width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover';
describe('getAndroidPatchedViewportContent', () => {
test('returns null on macOS Safari', () => {
expect(getAndroidPatchedViewportContent(MACOS_UA, BASE_VIEWPORT)).toBeNull();
});
test('returns null on iOS Safari', () => {
expect(getAndroidPatchedViewportContent(IOS_UA, BASE_VIEWPORT)).toBeNull();
});
test('appends interactive-widget on Android Chrome', () => {
expect(getAndroidPatchedViewportContent(ANDROID_UA, BASE_VIEWPORT)).toBe(
`${BASE_VIEWPORT}, interactive-widget=resizes-content`,
);
});
test('returns null when interactive-widget is already present', () => {
const existing = `${BASE_VIEWPORT}, interactive-widget=resizes-visual`;
expect(getAndroidPatchedViewportContent(ANDROID_UA, existing)).toBeNull();
});
test('handles empty current content without leading comma', () => {
expect(getAndroidPatchedViewportContent(ANDROID_UA, '')).toBe(
'interactive-widget=resizes-content',
);
});
});