diff --git a/apps/desktop-shell/scripts/check-config.mjs b/apps/desktop-shell/scripts/check-config.mjs index aec08b4a5..e6245ba9b 100644 --- a/apps/desktop-shell/scripts/check-config.mjs +++ b/apps/desktop-shell/scripts/check-config.mjs @@ -2478,13 +2478,22 @@ for (const snippet of [ 'BADGE_COUNT_MAX', 'fn badge_count_payload', 'set_desktop_app_badge_count', + 'badge_unavailable_response', 'ok(request.id.clone(), json!(true))', '"count must be an integer between 0 and 99999"', + '"badge unavailable"', + 'badge_unavailable_response_is_stable', ]) { if (!desktopHostBridgeBadgeSource.includes(snippet)) { throw new Error(`desktop shell badge module is missing ${snippet}`); } } +if ( + desktopHostBridgeBadgeSource.includes('error.to_string()') || + desktopHostBridgeBadgeSource.includes('"main window not found"') +) { + throw new Error('desktop shell badge module must hide native window errors'); +} if (!desktopHostBridgeBadgeSource.match(/window\s*\.\s*set_badge_count\s*\(\s*count\s*\)/)) { throw new Error('desktop shell badge module must call window.set_badge_count(count)'); } diff --git a/apps/desktop-shell/src-tauri/src/host_bridge/badge.rs b/apps/desktop-shell/src-tauri/src/host_bridge/badge.rs index 5103a797f..c518b3cae 100644 --- a/apps/desktop-shell/src-tauri/src/host_bridge/badge.rs +++ b/apps/desktop-shell/src-tauri/src/host_bridge/badge.rs @@ -39,15 +39,19 @@ pub(crate) fn set_desktop_app_badge_count( Err(response) => return response, }; let Some(window) = app.get_webview_window("main") else { - return failed(request.id.clone(), "host_error", "main window not found"); + return badge_unavailable_response(request); }; match window.set_badge_count(count) { Ok(()) => ok(request.id.clone(), json!(true)), - Err(error) => failed(request.id.clone(), "host_error", error.to_string()), + Err(_) => badge_unavailable_response(request), } } +fn badge_unavailable_response(request: &HostBridgeRequest) -> HostBridgeResponse { + failed(request.id.clone(), "host_error", "badge unavailable") +} + #[cfg(test)] mod tests { use super::*; @@ -80,4 +84,14 @@ mod tests { ); } } + + #[test] + fn badge_unavailable_response_is_stable() { + let response = badge_unavailable_response(&request("app.setBadgeCount")); + + assert!(!response.ok); + let error = response.error.expect("badge error"); + assert_eq!(error.code, "host_error"); + assert_eq!(error.message, "badge unavailable"); + } }