From 76a923450fd2f492ec046d5945a6965c8e94b707 Mon Sep 17 00:00:00 2001 From: Schalli Date: Tue, 29 Sep 2026 10:08:41 +0200 Subject: [PATCH] fix(desktop): neue Fenster im System-Browser oeffnen Die Webansicht verwarf window.open und Links mit target=_blank still: Suche-Widget und "In neuem Tab oeffnen" (XFrame, eigene Module, Favoriten) taten im Client nichts. on_new_window reicht http/https- Adressen an den System-Browser weiter und lehnt das neue Fenster ab; andere Schemata werden verworfen (external_target, mit Test). Co-Authored-By: Claude Opus 5.5 (1M context) --- CHANGELOG.md | 1 + apps/desktop/src-tauri/src/lib.rs | 46 +++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f4a263..00c66f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ Diese Liste beschreibt in einfachen Worten, was sich von Version zu Version an T ### Behoben - Desktop-App: Tessera startet nicht mehr doppelt. Wird die App ein zweites Mal gestartet – etwa beim Anmelden an Windows –, holt sie nur das vorhandene Fenster nach vorne; im Infobereich erscheint nur noch ein Symbol. +- Desktop-App: Die Suche im Such-Widget und Knöpfe wie „In neuem Tab öffnen“ funktionieren jetzt auch in der Desktop-App – die Seite öffnet sich in Ihrem normalen Browser. Bisher passierte dort beim Klick nichts. ## 1.5.2 – 2026-09-28 diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index 7f2364c..c165044 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -694,6 +694,16 @@ fn get_client_info() -> String { client_info_label(env!("CARGO_PKG_VERSION"), env!("APP_COMMIT")) } +/// Ziel fuer den System-Browser, wenn die Seite ein neues Fenster verlangt +/// (`window.open`, Links mit `target="_blank"`). Nur http/https -- andere +/// Schemata (file:, javascript:, eigene Protokolle) werden verworfen. +fn external_target(url: &tauri::Url) -> Option { + match url.scheme() { + "http" | "https" => Some(url.to_string()), + _ => None, + } +} + /// Hauptfenster nach vorne holen. Ein minimiertes Fenster (z. B. per Win+D) /// wird zuerst wiederhergestellt. fn show_main_window(app: &AppHandle) { @@ -750,6 +760,20 @@ pub fn run() { .center() .decorations(true) .resizable(true) + // Neue Fenster (Suche-Widget per `window.open`, „In neuem Tab + // öffnen“ bei XFrame/eigenen Modulen/Favoriten) verwarf die + // Webansicht still -- Nutzer, 29.09.2026: Suche im Client ohne + // Funktion. Jetzt gehen sie wie im Browser-Tab nach aussen, in den + // System-Browser; die App selbst oeffnet kein zweites Fenster. + .on_new_window({ + let handle = app.handle().clone(); + move |url, _features| { + if let Some(target) = external_target(&url) { + let _ = handle.opener().open_url(target, None::<&str>); + } + tauri::webview::NewWindowResponse::Deny + } + }) .on_download(|webview, event| { if let tauri::webview::DownloadEvent::Requested { url, .. } = event { let _ = webview @@ -1226,6 +1250,28 @@ mod tests { ); } + #[test] + fn external_target_nur_http_und_https() { + let https = tauri::Url::parse("https://www.google.com/search?q=tessera").unwrap(); + assert_eq!( + external_target(&https).as_deref(), + Some("https://www.google.com/search?q=tessera") + ); + let http = tauri::Url::parse("http://intranet.local/").unwrap(); + assert_eq!( + external_target(&http).as_deref(), + Some("http://intranet.local/") + ); + for bad in [ + "file:///C:/Windows/system32/calc.exe", + "javascript:alert(1)", + "ms-settings:privacy", + ] { + let url = tauri::Url::parse(bad).unwrap(); + assert_eq!(external_target(&url), None, "{bad}"); + } + } + #[test] fn parse_server_url_gueltige_adresse() { let parsed = parse_server_url("https://tessera.ctl.de").unwrap();