webdriver: improve session commands (#38397)

Add timeout and strictFileInteractability capabilities to response of
new session command.
Allow delete session command to run without a session.

Testing: Clear some unexpected results of session tests in webdriver CI
and
`tests/wpt/meta/webdriver/tests/classic/delete_session/delete.py.ini`

---------

Signed-off-by: batu_hoang <hoang.binh.trong@huawei.com>
Signed-off-by: batu_hoang <longvatrong111@gmail.com>
This commit is contained in:
batu_hoang 2025-08-01 14:39:03 +08:00 committed by GitHub
parent c836ed374c
commit 929fd0aa3c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 19 additions and 11 deletions

View file

@ -623,8 +623,12 @@ impl Handler {
Ok(WebDriverResponse::NewSession(response)) Ok(WebDriverResponse::NewSession(response))
} }
/// <https://w3c.github.io/webdriver/#dfn-delete-session>
fn handle_delete_session(&mut self) -> WebDriverResult<WebDriverResponse> { fn handle_delete_session(&mut self) -> WebDriverResult<WebDriverResponse> {
// Step 1. If session is http, close the session
self.session = None; self.session = None;
// Step 2. Return success with data null
Ok(WebDriverResponse::DeleteSession) Ok(WebDriverResponse::DeleteSession)
} }
@ -2445,7 +2449,9 @@ impl WebDriverHandler<ServoExtensionRoute> for Handler {
// Unless we are trying to create a new session, we need to ensure that a // Unless we are trying to create a new session, we need to ensure that a
// session has previously been created // session has previously been created
match msg.command { match msg.command {
WebDriverCommand::NewSession(_) | WebDriverCommand::Status => {}, WebDriverCommand::NewSession(_) |
WebDriverCommand::Status |
WebDriverCommand::DeleteSession => {},
_ => { _ => {
self.session()?; self.session()?;
}, },

View file

@ -119,6 +119,8 @@ impl Handler {
capabilities.get("strictFileInteractability") capabilities.get("strictFileInteractability")
{ {
session.strict_file_interactability = *strict_file_interactability; session.strict_file_interactability = *strict_file_interactability;
} else {
capabilities.insert(String::from("strictFileInteractability"), json!(false));
} }
// Step 9.3. Let timeouts be the result of getting a property "timeouts" from capabilities. // Step 9.3. Let timeouts be the result of getting a property "timeouts" from capabilities.

View file

@ -46,9 +46,15 @@ pub(crate) fn deserialize_as_timeouts_configuration(
})? as u64; })? as u64;
}, },
"script" => { "script" => {
config.script = Some(value.as_f64().ok_or_else(|| { config.script = match value {
WebDriverError::new(ErrorStatus::InvalidArgument, "Invalid script timeout") Value::Null => None,
})? as u64); _ => Some(value.as_f64().ok_or_else(|| {
WebDriverError::new(
ErrorStatus::InvalidArgument,
"Invalid script timeout",
)
})? as u64),
};
}, },
_ => { _ => {
return Err(WebDriverError::new( return Err(WebDriverError::new(
@ -69,9 +75,7 @@ pub(crate) fn deserialize_as_timeouts_configuration(
pub(crate) fn serialize_timeouts_configuration(timeouts: &TimeoutsConfiguration) -> Value { pub(crate) fn serialize_timeouts_configuration(timeouts: &TimeoutsConfiguration) -> Value {
let mut map = serde_json::Map::new(); let mut map = serde_json::Map::new();
if let Some(script_timeout) = timeouts.script { map.insert("script".to_string(), Value::from(timeouts.script));
map.insert("script".to_string(), Value::from(script_timeout));
}
map.insert("pageLoad".to_string(), Value::from(timeouts.page_load)); map.insert("pageLoad".to_string(), Value::from(timeouts.page_load));
map.insert("implicit".to_string(), Value::from(timeouts.implicit_wait)); map.insert("implicit".to_string(), Value::from(timeouts.implicit_wait));
Value::Object(map) Value::Object(map)

View file

@ -1,7 +1,3 @@
[delete.py] [delete.py]
expected: ERROR
[test_null_response_value]
expected: FAIL
[test_accepted_beforeunload_prompt] [test_accepted_beforeunload_prompt]
expected: FAIL expected: FAIL