9e8b01211b
桌面壳外观读取失败只记录固定阶段标签 扩展桌面壳配置门禁禁止外观日志输出 Tauri 错误细节 补充宿主壳方案和共享决策中的外观诊断边界
82 lines
2.4 KiB
Rust
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"));
|
|
}
|
|
}
|