diff --git a/apps/desktop-shell/scripts/check-config.mjs b/apps/desktop-shell/scripts/check-config.mjs index e6245ba9b..cf10f570d 100644 --- a/apps/desktop-shell/scripts/check-config.mjs +++ b/apps/desktop-shell/scripts/check-config.mjs @@ -2511,16 +2511,25 @@ for (const snippet of [ 'WINDOW_TITLE_MAX_LENGTH', 'normalize_window_title', 'window_title_from_request', + 'window_title_unavailable_response', 'required_string_payload(request, "title")', 'window.set_title(&title)', '"title is required"', + '"window title unavailable"', 'window_title_request_rejects_missing_or_invalid_payload', 'window_title_request_trims_and_truncates_shared_boundary', + 'window_title_unavailable_response_is_stable', ]) { if (!desktopHostBridgeTitleSource.includes(snippet)) { throw new Error(`desktop shell title module is missing ${snippet}`); } } +if ( + desktopHostBridgeTitleSource.includes('error.to_string()') || + desktopHostBridgeTitleSource.includes('"main window not found"') +) { + throw new Error('desktop shell title module must hide native window errors'); +} if ( !desktopHostBridgeDispatchSource.includes( 'show_desktop_local_notification(&app, &request)', diff --git a/apps/desktop-shell/src-tauri/src/host_bridge/title.rs b/apps/desktop-shell/src-tauri/src/host_bridge/title.rs index 43a6b0f45..23438947a 100644 --- a/apps/desktop-shell/src-tauri/src/host_bridge/title.rs +++ b/apps/desktop-shell/src-tauri/src/host_bridge/title.rs @@ -36,12 +36,16 @@ pub(crate) fn set_desktop_host_bridge_window_title( match app.get_webview_window("main") { Some(window) => match window.set_title(&title) { Ok(()) => ok(request.id.clone(), json!(true)), - Err(error) => failed(request.id.clone(), "host_error", error.to_string()), + Err(_) => window_title_unavailable_response(request), }, - None => failed(request.id.clone(), "host_error", "main window not found"), + None => window_title_unavailable_response(request), } } +fn window_title_unavailable_response(request: &HostBridgeRequest) -> HostBridgeResponse { + failed(request.id.clone(), "host_error", "window title unavailable") +} + #[cfg(test)] mod tests { use super::*; @@ -98,4 +102,14 @@ mod tests { assert_eq!(title.chars().count(), WINDOW_TITLE_MAX_LENGTH); assert!(title.chars().all(|character| character == '甲')); } + + #[test] + fn window_title_unavailable_response_is_stable() { + let response = window_title_unavailable_response(&request("app.setTitle")); + + assert!(!response.ok); + let error = response.error.expect("window title error"); + assert_eq!(error.code, "host_error"); + assert_eq!(error.message, "window title unavailable"); + } }