[WebDriver] Improve get active element (#37425)

Report `NoSuchElement` if the active element is null, according to spec.

Testing: `./mach test-wpt -r --log-raw "D:\servo test log\all.txt"
.\tests\wpt\tests\webdriver\tests\classic\get_active_element --product
servodriver`
Partly fixes: #37420. We can pass `get_active_element` test once #37424
is done.

Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com>
This commit is contained in:
Euclid Ye 2025-06-15 13:17:59 +08:00 committed by GitHub
parent 1eb62a1ffb
commit 5d42ab05fb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1330,15 +1330,26 @@ impl Handler {
} }
} }
///<https://w3c.github.io/webdriver/#get-active-element>
fn handle_active_element(&self) -> WebDriverResult<WebDriverResponse> { fn handle_active_element(&self) -> WebDriverResult<WebDriverResponse> {
let (sender, receiver) = ipc::channel().unwrap(); let (sender, receiver) = ipc::channel().unwrap();
let cmd = WebDriverScriptCommand::GetActiveElement(sender); let cmd = WebDriverScriptCommand::GetActiveElement(sender);
self.browsing_context_script_command(cmd)?; self.browsing_context_script_command(cmd)?;
let value = wait_for_script_response(receiver)? let value = wait_for_script_response(receiver)?
.map(|x| serde_json::to_value(WebElement(x)).unwrap()); .map(|x| serde_json::to_value(WebElement(x)).unwrap());
Ok(WebDriverResponse::Generic(ValueResponse( // Step 4. If active element is a non-null element, return success
serde_json::to_value(value)?, // with data set to web element reference object for session and active element.
))) // Otherwise, return error with error code no such element.
if value.is_some() {
Ok(WebDriverResponse::Generic(ValueResponse(
serde_json::to_value(value)?,
)))
} else {
Err(WebDriverError::new(
ErrorStatus::NoSuchElement,
"No active element found",
))
}
} }
fn handle_computed_role(&self, element: &WebElement) -> WebDriverResult<WebDriverResponse> { fn handle_computed_role(&self, element: &WebElement) -> WebDriverResult<WebDriverResponse> {