From 7dae7f9983837e2d290526c808badb2a5c763e5e Mon Sep 17 00:00:00 2001 From: Kenzie Raditya Tirtarahardja Date: Wed, 16 Jul 2025 17:19:57 +0800 Subject: [PATCH] WebDriver: Implement some missing steps of wait for navigation to complete (#38079) Based on https://w3c.github.io/webdriver/#dfn-wait-for-navigation-to-complete. We still have not implement the timer parameter, but I think it makes sense to implement Step 8.4 of `Navigation To` first. --------- Signed-off-by: PotatoCP --- components/webdriver_server/lib.rs | 35 +++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index e7aa82900ff..d29d0c823fd 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -781,12 +781,35 @@ impl Handler { WebDriverCommandMsg::LoadUrl(webview_id, url, self.load_status_sender.clone()); self.send_message_to_embedder(cmd_msg)?; - self.wait_for_load() + self.wait_for_navigation_to_complete() } - fn wait_for_load(&self) -> WebDriverResult { + /// + fn wait_for_navigation_to_complete(&self) -> WebDriverResult { debug!("waiting for load"); + + let session = self.session()?; + + // Step 1. If session's page loading strategy is "none", + // return success with data null. + if session.page_loading_strategy == "none" { + return Ok(WebDriverResponse::Void); + } + + // Step 2. If session's current browsing context is no longer open, + // return success with data null. + if self + .verify_browsing_context_is_open(session.browsing_context_id) + .is_err() + { + return Ok(WebDriverResponse::Void); + } + + // Step 3. let timeout be the session's page load timeout. let timeout = self.session()?.load_timeout; + + // TODO: Step 4. Implement timer parameter + let result = select! { recv(self.load_status_receiver) -> res => { match res { @@ -950,7 +973,7 @@ impl Handler { webview_id, self.load_status_sender.clone(), ))?; - self.wait_for_load() + self.wait_for_navigation_to_complete() } fn handle_go_forward(&self) -> WebDriverResult { @@ -963,7 +986,7 @@ impl Handler { webview_id, self.load_status_sender.clone(), ))?; - self.wait_for_load() + self.wait_for_navigation_to_complete() } fn handle_refresh(&self) -> WebDriverResult { @@ -975,7 +998,7 @@ impl Handler { let cmd_msg = WebDriverCommandMsg::Refresh(webview_id, self.load_status_sender.clone()); self.send_message_to_embedder(cmd_msg)?; - self.wait_for_load() + self.wait_for_navigation_to_complete() } fn handle_title(&self) -> WebDriverResult { @@ -1083,7 +1106,7 @@ impl Handler { session.window_handles.insert(new_webview_id, new_handle); } - let _ = self.wait_for_load(); + let _ = self.wait_for_navigation_to_complete(); Ok(WebDriverResponse::NewWindow(NewWindowResponse { handle,