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:
@@ -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<String> {
|
||||
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();
|
||||
|
||||
Reference in New Issue
Block a user