diff --git a/Cargo.lock b/Cargo.lock index 34490bd..6630a75 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2852,7 +2852,6 @@ dependencies = [ "muda", "oauth2", "reqwest 0.13.2", - "serde", "serde_json", "simple_logger", "static_vcruntime", diff --git a/Cargo.toml b/Cargo.toml index 9628edf..5551f1a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,6 @@ reqwest = { version = "0.13.2", default-features = false, features = [ "json", "rustls", ] } -serde = { version = "1.0.228", default-features = false, features = ["derive"] } serde_json = "1.0.149" simple_logger = { version = "5.2.0", default-features = false, features = [ "stderr", diff --git a/src/main.rs b/src/main.rs index ae0002f..d84632f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -168,12 +168,16 @@ fn main() -> anyhow::Result<()> { Event::UserEvent(UserEvent::Failure(error)) => { log::error!("{error}"); - webview.evaluate_script(&render_error_view(error)).unwrap(); + if let Err(e) = webview.evaluate_script(&render_error_view(error)) { + log::error!("Failed to render error view: {e}"); + } } Event::UserEvent(UserEvent::Tokens(token)) => { println!("{token}"); - webview.evaluate_script(&render_tokens_view(token)).unwrap(); + if let Err(e) = webview.evaluate_script(&render_tokens_view(token)) { + log::error!("Failed to render tokens view: {e}"); + } } Event::UserEvent(UserEvent::LoginCanceled) => { @@ -244,36 +248,61 @@ fn handle_redirect(url: &Url, client: auth::Client) -> UserEvent { } } +// Encode a string as a JSON string literal for safe JS interpolation. +#[expect(clippy::unwrap_used)] // serde_json string serialization is infallible +fn js_string(s: &str) -> String { + serde_json::to_string(s).unwrap() +} + fn render_error_view(error: anyhow::Error) -> String { - r#" - const html = ` -
{msg}
- `; - document.querySelector("h1.h1").outerHTML = html; - "# - .replace("{msg}", &error.to_string()) + let msg = js_string(&error.to_string()); + format!( + r#"(function() {{ + var target = document.querySelector("h1.h1"); + var h4 = document.createElement("h4"); + h4.style.textAlign = "center"; + h4.textContent = "An error occurred. Please try again ..."; + var p = document.createElement("p"); + p.style.cssText = "text-align:center;color:red;margin-bottom:20px"; + p.textContent = {msg}; + target.replaceWith(h4, p); + }})()"# + ) } fn render_tokens_view(tokens: auth::Tokens) -> String { - r#" - const html = ` -