From 4ba871c5d2eb3fbb8db56c8d8f9916e65d3e34ac Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Wed, 9 Jul 2025 17:08:38 -0300 Subject: [PATCH] fix(core): loading remote URLs on mobile, closes #13461 (#13782) --- .changes/mobile-external-urls.md | 5 ++++ crates/tauri/src/manager/webview.rs | 41 ++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 .changes/mobile-external-urls.md diff --git a/.changes/mobile-external-urls.md b/.changes/mobile-external-urls.md new file mode 100644 index 000000000..c55ac634c --- /dev/null +++ b/.changes/mobile-external-urls.md @@ -0,0 +1,5 @@ +--- +"tauri": patch:bug +--- + +Fixes loading external URLs in mobile development mode. diff --git a/crates/tauri/src/manager/webview.rs b/crates/tauri/src/manager/webview.rs index 1df052f59..2590b009a 100644 --- a/crates/tauri/src/manager/webview.rs +++ b/crates/tauri/src/manager/webview.rs @@ -413,10 +413,11 @@ impl WebviewManager { #[allow(unused_mut)] // mut url only for the data-url parsing let mut url = match &pending.webview_attributes.url { WebviewUrl::App(path) => { - let url = if PROXY_DEV_SERVER { + let app_url = app_manager.get_url(pending.webview_attributes.use_https_scheme); + let url = if PROXY_DEV_SERVER && is_local_network_url(&app_url) { Cow::Owned(Url::parse("tauri://localhost").unwrap()) } else { - app_manager.get_url(pending.webview_attributes.use_https_scheme) + app_url }; // ignore "index.html" just to simplify the url if path.to_str() != Some("index.html") { @@ -431,13 +432,13 @@ impl WebviewManager { } WebviewUrl::External(url) => { let config_url = app_manager.get_url(pending.webview_attributes.use_https_scheme); - let is_local = config_url.make_relative(url).is_some(); + let is_app_url = config_url.make_relative(url).is_some(); let mut url = url.clone(); - if is_local && PROXY_DEV_SERVER { - url.set_scheme("tauri").unwrap(); - url.set_host(Some("localhost")).unwrap(); + if is_app_url && PROXY_DEV_SERVER && is_local_network_url(&url) { + Url::parse("tauri://localhost").unwrap() + } else { + url } - url } WebviewUrl::CustomProtocol(url) => url.clone(), @@ -710,3 +711,29 @@ fn on_webview_event(webview: &Webview, event: &WebviewEvent) -> c Ok(()) } + +fn is_local_network_url(url: &url::Url) -> bool { + match url.host() { + Some(url::Host::Domain(s)) => s == "localhost", + Some(url::Host::Ipv4(_)) | Some(url::Host::Ipv6(_)) => true, + None => false, + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn local_network_url() { + assert!(is_local_network_url(&"http://localhost".parse().unwrap())); + assert!(is_local_network_url( + &"http://127.0.0.1:8080".parse().unwrap() + )); + assert!(is_local_network_url( + &"https://192.168.3.17".parse().unwrap() + )); + + assert!(!is_local_network_url(&"https://tauri.app".parse().unwrap())); + } +}