From 609cdf851284dace7d08ee51af6473965b4b5ca9 Mon Sep 17 00:00:00 2001 From: yggverse Date: Sun, 1 Dec 2024 12:24:11 +0200 Subject: [PATCH] implement shared cancellable reference --- src/app/browser/window/tab/item/page.rs | 13 +++++++++++-- src/app/browser/window/tab/item/page/client.rs | 18 +++++++++++++----- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/app/browser/window/tab/item/page.rs b/src/app/browser/window/tab/item/page.rs index 1acbb48b..b9c95e57 100644 --- a/src/app/browser/window/tab/item/page.rs +++ b/src/app/browser/window/tab/item/page.rs @@ -28,7 +28,7 @@ use gtk::{ gformat, GString, Priority, Regex, RegexCompileFlags, RegexMatchFlags, Uri, UriFlags, UriHideFlags, }, - prelude::{EditableExt, SocketClientExt}, + prelude::{CancellableExt, EditableExt, SocketClientExt}, }; use sqlite::Transaction; use std::{rc::Rc, time::Duration}; @@ -378,10 +378,19 @@ impl Page { // Private helpers - // @TODO move somewhere outside + // @TODO move outside fn load_gemini(&self, uri: Uri, is_history: bool) { + // Cancel previous client operations + { + let cancellable = self.client.cancellable.take(); + if !cancellable.is_cancelled() { + cancellable.cancel(); + } + } + // Init new Cancellable let cancellable = Cancellable::new(); + self.client.cancellable.replace(cancellable.clone()); // Init shared clones let update = self.browser_action.update.clone(); diff --git a/src/app/browser/window/tab/item/page/client.rs b/src/app/browser/window/tab/item/page/client.rs index 3e981f7d..6ebdc1e1 100644 --- a/src/app/browser/window/tab/item/page/client.rs +++ b/src/app/browser/window/tab/item/page/client.rs @@ -1,11 +1,18 @@ -/// Single client instance holder for `Page` object. +use gtk::gio::Cancellable; +use std::cell::RefCell; + +/// Multi-client holder for single `Page` object /// -/// unlike new client instance init on every page open, -/// this solution provide additional client-side features -/// e.g. session cache management on certificate change in runtime +/// Unlike init new client instance on every page load, +/// this struct creates single holder for different protocol drivers; +/// it also provides additional client-side features +/// e.g. session resumption or multi-thread connection management (depending of client type selected) pub struct Client { + // Shared reference to cancel async operations + pub cancellable: RefCell, + // Clients pub gemini: gemini::Client, - // other supported clients here.. + // other clients.. } impl Client { @@ -14,6 +21,7 @@ impl Client { /// Create new `Self` pub fn new() -> Self { Self { + cancellable: RefCell::new(Cancellable::new()), gemini: gemini::Client::new(), } }