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 <Kenzie.Raditya.Tirtarahardja@huawei.com>
This commit is contained in:
Kenzie Raditya Tirtarahardja 2025-07-16 17:19:57 +08:00 committed by GitHub
parent 8f9d484693
commit 7dae7f9983
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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<WebDriverResponse> {
/// <https://w3c.github.io/webdriver/#dfn-wait-for-navigation-to-complete>
fn wait_for_navigation_to_complete(&self) -> WebDriverResult<WebDriverResponse> {
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<WebDriverResponse> {
@ -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<WebDriverResponse> {
@ -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<WebDriverResponse> {
@ -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,