Files
Genarrative/apps/desktop-shell/src-tauri/src/host_bridge/appearance.rs
T
kdletters 9e8b01211b 收口桌面壳外观诊断日志
桌面壳外观读取失败只记录固定阶段标签

扩展桌面壳配置门禁禁止外观日志输出 Tauri 错误细节

补充宿主壳方案和共享决策中的外观诊断边界
2026-06-21 04:26:15 +08:00

82 lines
2.4 KiB
Rust

use crate::host_bridge::protocol::{failed, ok, HostBridgeRequest, HostBridgeResponse};
use crate::shell::webview::color_scheme_from_theme;
use serde_json::json;
use tauri::Manager;
pub(crate) fn desktop_appearance_color_scheme(
app: &tauri::AppHandle,
request: &HostBridgeRequest,
) -> HostBridgeResponse {
match app.get_webview_window("main") {
Some(window) => match window.theme() {
Ok(theme) => ok_color_scheme(request, color_scheme_from_theme(theme)),
Err(_error) => {
log_desktop_appearance_failure("theme");
appearance_unavailable_response(request)
}
},
None => {
log_desktop_appearance_failure("window");
appearance_unavailable_response(request)
}
}
}
fn ok_color_scheme(request: &HostBridgeRequest, color_scheme: &'static str) -> HostBridgeResponse {
ok(
request.id.clone(),
json!({
"colorScheme": color_scheme
}),
)
}
fn appearance_unavailable_response(request: &HostBridgeRequest) -> HostBridgeResponse {
failed(request.id.clone(), "host_error", "appearance unavailable")
}
fn log_desktop_appearance_failure(label: &str) -> bool {
eprintln!("desktop appearance failed for {label}");
false
}
#[cfg(test)]
mod tests {
use super::*;
use crate::host_bridge::protocol::request;
#[test]
fn ok_color_scheme_reports_contract_shape() {
let response = ok_color_scheme(&request("appearance.getColorScheme"), "dark");
assert!(response.ok);
assert_eq!(
response.result.expect("appearance result"),
json!({
"colorScheme": "dark"
})
);
}
#[test]
fn appearance_unavailable_response_is_stable() {
let response = appearance_unavailable_response(&request("appearance.getColorScheme"));
assert!(!response.ok);
let error = response.error.expect("appearance error");
assert_eq!(error.code, "host_error");
assert_eq!(error.message, "appearance unavailable");
}
#[test]
fn appearance_failures_are_logged_without_exposing_native_detail() {
assert!(!log_desktop_appearance_failure("theme"));
assert!(!log_desktop_appearance_failure("window"));
}
#[test]
fn appearance_failures_log_stable_label_only() {
assert!(!log_desktop_appearance_failure("theme"));
}
}