收口桌面壳剪贴板诊断日志
桌面壳剪贴板失败只记录固定阶段标签 扩展桌面壳配置门禁禁止剪贴板日志输出插件错误细节 补充宿主壳方案和共享决策中的剪贴板诊断边界
This commit is contained in:
@@ -2220,9 +2220,9 @@ for (const snippet of [
|
||||
'read_desktop_clipboard_text(app)',
|
||||
'normalize_clipboard_text(&text)',
|
||||
'log_desktop_clipboard_failure',
|
||||
'desktop clipboard failed for {label}: {error}',
|
||||
'log_desktop_clipboard_failure("write.text", &error)',
|
||||
'log_desktop_clipboard_failure("read.text", &error)',
|
||||
'desktop clipboard failed for {label}',
|
||||
'log_desktop_clipboard_failure("write.text")',
|
||||
'log_desktop_clipboard_failure("read.text")',
|
||||
'clipboard_write_unavailable_response',
|
||||
'clipboard_read_unavailable_response',
|
||||
'required_string_payload(request, "text")',
|
||||
@@ -2232,11 +2232,19 @@ for (const snippet of [
|
||||
'"clipboard read unavailable"',
|
||||
'clipboard_unavailable_responses_are_stable',
|
||||
'clipboard_failures_are_logged_without_exposing_native_detail',
|
||||
'clipboard_failures_log_stable_label_only',
|
||||
]) {
|
||||
if (!desktopHostBridgeClipboardSource.includes(snippet)) {
|
||||
throw new Error(`desktop shell clipboard module is missing ${snippet}`);
|
||||
}
|
||||
}
|
||||
if (
|
||||
desktopHostBridgeClipboardSource.includes('desktop clipboard failed for {label}: {error}') ||
|
||||
desktopHostBridgeClipboardSource.includes('log_desktop_clipboard_failure("write.text", &error)') ||
|
||||
desktopHostBridgeClipboardSource.includes('log_desktop_clipboard_failure("read.text", &error)')
|
||||
) {
|
||||
throw new Error('desktop shell clipboard module must hide native clipboard errors');
|
||||
}
|
||||
|
||||
if (config.build?.frontendDist !== '../../../dist') {
|
||||
throw new Error('desktop shell must package the root H5 dist');
|
||||
|
||||
@@ -27,11 +27,8 @@ pub(crate) fn read_desktop_clipboard_text(app: &tauri::AppHandle) -> Result<Stri
|
||||
.map_err(|error| error.to_string())
|
||||
}
|
||||
|
||||
fn log_desktop_clipboard_failure(label: &str, error: &str) -> bool {
|
||||
if !error.is_empty() {
|
||||
eprintln!("desktop clipboard failed for {label}: {error}");
|
||||
}
|
||||
|
||||
fn log_desktop_clipboard_failure(label: &str) -> bool {
|
||||
eprintln!("desktop clipboard failed for {label}");
|
||||
false
|
||||
}
|
||||
|
||||
@@ -66,8 +63,8 @@ pub(crate) fn write_desktop_host_bridge_clipboard_text(
|
||||
|
||||
match write_desktop_clipboard_text(app, text) {
|
||||
Ok(()) => ok(request.id.clone(), json!(true)),
|
||||
Err(error) => {
|
||||
log_desktop_clipboard_failure("write.text", &error);
|
||||
Err(_error) => {
|
||||
log_desktop_clipboard_failure("write.text");
|
||||
clipboard_write_unavailable_response(request)
|
||||
}
|
||||
}
|
||||
@@ -84,8 +81,8 @@ pub(crate) fn read_desktop_host_bridge_clipboard_text(
|
||||
"text": text,
|
||||
}),
|
||||
),
|
||||
Err(error) => {
|
||||
log_desktop_clipboard_failure("read.text", &error);
|
||||
Err(_error) => {
|
||||
log_desktop_clipboard_failure("read.text");
|
||||
clipboard_read_unavailable_response(request)
|
||||
}
|
||||
}
|
||||
@@ -157,13 +154,12 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn clipboard_failures_are_logged_without_exposing_native_detail() {
|
||||
assert!(!log_desktop_clipboard_failure(
|
||||
"write.text",
|
||||
"private clipboard detail"
|
||||
));
|
||||
assert!(!log_desktop_clipboard_failure(
|
||||
"read.text",
|
||||
"private clipboard detail"
|
||||
));
|
||||
assert!(!log_desktop_clipboard_failure("write.text"));
|
||||
assert!(!log_desktop_clipboard_failure("read.text"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn clipboard_failures_log_stable_label_only() {
|
||||
assert!(!log_desktop_clipboard_failure("write.text"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3150,6 +3150,7 @@
|
||||
|
||||
- 背景:Tauri 桌面壳已声明剪贴板读写和即时本地通知;这些能力会触发 Tauri clipboard-manager 和 notification 插件。如果插件异常只被折叠成稳定 HostBridge 错误,H5 语义安全,但开发侧无法区分系统剪贴板不可用、通知权限查询异常或系统通知投递失败。
|
||||
- 决策:`apps/desktop-shell/src-tauri/src/host_bridge/clipboard.rs` 必须在剪贴板写入 / 读取失败时记录 `desktop clipboard failed for ...` 日志;`apps/desktop-shell/src-tauri/src/host_bridge/notifications.rs` 必须在通知权限状态读取、权限请求和通知投递失败时记录 `desktop notification failed for ...` 日志。HostBridge 对 H5 仍只返回稳定错误语义;该约束不新增遥测 SDK、后台通知、自动更新或 H5 直连 Tauri JS 插件。
|
||||
- 2026-06-21 调整:桌面剪贴板失败日志只记录 `desktop clipboard failed for <stage>` 固定标签,不输出 clipboard-manager 插件错误、系统剪贴板细节或其它平台异常字符串;配置检查拒绝 `clipboard.rs` 重新拼接 `: {error}` 或把写入 / 读取错误传给日志函数。
|
||||
- 验证方式:`cargo test --manifest-path apps/desktop-shell/src-tauri/Cargo.toml host_bridge::clipboard host_bridge::notifications`、`npm run desktop-shell:typecheck`、`npm run check:native-shells`、`npm run check:encoding`、`git diff --check`。
|
||||
|
||||
## 2026-06-20 桌面壳文件能力系统异常必须可观测
|
||||
|
||||
@@ -350,7 +350,7 @@ GameBridge 禁止:
|
||||
|
||||
2026-06-19 追加:移动壳 `haptics.impact` 的 HostBridge payload 解析、共享 style 归一、Expo style 映射和 `Haptics.impactAsync(...)` 真实调用统一收口在 `apps/mobile-shell/src/host-bridge/haptics.ts`;`dispatch.ts` 只按 method 委托 `runMobileHostBridgeHapticsImpact(request.payload)`。
|
||||
|
||||
2026-06-20 追加:桌面壳剪贴板和本地通知插件异常必须可观测。Tauri clipboard-manager 读写失败、notification permission state / request 失败、系统通知 show 失败时,桌面壳必须分别记录 `desktop clipboard failed for ...` 或 `desktop notification failed for ...` 日志;HostBridge 回包仍只暴露稳定 `clipboard write unavailable`、`clipboard read unavailable`、`notification permission unavailable` 或 `notification delivery unavailable` 语义。该约束不新增遥测 SDK、后台通知、自动更新或 H5 直连 Tauri JS 插件。
|
||||
2026-06-20 追加:桌面壳剪贴板和本地通知插件异常必须可观测。Tauri clipboard-manager 读写失败、notification permission state / request 失败、系统通知 show 失败时,桌面壳必须分别记录 `desktop clipboard failed for ...` 或 `desktop notification failed for ...` 日志;HostBridge 回包仍只暴露稳定 `clipboard write unavailable`、`clipboard read unavailable`、`notification permission unavailable` 或 `notification delivery unavailable` 语义。该约束不新增遥测 SDK、后台通知、自动更新或 H5 直连 Tauri JS 插件。2026-06-21 调整:桌面剪贴板失败日志只记录 `desktop clipboard failed for <stage>` 固定标签,不把 clipboard-manager 插件错误或系统剪贴板细节写入 stderr。
|
||||
|
||||
2026-06-20 追加:桌面壳文件导入导出的系统异常必须可观测。Tauri dialog 路径转换失败、后台文件读写任务失败或任务 join 失败时,桌面壳必须分别记录 `desktop file export failed for ...` 或 `desktop file import failed for ...` 日志;HostBridge 回包仍只暴露稳定 `file export unavailable` 或 `file import unavailable` 语义,不透传本地路径、系统错误或线程细节。用户取消系统文件对话框仍返回 `cancelled`,不记录为异常。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user