收紧窗口标题载荷边界

将 app.setTitle 标题长度和控制字符规则提升到共享 HostBridge 契约

让 H5 facade 和 Tauri 壳按共享窗口标题边界归一化载荷

增加标题边界测试和三端壳总门禁反查

同步宿主壳协议文档和共享决策记录
This commit is contained in:
2026-06-19 15:34:37 +08:00
parent 4b269c7bc2
commit 64f496d091
9 changed files with 72 additions and 7 deletions
@@ -1025,6 +1025,12 @@ describe('hostBridge', () => {
await expect(setHostAppTitle({ title: ' 拼图 - 陶泥儿 ' })).resolves.toBe(
true,
);
await expect(
setHostAppTitle({ title: 'a'.repeat(90) }),
).resolves.toBe(true);
await expect(setHostAppTitle({ title: '拼图\n陶泥儿' })).resolves.toBe(
false,
);
await expect(setHostAppBadgeCount({ count: 7 })).resolves.toBe(true);
await expect(getHostNetworkStatus()).resolves.toEqual({
isConnected: true,
@@ -1167,6 +1173,14 @@ describe('hostBridge', () => {
},
}),
});
expect(invoke).toHaveBeenCalledWith('host_bridge_request', {
request: expect.objectContaining({
method: 'app.setTitle',
payload: {
title: 'a'.repeat(80),
},
}),
});
expect(invoke).toHaveBeenCalledWith('host_bridge_request', {
request: expect.objectContaining({
method: 'app.setBadgeCount',
+4 -4
View File
@@ -26,6 +26,7 @@ import type {
} from '../../../packages/shared/src/contracts/hostBridge';
import {
HOST_BRIDGE_AUDIO_MIME_TYPES,
HOST_BRIDGE_APP_TITLE_MAX_LENGTH,
HOST_BRIDGE_DOCUMENT_MIME_TYPES,
HOST_BRIDGE_IMAGE_MIME_TYPES,
HOST_BRIDGE_NATIVE_APP_QUERY,
@@ -37,6 +38,7 @@ import {
HOST_BRIDGE_WECHAT_MINI_PROGRAM_SOURCE_QUERY,
isHostBridgeCapability,
normalizeHostBridgeBadgeCount,
normalizeHostBridgeAppTitle,
normalizeHostBridgeClipboardText,
normalizeHostBridgeColorScheme,
normalizeHostBridgeConnectionType,
@@ -1145,15 +1147,13 @@ export async function showHostLocalNotification(
}
export async function setHostAppTitle({ title }: HostAppTitleRequest) {
const normalizedTitle = title.trim();
const normalizedTitle = normalizeHostBridgeAppTitle(title);
if (!normalizedTitle || !canUseNativeHostCapability('app.setTitle')) {
return false;
}
try {
return await requestNativeHostBoolean('app.setTitle', {
title: normalizedTitle,
});
return await requestNativeHostBoolean('app.setTitle', normalizedTitle);
} catch {
return false;
}