import { describe, expect, test } from 'vitest'; import { resolveMobileShellWebViewUrl, shouldOpenInMobileShellWebView, } from './mobileShellNavigation'; describe('shouldOpenInMobileShellWebView', () => { test('只允许主站同源页面留在移动壳 WebView 内', () => { const allowedOrigin = 'https://app.genarrative.world'; expect( shouldOpenInMobileShellWebView( 'https://app.genarrative.world/works/detail?work=PZ-1', allowedOrigin, ), ).toBe(true); expect( shouldOpenInMobileShellWebView('/creation/puzzle', allowedOrigin), ).toBe(true); expect( shouldOpenInMobileShellWebView('about:blank', allowedOrigin), ).toBe(true); }); test('外链和非网页协议必须离开带 HostBridge 的 WebView', () => { const allowedOrigin = 'https://app.genarrative.world'; expect( shouldOpenInMobileShellWebView('https://example.com/', allowedOrigin), ).toBe(false); expect( shouldOpenInMobileShellWebView('mailto:hi@example.com', allowedOrigin), ).toBe(false); expect(shouldOpenInMobileShellWebView('not a url', allowedOrigin)).toBe( false, ); }); test('HostBridge 主动导航只解析同源网页目标', () => { const allowedOrigin = 'https://app.genarrative.world'; expect( resolveMobileShellWebViewUrl('/works/detail?work=PZ-1', allowedOrigin), ).toBe('https://app.genarrative.world/works/detail?work=PZ-1'); expect( resolveMobileShellWebViewUrl( 'https://app.genarrative.world/creation/puzzle#draft', allowedOrigin, ), ).toBe('https://app.genarrative.world/creation/puzzle#draft'); expect( resolveMobileShellWebViewUrl('https://example.com/', allowedOrigin), ).toBeNull(); expect( resolveMobileShellWebViewUrl('about:blank', allowedOrigin), ).toBeNull(); }); });