收口桌面剪贴板边界

将 Tauri 剪贴板读写收口到 clipboard 模块

让桌面 HostBridge dispatch 只负责剪贴板 payload 分发

同步原生壳结构门禁和架构文档清单
This commit is contained in:
2026-06-19 21:23:35 +08:00
parent 9eeaa6a4e0
commit b26168a293
8 changed files with 79 additions and 37 deletions
+21 -4
View File
@@ -54,6 +54,14 @@ const desktopHostBridgeCapabilitiesSource = fs.readFileSync(
desktopHostBridgeCapabilitiesPath,
'utf8',
);
const desktopHostBridgeClipboardPath = new URL(
'../src-tauri/src/host_bridge/clipboard.rs',
import.meta.url,
);
const desktopHostBridgeClipboardSource = fs.readFileSync(
desktopHostBridgeClipboardPath,
'utf8',
);
const desktopHostBridgeDispatchPath = new URL(
'../src-tauri/src/host_bridge/dispatch.rs',
import.meta.url,
@@ -178,6 +186,7 @@ const expectedDesktopRustRootEntries = [
];
const expectedDesktopHostBridgeRustFiles = [
'capabilities.rs',
'clipboard.rs',
'dispatch.rs',
'files.rs',
'mod.rs',
@@ -893,7 +902,12 @@ function extractDesktopHostBridgeMethodBody(source, method) {
throw new Error(`desktop shell HostBridge missing method ${method}`);
}
const nextMethodStart = source.indexOf('\n "', methodStart + method.length);
const nextMethodMatch = source
.slice(methodStart + method.length)
.match(/\n "[^"]+"\s*=>/);
const nextMethodStart = nextMethodMatch
? methodStart + method.length + nextMethodMatch.index
: -1;
return source.slice(
methodStart,
nextMethodStart > methodStart ? nextMethodStart : undefined,
@@ -903,7 +917,7 @@ function extractDesktopHostBridgeMethodBody(source, method) {
function extractDesktopDialogFilter(source, method, filterLabel) {
const methodBody = extractDesktopHostBridgeMethodBody(source, method);
const match = methodBody.match(
new RegExp(`\\.add_filter\\("${filterLabel}",\\s*&\\[([^\\]]*)\\]\\)`),
new RegExp(`\\.add_filter\\(\\s*"${filterLabel}",\\s*&\\[([^\\]]*)\\]\\s*,?\\s*\\)`),
);
if (!match) {
throw new Error(
@@ -1268,7 +1282,7 @@ const desktopHostBridgePayloadLimits = {
'WINDOW_TITLE_MAX_LENGTH',
),
HOST_BRIDGE_CLIPBOARD_TEXT_MAX_LENGTH: extractRustNumberConst(
rustHostSource,
desktopHostBridgeClipboardSource,
'CLIPBOARD_TEXT_MAX_LENGTH',
),
HOST_BRIDGE_LOCAL_NOTIFICATION_TITLE_MAX_LENGTH: extractRustNumberConst(
@@ -1781,6 +1795,7 @@ const expectedRustRootEntries = [
];
const expectedRustHostBridgeFiles = [
'capabilities.rs',
'clipboard.rs',
'dispatch.rs',
'files.rs',
'mod.rs',
@@ -1878,7 +1893,9 @@ const requiredRustHostSnippets = [
'"file.exportAudio"',
'"file.imageDropped"',
'"notification.showLocal"',
'Ok(text) => normalize_clipboard_text(text)',
'write_desktop_clipboard_text(&app, text)',
'read_desktop_clipboard_text(&app)',
'normalize_clipboard_text(&text)',
'tauri_plugin_dialog::init()',
'tauri_plugin_notification::init()',
'tauri_plugin_notification::{NotificationExt, PermissionState}',