diff --git a/src/app/browser/window.rs b/src/app/browser/window.rs index 69909a7c..10d55f32 100644 --- a/src/app/browser/window.rs +++ b/src/app/browser/window.rs @@ -129,7 +129,7 @@ impl Window { action.open.on_activate({ let tab = tab.clone(); move |position, request| { - tab.open(position, &request, true); + tab.open(position, request, true); } }); diff --git a/src/app/browser/window/action/open.rs b/src/app/browser/window/action/open.rs index 98649d12..0888f557 100644 --- a/src/app/browser/window/action/open.rs +++ b/src/app/browser/window/action/open.rs @@ -54,7 +54,7 @@ impl Open { // Actions /// Formatted action connector for external implementation - pub fn on_activate(&self, callback: impl Fn(Option, String) + 'static) -> SignalHandlerId { + pub fn on_activate(&self, callback: impl Fn(Option, &str) + 'static) -> SignalHandlerId { use gtk::{prelude::FileExt, FileDialog, Window}; use std::rc::Rc; @@ -80,7 +80,7 @@ impl Open { } else { Some(state) }, - format!("file://{}", file.path().unwrap().to_str().unwrap()), + file.path().unwrap().to_str().unwrap(), ) } } diff --git a/src/app/browser/window/tab/item/client.rs b/src/app/browser/window/tab/item/client.rs index 81f4fa55..c1a3d275 100644 --- a/src/app/browser/window/tab/item/client.rs +++ b/src/app/browser/window/tab/item/client.rs @@ -57,34 +57,42 @@ impl Client { snap_history(&self.page, None); } - // run async resolver to detect Uri, scheme-less host, or search query - lookup(&self.profile, request, self.cancellable(), { - let driver = self.driver.clone(); - let page = self.page.clone(); - move |feature, cancellable, result| { - match result { - // route by scheme - Ok(uri) => match uri.scheme().as_str() { - "file" => driver.file.handle(uri, feature, cancellable), - "gemini" | "titan" => driver.gemini.handle(uri, feature, cancellable), - scheme => { - // no scheme match driver, complete with failure message - let status = page.content.to_status_failure(); - status.set_description(Some(&format!( - "Scheme `{scheme}` yet not supported" - ))); - page.set_title(&status.title()); - page.set_progress(0.0); - } - }, - // begin redirection to new address suggested - Err(uri) => page - .item_action - .load - .activate(Some(&uri.to_string()), false), + // try autocomplete scheme if the request match local filename + if std::path::Path::new(&request).exists() { + self.page + .item_action + .load + .activate(Some(&format!("file://{request}")), is_snap_history) + } else { + // run async resolver to detect Uri, scheme-less host, or search query + lookup(&self.profile, request, self.cancellable(), { + let driver = self.driver.clone(); + let page = self.page.clone(); + move |feature, cancellable, result| { + match result { + // route by scheme + Ok(uri) => match uri.scheme().as_str() { + "file" => driver.file.handle(uri, feature, cancellable), + "gemini" | "titan" => driver.gemini.handle(uri, feature, cancellable), + scheme => { + // no scheme match driver, complete with failure message + let status = page.content.to_status_failure(); + status.set_description(Some(&format!( + "Scheme `{scheme}` yet not supported" + ))); + page.set_title(&status.title()); + page.set_progress(0.0); + } + }, + // begin redirection to new address suggested + Err(uri) => page + .item_action + .load + .activate(Some(&uri.to_string()), false), + } } - } - }) + }) + } } /// Get new [Cancellable](https://docs.gtk.org/gio/class.Cancellable.html) by cancel previous one