收口移动壳分享目标缺失语义

移动壳 share.setTarget 缺少 target 时返回 invalid_request

移动壳分享目标测试覆盖缺目标不清空已有缓存

移动壳配置检查反查分享目标必填边界
This commit is contained in:
2026-06-20 04:21:39 +08:00
parent b8562dfdd9
commit 038b5d995d
3 changed files with 35 additions and 2 deletions
@@ -1318,6 +1318,7 @@ for (const snippet of [
'normalizeHostBridgeShareOpenPayload(currentShareTarget)',
'setMobileHostBridgeShareTarget',
'request: HostBridgeRequest',
"throw invalidRequest('target is required')",
'ok(request, true)',
'resetMobileHostBridgeShareTargetForTest',
]) {
@@ -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', {
+7 -2
View File
@@ -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);
}