From 038b5d995d0d44ecd09129ee148433bbac6c94fb Mon Sep 17 00:00:00 2001 From: kdletters Date: Sat, 20 Jun 2026 04:21:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B6=E5=8F=A3=E7=A7=BB=E5=8A=A8=E5=A3=B3?= =?UTF-8?q?=E5=88=86=E4=BA=AB=E7=9B=AE=E6=A0=87=E7=BC=BA=E5=A4=B1=E8=AF=AD?= =?UTF-8?q?=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移动壳 share.setTarget 缺少 target 时返回 invalid_request 移动壳分享目标测试覆盖缺目标不清空已有缓存 移动壳配置检查反查分享目标必填边界 --- apps/mobile-shell/scripts/check-config.mjs | 1 + .../src/host-bridge/bridge.test.ts | 27 +++++++++++++++++++ apps/mobile-shell/src/host-bridge/share.ts | 9 +++++-- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/apps/mobile-shell/scripts/check-config.mjs b/apps/mobile-shell/scripts/check-config.mjs index 56faf7445..06b6d1432 100644 --- a/apps/mobile-shell/scripts/check-config.mjs +++ b/apps/mobile-shell/scripts/check-config.mjs @@ -1318,6 +1318,7 @@ for (const snippet of [ 'normalizeHostBridgeShareOpenPayload(currentShareTarget)', 'setMobileHostBridgeShareTarget', 'request: HostBridgeRequest', + "throw invalidRequest('target is required')", 'ok(request, true)', 'resetMobileHostBridgeShareTargetForTest', ]) { diff --git a/apps/mobile-shell/src/host-bridge/bridge.test.ts b/apps/mobile-shell/src/host-bridge/bridge.test.ts index e16da2256..090dade71 100644 --- a/apps/mobile-shell/src/host-bridge/bridge.test.ts +++ b/apps/mobile-shell/src/host-bridge/bridge.test.ts @@ -922,6 +922,33 @@ describe('handleMobileHostBridgeMessage', () => { }); }); + test('share.setTarget 拒绝缺少目标且不清空已有目标', async () => { + expectOk( + await send( + request('share.setTarget', { + target: { + type: 'genarrative:share-target', + payload: { + title: '暖灯猫街', + work: 'PZ-00000001', + }, + }, + }), + ), + ); + + const invalid = await send(request('share.setTarget', {})); + + expect(expectFailed(invalid).error.message).toBe('target is required'); + + expectOk(await send(request('share.open'))); + expect(Share.share).toHaveBeenCalledWith({ + title: '暖灯猫街', + message: 'https://app.genarrative.world/works/detail?work=PZ-00000001', + url: 'https://app.genarrative.world/works/detail?work=PZ-00000001', + }); + }); + test('share.open 只把同源路径归一为公开主站分享 URL', async () => { const response = await send( request('share.open', { diff --git a/apps/mobile-shell/src/host-bridge/share.ts b/apps/mobile-shell/src/host-bridge/share.ts index ea7a9806b..40a917207 100644 --- a/apps/mobile-shell/src/host-bridge/share.ts +++ b/apps/mobile-shell/src/host-bridge/share.ts @@ -10,10 +10,15 @@ let currentShareTarget: unknown = null; export function setMobileHostBridgeShareTarget(request: HostBridgeRequest) { const payload = request.payload; - currentShareTarget = + const target = payload && typeof payload === 'object' ? (payload as { target?: unknown }).target - : null; + : undefined; + if (target === undefined) { + throw invalidRequest('target is required'); + } + + currentShareTarget = target; return ok(request, true); }