From 070f1e63788453ecd60a298cf7714da55a86e237 Mon Sep 17 00:00:00 2001 From: Lucas Nogueira Date: Sun, 2 Nov 2025 06:50:17 -0300 Subject: [PATCH] on_page_load_handler impl --- crates/tauri-runtime-cef/src/cef_impl.rs | 50 ++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/crates/tauri-runtime-cef/src/cef_impl.rs b/crates/tauri-runtime-cef/src/cef_impl.rs index cfbaef90a..58597f123 100644 --- a/crates/tauri-runtime-cef/src/cef_impl.rs +++ b/crates/tauri-runtime-cef/src/cef_impl.rs @@ -115,21 +115,57 @@ wrap_browser_process_handler! { wrap_load_handler! { struct BrowserLoadHandler { initialization_scripts: Vec, + on_page_load_handler: Option>, } impl LoadHandler { + fn on_load_start( + &self, + _browser: Option<&mut Browser>, + frame: Option<&mut Frame>, + _transition_type: TransitionType, + ) { + let Some(handler) = &self.on_page_load_handler else { return }; + let Some(frame) = frame else { return }; + + let is_main_frame = frame.is_main() == 1; + if !is_main_frame { + return; + } + + let url = frame.url(); + let url_str = cef::CefString::from(&url).to_string(); + if let Ok(url) = url::Url::parse(&url_str) { + handler(url, tauri_runtime::webview::PageLoadEvent::Started); + } + } + fn on_load_end( &self, browser: Option<&mut Browser>, frame: Option<&mut Frame>, http_status_code: ::std::os::raw::c_int, ) { + let Some(frame) = frame else { return }; + + if let Some(handler) = &self.on_page_load_handler { + if frame.is_main() == 1 { + let url = frame.url(); + let url_str = cef::CefString::from(&url).to_string(); + if let Ok(url) = url::Url::parse(&url_str) { + handler(url, tauri_runtime::webview::PageLoadEvent::Finished); + } + } + } + + // run init scripts for http/https pages + // custom schemes are handled by the request handler + // where we inject scripts directly in the html + if http_status_code < 200 || http_status_code >= 300 { return; } - let Some(frame) = frame else { return }; - let url = frame.url(); let url_str = cef::CefString::from(&url).to_string(); let url_obj = url::Url::parse(&url_str).ok(); @@ -172,6 +208,7 @@ wrap_load_handler! { wrap_client! { struct BrowserClient { initialization_scripts: Vec, + on_page_load_handler: Option>, } impl Client { @@ -184,6 +221,7 @@ wrap_client! { fn load_handler(&self) -> Option { Some(BrowserLoadHandler::new( self.initialization_scripts.clone(), + self.on_page_load_handler.clone(), )) } } @@ -1515,7 +1553,7 @@ fn create_webview( context: &Context, window_id: WindowId, webview_id: u32, - pending: PendingWebview>, + mut pending: PendingWebview>, ) { let window = match context .windows @@ -1539,7 +1577,11 @@ fn create_webview( .map(CefInitScript::new) .collect(); - let mut client = BrowserClient::new(initialization_scripts.clone()); + let on_page_load_handler = pending + .on_page_load_handler + .take() + .map(|h| Arc::from(h) as Arc); + let mut client = BrowserClient::new(initialization_scripts.clone(), on_page_load_handler); let url = CefString::from(pending.url.as_str()); let global_context =