From dbfe74304641fc665fde43d874f87a130051e5c5 Mon Sep 17 00:00:00 2001 From: kdletters Date: Sun, 21 Jun 2026 03:01:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B6=E5=8F=A3=E6=A1=8C=E9=9D=A2=E5=A3=B3?= =?UTF-8?q?=E6=8B=96=E6=8B=BD=E5=9B=BE=E7=89=87=E8=AF=8A=E6=96=AD=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 桌面壳拖拽图片 payload 失败只记录固定事件标签 扩展桌面壳配置门禁禁止输出 payload 错误详情 补充宿主壳方案和共享决策中的拖拽图片诊断边界 --- apps/desktop-shell/scripts/check-config.mjs | 12 +++++++++++- .../src-tauri/src/shell/file_drop.rs | 17 ++++++++++------- .../shared-memory/decision-log.md | 1 + ...】ExpoReactNative与Tauri宿主壳方案-2026-06-17.md | 2 +- 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/apps/desktop-shell/scripts/check-config.mjs b/apps/desktop-shell/scripts/check-config.mjs index 8c3cc89da..ebcc675c1 100644 --- a/apps/desktop-shell/scripts/check-config.mjs +++ b/apps/desktop-shell/scripts/check-config.mjs @@ -2612,11 +2612,12 @@ const requiredRustHostSnippets = [ 'if !path.is_file() || import_image_mime_type(path).is_none()', 'match import_image_file_payload(path.clone(), "dropped", Some(position))', 'import_image_file_payload(path.clone(), "dropped", Some(position))', - 'log_desktop_image_drop_payload_failure(&error)', + 'log_desktop_image_drop_payload_failure()', 'file.imageDropped.payload', 'fn image_drop_without_valid_image_does_not_emit_payload()', 'fn image_drop_logs_invalid_candidate_then_uses_next_valid_image()', 'fn image_drop_payload_failure_reports_failure()', + 'fn image_drop_payload_failure_logs_stable_label_only()', 'fs::create_dir_all(&directory_path)', 'assert_eq!(payload, None);', 'PageLoadEvent', @@ -3368,3 +3369,12 @@ if ( ) { throw new Error('desktop lifecycle diagnostics must not log Tauri error details'); } + +if ( + rustHostSource.includes( + 'desktop host event failed for file.imageDropped.payload: {error}', + ) || + rustHostSource.includes('log_desktop_image_drop_payload_failure(&error)') +) { + throw new Error('desktop image drop diagnostics must not log payload error details'); +} diff --git a/apps/desktop-shell/src-tauri/src/shell/file_drop.rs b/apps/desktop-shell/src-tauri/src/shell/file_drop.rs index 3075c7e80..b0194ba1d 100644 --- a/apps/desktop-shell/src-tauri/src/shell/file_drop.rs +++ b/apps/desktop-shell/src-tauri/src/shell/file_drop.rs @@ -16,16 +16,16 @@ fn first_valid_desktop_image_drop_payload( match import_image_file_payload(path.clone(), "dropped", Some(position)) { Ok(payload) => Some(payload), - Err(error) => { - log_desktop_image_drop_payload_failure(&error); + Err(_error) => { + log_desktop_image_drop_payload_failure(); None } } }) } -fn log_desktop_image_drop_payload_failure(error: &str) -> bool { - eprintln!("desktop host event failed for file.imageDropped.payload: {error}"); +fn log_desktop_image_drop_payload_failure() -> bool { + eprintln!("desktop host event failed for file.imageDropped.payload"); false } @@ -129,9 +129,12 @@ mod tests { #[test] fn image_drop_payload_failure_reports_failure() { - assert!(!log_desktop_image_drop_payload_failure( - "image bytes do not match MIME", - )); + assert!(!log_desktop_image_drop_payload_failure()); + } + + #[test] + fn image_drop_payload_failure_logs_stable_label_only() { + assert!(!log_desktop_image_drop_payload_failure()); } #[test] diff --git a/docs/project-memory/shared-memory/decision-log.md b/docs/project-memory/shared-memory/decision-log.md index e96567ca1..77a2f3b1b 100644 --- a/docs/project-memory/shared-memory/decision-log.md +++ b/docs/project-memory/shared-memory/decision-log.md @@ -36,6 +36,7 @@ - 背景:桌面壳拖入图片时会按路径列表寻找第一个真实可导入图片;扩展名合法但内容损坏、超限或读取失败的文件如果被静默跳过,用户只会看到拖拽无反应,开发侧也缺少排障线索。 - 决策:`first_valid_desktop_image_drop_payload(...)` 对扩展名符合图片候选但 payload 组装失败的路径必须记录 `desktop host event failed for file.imageDropped.payload`,然后继续尝试后续候选;目录、非图片扩展名或没有任何有效图片仍保持不派发 `file.imageDropped` payload。 +- 2026-06-21 调整:拖拽图片 payload 组装失败日志只记录固定 `file.imageDropped.payload` 标签,不把本机读取错误、文件内容校验错误或其它 payload 细节写入可分发桌面壳 stderr;配置检查拒绝重新输出 `: {error}`。 - 影响范围:`apps/desktop-shell/src-tauri/src/shell/file_drop.rs`、`apps/desktop-shell/scripts/check-config.mjs`、宿主壳方案文档。 - 验证方式:`cargo test --manifest-path apps/desktop-shell/src-tauri/Cargo.toml shell::file_drop`、`npm run desktop-shell:typecheck`、`npm run check:native-shells`、`npm run check:encoding`、`git diff --check`。 - 关联文档:`docs/【前端架构】ExpoReactNative与Tauri宿主壳方案-2026-06-17.md`、`docs/【前端架构】宿主壳能力统一协议-2026-06-17.md`。 diff --git a/docs/【前端架构】ExpoReactNative与Tauri宿主壳方案-2026-06-17.md b/docs/【前端架构】ExpoReactNative与Tauri宿主壳方案-2026-06-17.md index faddd4b44..8b0dca854 100644 --- a/docs/【前端架构】ExpoReactNative与Tauri宿主壳方案-2026-06-17.md +++ b/docs/【前端架构】ExpoReactNative与Tauri宿主壳方案-2026-06-17.md @@ -415,7 +415,7 @@ GameBridge 禁止: - 实现 runtime、openExternalUrl、clipboard、share fallback、窗口标题同步。 - 验证 macOS / Windows / Linux 至少一条本地 smoke。 -当前状态:已新增 `apps/desktop-shell/`,Tauri dev 直接加载本地主站 Vite,release 打包根 `dist` 主站资产。Rust 侧只把 `host_bridge_request` command 授给主窗口,`appearance.getColorScheme` 由 Rust 内部读取主窗口 `theme()` 并返回 `light` / `dark` / `unknown`,不设置或覆盖系统主题;`app.lifecycle` 由主窗口 focus / blur、窗口 resize 后的状态读取、托盘隐藏 / 恢复和页面加载重放注入统一状态,不开放 Tauri event 插件给前端。桌面壳只向 H5 派发共享契约里的 `active` / `inactive` / `background`,隐藏到托盘和系统最小化都归一为 `background`,`hidden`、`minimized`、`focused`、`blurred` 只写入 `nativeState` 便于排障;H5 通过 `useHostLifecycleActive()` 统一归一窗口焦点和后台状态,WebAudio 背景音乐和拼图、抓大鹅等固定玩法 `