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) <noreply@anthropic.com>
This commit is contained in:
@@ -17,6 +17,7 @@ Diese Liste beschreibt in einfachen Worten, was sich von Version zu Version an T
|
|||||||
### Behoben
|
### 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: 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
|
## 1.5.2 – 2026-09-28
|
||||||
|
|
||||||
|
|||||||
@@ -694,6 +694,16 @@ fn get_client_info() -> String {
|
|||||||
client_info_label(env!("CARGO_PKG_VERSION"), env!("APP_COMMIT"))
|
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<String> {
|
||||||
|
match url.scheme() {
|
||||||
|
"http" | "https" => Some(url.to_string()),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Hauptfenster nach vorne holen. Ein minimiertes Fenster (z. B. per Win+D)
|
/// Hauptfenster nach vorne holen. Ein minimiertes Fenster (z. B. per Win+D)
|
||||||
/// wird zuerst wiederhergestellt.
|
/// wird zuerst wiederhergestellt.
|
||||||
fn show_main_window(app: &AppHandle) {
|
fn show_main_window(app: &AppHandle) {
|
||||||
@@ -750,6 +760,20 @@ pub fn run() {
|
|||||||
.center()
|
.center()
|
||||||
.decorations(true)
|
.decorations(true)
|
||||||
.resizable(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| {
|
.on_download(|webview, event| {
|
||||||
if let tauri::webview::DownloadEvent::Requested { url, .. } = event {
|
if let tauri::webview::DownloadEvent::Requested { url, .. } = event {
|
||||||
let _ = webview
|
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]
|
#[test]
|
||||||
fn parse_server_url_gueltige_adresse() {
|
fn parse_server_url_gueltige_adresse() {
|
||||||
let parsed = parse_server_url("https://tessera.ctl.de").unwrap();
|
let parsed = parse_server_url("https://tessera.ctl.de").unwrap();
|
||||||
|
|||||||
Reference in New Issue
Block a user