script: Support webdriver's Get Element Text operation for non-HTML elements (#37470)

Fix `WebDriverScriptCommand::GetElementText` similar to
https://github.com/servo/servo/pull/37452#discussion_r2146350739, by
correctly retrieving rendered text.

Testing: `./mach test-wpt -r --log-raw "D:\servo test
log\gt_ele_txt.txt" webdriver/tests/classic/get_element_text --product
servodriver`

Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com>
This commit is contained in:
Euclid Ye 2025-06-15 13:32:29 +08:00 committed by GitHub
parent 810c0e6891
commit 9352a9db7c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 10 additions and 3 deletions

View file

@ -2461,7 +2461,7 @@ impl ScriptThread {
)
},
WebDriverScriptCommand::GetElementText(node_id, reply) => {
webdriver_handlers::handle_get_text(&documents, pipeline_id, node_id, reply)
webdriver_handlers::handle_get_text(&documents, pipeline_id, node_id, reply, can_gc)
},
WebDriverScriptCommand::GetElementInViewCenterPoint(node_id, reply) => {
webdriver_handlers::handle_get_element_in_view_center_point(

View file

@ -71,6 +71,7 @@ use crate::script_module::ScriptFetchOptions;
use crate::script_runtime::{CanGc, JSContext as SafeJSContext};
use crate::script_thread::ScriptThread;
/// <https://w3c.github.io/webdriver/#dfn-get-a-known-element>
fn find_node_by_unique_id(
documents: &DocumentCollection,
pipeline: PipelineId,
@ -1217,16 +1218,21 @@ pub(crate) fn handle_get_bounding_client_rect(
.unwrap();
}
/// <https://w3c.github.io/webdriver/#dfn-get-element-text>
pub(crate) fn handle_get_text(
documents: &DocumentCollection,
pipeline: PipelineId,
node_id: String,
reply: IpcSender<Result<String, ErrorStatus>>,
can_gc: CanGc,
) {
reply
.send(
find_node_by_unique_id(documents, pipeline, node_id)
.map(|node| node.GetTextContent().map_or("".to_owned(), String::from)),
find_node_by_unique_id(documents, pipeline, node_id).map(|node| {
node.downcast::<HTMLElement>()
.map(|element| element.InnerText(can_gc).to_string())
.unwrap_or_else(|| node.GetTextContent().map_or("".to_owned(), String::from))
}),
)
.unwrap();
}