From 740d329785337bb629ccded08df0a1d21ffa8504 Mon Sep 17 00:00:00 2001 From: kdletters Date: Sat, 20 Jun 2026 12:12:55 +0800 Subject: [PATCH] =?UTF-8?q?=E9=94=81=E5=AE=9A=E6=A1=8C=E9=9D=A2=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E6=9D=83=E9=99=90=E4=B8=8D=E5=8F=AF=E7=94=A8=E8=BE=B9?= =?UTF-8?q?=E7=95=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 桌面通知桥接把权限状态读取失败转为稳定 host_error 桌面通知桥接把权限请求失败转为稳定 host_error 桌面通知单测覆盖权限不可用错误载荷 桌面壳配置检查反查通知权限不可用边界 --- apps/desktop-shell/scripts/check-config.mjs | 3 +++ .../src/host_bridge/notifications.rs | 23 +++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/apps/desktop-shell/scripts/check-config.mjs b/apps/desktop-shell/scripts/check-config.mjs index bbba1db18..2a36d2ed5 100644 --- a/apps/desktop-shell/scripts/check-config.mjs +++ b/apps/desktop-shell/scripts/check-config.mjs @@ -2497,14 +2497,17 @@ for (const snippet of [ 'HOST_BRIDGE_LOCAL_NOTIFICATION_BODY_MAX_LENGTH', 'DesktopNotificationPermissionAction', 'desktop_notification_permission_action', + 'notification_permission_unavailable_response', 'PermissionState::Granted', 'PermissionState::Denied', 'PermissionState::Prompt | PermissionState::PromptWithRationale', 'desktop_notification_delivered_to_system_result', 'json!({"action": HOST_BRIDGE_LOCAL_NOTIFICATION_DELIVERED_TO_SYSTEM_ACTION})', 'local_notification_payload_truncates_to_shared_contract_limits', + 'notification_permission_unavailable_response_is_stable', '"a".repeat(HOST_BRIDGE_LOCAL_NOTIFICATION_TITLE_MAX_LENGTH)', '"b".repeat(HOST_BRIDGE_LOCAL_NOTIFICATION_BODY_MAX_LENGTH)', + '"notification permission unavailable"', '"notification permission denied"', 'app.notification().builder()', ]) { diff --git a/apps/desktop-shell/src-tauri/src/host_bridge/notifications.rs b/apps/desktop-shell/src-tauri/src/host_bridge/notifications.rs index 0adee5ccb..7cd288738 100644 --- a/apps/desktop-shell/src-tauri/src/host_bridge/notifications.rs +++ b/apps/desktop-shell/src-tauri/src/host_bridge/notifications.rs @@ -89,6 +89,14 @@ fn desktop_notification_delivered_to_system_result() -> serde_json::Value { json!({"action": HOST_BRIDGE_LOCAL_NOTIFICATION_DELIVERED_TO_SYSTEM_ACTION}) } +fn notification_permission_unavailable_response(request: &HostBridgeRequest) -> HostBridgeResponse { + failed( + request.id.clone(), + "host_error", + "notification permission unavailable", + ) +} + pub(crate) fn show_desktop_local_notification( app: &tauri::AppHandle, request: &HostBridgeRequest, @@ -100,7 +108,7 @@ pub(crate) fn show_desktop_local_notification( let notification_manager = app.notification(); let permission_state = notification_manager .permission_state() - .map_err(|error| failed(request.id.clone(), "host_error", error.to_string())); + .map_err(|_| notification_permission_unavailable_response(request)); let permission_state = match permission_state { Ok(permission_state) => permission_state, Err(response) => return response, @@ -109,7 +117,7 @@ pub(crate) fn show_desktop_local_notification( if permission_action == DesktopNotificationPermissionAction::Request { let requested_state = notification_manager .request_permission() - .map_err(|error| failed(request.id.clone(), "host_error", error.to_string())); + .map_err(|_| notification_permission_unavailable_response(request)); let requested_state = match requested_state { Ok(requested_state) => requested_state, Err(response) => return response, @@ -181,6 +189,17 @@ mod tests { ); } + #[test] + fn notification_permission_unavailable_response_is_stable() { + let request = request("notification.showLocal"); + + let response = notification_permission_unavailable_response(&request); + let error = response.error.expect("error"); + + assert_eq!(error.code, "host_error"); + assert_eq!(error.message, "notification permission unavailable"); + } + #[test] fn local_notification_payload_rejects_empty_and_control_text() { let mut empty = request("notification.showLocal");