forked from akai/readest
cc8f917cdd
`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>
39 lines
1.6 KiB
TypeScript
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',
|
|
);
|
|
});
|
|
});
|