fix redirection info reset

This commit is contained in:
yggverse 2025-03-27 22:47:38 +02:00
parent 0d202a866a
commit 01ea693c03
12 changed files with 59 additions and 36 deletions

View File

@ -272,13 +272,14 @@ impl Tab {
/// Reload page at `i32` position or selected page on `None` given /// Reload page at `i32` position or selected page on `None` given
pub fn reload(&self, page_position: Option<i32>) { pub fn reload(&self, page_position: Option<i32>) {
if let Some(item) = self.item(page_position) { if let Some(item) = self.item(page_position) {
item.client.handle(&item.page.navigation.request(), true); item.client
.handle(&item.page.navigation.request(), true, false);
} }
} }
pub fn open(&self, page_position: Option<i32>, request: &str) { pub fn open(&self, page_position: Option<i32>, request: &str) {
if let Some(item) = self.item(page_position) { if let Some(item) = self.item(page_position) {
item.action.load.activate(Some(request), true); item.action.load.activate(Some(request), true, false);
} }
} }

View File

@ -86,7 +86,7 @@ impl Item {
if let Some(uri) = page.navigation.home() { if let Some(uri) = page.navigation.home() {
let request = uri.to_string(); let request = uri.to_string();
page.navigation.set_request(&request); page.navigation.set_request(&request);
client.handle(&request, true); client.handle(&request, true, false);
} }
} }
}); });
@ -94,10 +94,10 @@ impl Item {
action.load.connect_activate({ action.load.connect_activate({
let page = page.clone(); let page = page.clone();
let client = client.clone(); let client = client.clone();
move |request, is_snap_history| { move |request, is_snap_history, is_redirect| {
if let Some(request) = request { if let Some(request) = request {
page.navigation.set_request(&request); page.navigation.set_request(&request);
client.handle(&request, is_snap_history); client.handle(&request, is_snap_history, is_redirect);
} }
} }
}); });
@ -110,7 +110,7 @@ impl Item {
action.reload.connect_activate({ action.reload.connect_activate({
let page = page.clone(); let page = page.clone();
let client = client.clone(); let client = client.clone();
move |_, _| client.handle(&page.navigation.request(), true) move |_, _| client.handle(&page.navigation.request(), true, false)
}); });
action.reload.connect_enabled_notify({ action.reload.connect_enabled_notify({
@ -147,7 +147,7 @@ impl Item {
if let Some(request) = request { if let Some(request) = request {
page.navigation.set_request(request); page.navigation.set_request(request);
if is_load { if is_load {
client.handle(request, true) client.handle(request, true, false)
} }
} }

View File

@ -40,7 +40,7 @@ impl Action {
let history = Rc::new(History::build({ let history = Rc::new(History::build({
let load = load.clone(); let load = load.clone();
move |request| load.activate(Some(&request), false) move |request| load.activate(Some(&request), false, false)
})); }));
Self { Self {

View File

@ -23,7 +23,7 @@ impl Load {
Self { Self {
simple_action: SimpleAction::new( simple_action: SimpleAction::new(
&uuid_string_random(), &uuid_string_random(),
Some(&<(String, bool)>::static_variant_type()), Some(&<(String, bool, bool)>::static_variant_type()),
), ),
} }
} }
@ -32,9 +32,9 @@ impl Load {
/// Emit [activate](https://docs.gtk.org/gio/signal.SimpleAction.activate.html) signal /// Emit [activate](https://docs.gtk.org/gio/signal.SimpleAction.activate.html) signal
/// with formatted for this action [Variant](https://docs.gtk.org/glib/struct.Variant.html) value /// with formatted for this action [Variant](https://docs.gtk.org/glib/struct.Variant.html) value
pub fn activate(&self, request: Option<&str>, is_history: bool) { pub fn activate(&self, request: Option<&str>, is_snap_history: bool, is_redirect: bool) {
self.simple_action.activate(Some( self.simple_action.activate(Some(
&(request.unwrap_or_default(), is_history).to_variant(), &(request.unwrap_or_default(), is_snap_history, is_redirect).to_variant(),
)); ));
} }
@ -42,19 +42,20 @@ impl Load {
/// Define callback function for /// Define callback function for
/// [SimpleAction::activate](https://docs.gtk.org/gio/signal.SimpleAction.activate.html) signal /// [SimpleAction::activate](https://docs.gtk.org/gio/signal.SimpleAction.activate.html) signal
pub fn connect_activate(&self, callback: impl Fn(Option<GString>, bool) + 'static) { pub fn connect_activate(&self, callback: impl Fn(Option<GString>, bool, bool) + 'static) {
self.simple_action.connect_activate(move |_, this| { self.simple_action.connect_activate(move |_, this| {
let (request, is_history) = this let (request, is_snap_history, is_redirect) = this
.expect("Expected (`request`,`is_history`) variant") .expect("Expected (`request`,`is_snap_history`) variant")
.get::<(String, bool)>() .get::<(String, bool, bool)>()
.expect("Parameter type does not match (`String`,`bool`) tuple"); .expect("Parameter type does not match (`String`,`bool`,`bool`) tuple");
callback( callback(
match request.is_empty() { match request.is_empty() {
true => None, true => None,
false => Some(request.into()), false => Some(request.into()),
}, },
is_history, is_snap_history,
is_redirect,
) )
}); });
} }

View File

@ -36,7 +36,7 @@ impl Client {
/// Route tab item `request` to protocol driver /// Route tab item `request` to protocol driver
/// * or `navigation` entry if the value not provided /// * or `navigation` entry if the value not provided
pub fn handle(&self, request: &str, is_snap_history: bool) { pub fn handle(&self, request: &str, is_snap_history: bool, is_redirect: bool) {
self.page.escape(); self.page.escape();
// Initially disable find action // Initially disable find action
@ -63,11 +63,13 @@ impl Client {
"file" => driver "file" => driver
.file .file
.handle(uri, feature, cancellable, is_snap_history), .handle(uri, feature, cancellable, is_snap_history),
"gemini" | "titan" => { "gemini" | "titan" => driver.gemini.handle(
driver uri,
.gemini feature,
.handle(uri, feature, cancellable, is_snap_history) cancellable,
} is_snap_history,
is_redirect,
),
scheme => { scheme => {
// no scheme match driver, complete with failure message // no scheme match driver, complete with failure message
let status = page.content.to_status_failure(); let status = page.content.to_status_failure();
@ -79,10 +81,11 @@ impl Client {
} }
}, },
// begin redirection to new address suggested // begin redirection to new address suggested
Err(query) => page Err(query) => {
.item_action page.item_action
.load .load
.activate(Some(&query), is_snap_history), .activate(Some(&query), is_snap_history, true)
}
} }
} }
}) })

View File

@ -26,6 +26,7 @@ impl Directory {
file.path().unwrap().to_str().unwrap() file.path().unwrap().to_str().unwrap()
)), )),
is_snap_history, is_snap_history,
false,
) )
} }
}, },

View File

@ -39,7 +39,7 @@ impl Gemini {
p.set_progress(match event { p.set_progress(match event {
// 0.1 reserved for handle begin // 0.1 reserved for handle begin
SocketClientEvent::Resolving => { SocketClientEvent::Resolving => {
i.reset().add_event("Resolving".to_string()); i.add_event("Resolving".to_string());
0.2 0.2
} }
SocketClientEvent::Resolved => { SocketClientEvent::Resolved => {
@ -94,8 +94,15 @@ impl Gemini {
feature: Rc<Feature>, feature: Rc<Feature>,
cancellable: Cancellable, cancellable: Cancellable,
is_snap_history: bool, is_snap_history: bool,
is_redirect: bool,
) { ) {
use ggemini::client::connection::request::{Mode, Request}; use ggemini::client::connection::request::{Mode, Request};
self.page
.navigation
.request
.info
.borrow_mut()
.reset(!is_redirect);
match uri.scheme().as_str() { match uri.scheme().as_str() {
"gemini" => handle( "gemini" => handle(
self, self,
@ -109,6 +116,8 @@ impl Gemini {
is_snap_history, is_snap_history,
), ),
"titan" => { "titan" => {
self.page.set_title("Titan input");
self.page.set_progress(0.0);
self.page.input.set_new_titan({ self.page.input.set_new_titan({
let this = Self { let this = Self {
client: self.client.clone(), client: self.client.clone(),
@ -131,9 +140,7 @@ impl Gemini {
is_snap_history, is_snap_history,
) )
} }
}); })
self.page.set_title("Titan input");
self.page.set_progress(0.0);
} }
_ => panic!(), // unexpected _ => panic!(), // unexpected
} }
@ -520,7 +527,7 @@ fn handle(
.build(); .build();
b.connect_clicked({ b.connect_clicked({
let p = page.clone(); let p = page.clone();
move |_| p.item_action.load.activate(Some(&u), false) move |_| p.item_action.load.activate(Some(&u), false, true)
}); });
b b
})); }));
@ -544,7 +551,7 @@ fn handle(
Redirect::Temporary { .. } => i.into_temporary_redirect(), Redirect::Temporary { .. } => i.into_temporary_redirect(),
}); });
} }
page.item_action.load.activate(Some(&t), false); page.item_action.load.activate(Some(&t), false, true);
} }
} }
Err(e) => { Err(e) => {

View File

@ -26,7 +26,7 @@ pub fn build(mime: &str, download: Option<(&Rc<ItemAction>, &Uri)>) -> StatusPag
move |_| { move |_| {
action action
.load .load
.activate(Some(&format!("download:{}", request)), true) .activate(Some(&format!("download:{}", request)), true, false)
} }
}); });

View File

@ -316,7 +316,7 @@ impl Gemini {
// Select link handler by scheme // Select link handler by scheme
return match uri.scheme().as_str() { return match uri.scheme().as_str() {
"gemini" | "titan" => { "gemini" | "titan" => {
item_action.load.activate(Some(&uri.to_str()), true) item_action.load.activate(Some(&uri.to_str()), true, false)
} }
// Scheme not supported, delegate // Scheme not supported, delegate
_ => UriLauncher::new(&uri.to_str()).launch( _ => UriLauncher::new(&uri.to_str()).launch(

View File

@ -85,6 +85,7 @@ impl Response for Box {
Uri::escape_string(&text_view.text(), None, false), Uri::escape_string(&text_view.text(), None, false),
)), )),
false, false,
false,
) )
} }
}); });

View File

@ -66,6 +66,7 @@ impl Sensitive for Box {
Uri::escape_string(&form.password_entry_row.text(), None, false), Uri::escape_string(&form.password_entry_row.text(), None, false),
)), )),
false, false,
false,
) )
} }
}); });

View File

@ -73,7 +73,10 @@ impl Info {
/// Reset `Self` to the clean state /// Reset `Self` to the clean state
/// * this method keeps `Redirect` value! /// * this method keeps `Redirect` value!
pub fn reset(&mut self) -> &mut Self { pub fn reset(&mut self, is_unset_redirect: bool) -> &mut Self {
if is_unset_redirect {
self.set_redirect(None);
}
self.clear_events() self.clear_events()
.set_header(None) .set_header(None)
.set_mime(None) .set_mime(None)
@ -102,6 +105,11 @@ impl Info {
self self
} }
pub fn set_redirect(&mut self, redirect: Option<Redirect>) -> &mut Self {
self.redirect = redirect;
self
}
pub fn set_socket(&mut self, address: Option<(SocketAddress, SocketAddress)>) -> &mut Self { pub fn set_socket(&mut self, address: Option<(SocketAddress, SocketAddress)>) -> &mut Self {
self.socket = address.map(|(local_address, remote_address)| Socket { self.socket = address.map(|(local_address, remote_address)| Socket {
local_address, local_address,