diff --git a/Userland/Libraries/LibWeb/WebDriver/TimeoutsConfiguration.cpp b/Userland/Libraries/LibWeb/WebDriver/TimeoutsConfiguration.cpp index c9649c5c5a6..8c6516c1ae1 100644 --- a/Userland/Libraries/LibWeb/WebDriver/TimeoutsConfiguration.cpp +++ b/Userland/Libraries/LibWeb/WebDriver/TimeoutsConfiguration.cpp @@ -31,14 +31,23 @@ JsonObject timeouts_object(TimeoutsConfiguration const& timeouts) // https://w3c.github.io/webdriver/#dfn-deserialize-as-timeouts-configuration ErrorOr json_deserialize_as_a_timeouts_configuration(JsonValue const& timeouts) +{ + // 2. Let configuration be a new timeouts configuration. + TimeoutsConfiguration configuration {}; + + TRY(json_deserialize_as_a_timeouts_configuration_into(timeouts, configuration)); + + // 4. Return success with data configuration. + return configuration; +} + +// https://w3c.github.io/webdriver/#dfn-deserialize-as-timeouts-configuration +ErrorOr json_deserialize_as_a_timeouts_configuration_into(JsonValue const& timeouts, TimeoutsConfiguration& configuration) { // 1. Set timeouts to the result of converting a JSON-derived JavaScript value to an Infra value with timeouts. if (!timeouts.is_object()) return Error::from_code(ErrorCode::InvalidArgument, "Payload is not a JSON object"); - // 2. Let configuration be a new timeouts configuration. - TimeoutsConfiguration configuration {}; - // 3. For each key → value in timeouts: TRY(timeouts.as_object().try_for_each_member([&](auto const& key, JsonValue const& value) -> ErrorOr { Optional parsed_value; @@ -78,8 +87,7 @@ ErrorOr json_deserialize_as_a_timeouts_configurati return {}; })); - // 4. Return success with data configuration. - return configuration; + return {}; } } diff --git a/Userland/Libraries/LibWeb/WebDriver/TimeoutsConfiguration.h b/Userland/Libraries/LibWeb/WebDriver/TimeoutsConfiguration.h index 244eeb775f2..178d82fab23 100644 --- a/Userland/Libraries/LibWeb/WebDriver/TimeoutsConfiguration.h +++ b/Userland/Libraries/LibWeb/WebDriver/TimeoutsConfiguration.h @@ -21,5 +21,6 @@ struct TimeoutsConfiguration { JsonObject timeouts_object(TimeoutsConfiguration const&); ErrorOr json_deserialize_as_a_timeouts_configuration(JsonValue const&); +ErrorOr json_deserialize_as_a_timeouts_configuration_into(JsonValue const&, TimeoutsConfiguration&); } diff --git a/Userland/Services/WebContent/WebDriverConnection.cpp b/Userland/Services/WebContent/WebDriverConnection.cpp index fd045316ced..e1661fb9edf 100644 --- a/Userland/Services/WebContent/WebDriverConnection.cpp +++ b/Userland/Services/WebContent/WebDriverConnection.cpp @@ -243,11 +243,15 @@ Messages::WebDriverClient::GetTimeoutsResponse WebDriverConnection::get_timeouts // 9.2 Set Timeouts, https://w3c.github.io/webdriver/#dfn-set-timeouts Messages::WebDriverClient::SetTimeoutsResponse WebDriverConnection::set_timeouts(JsonValue const& payload) { + // FIXME: Spec issue: As written, the spec replaces the timeouts configuration with the newly provided values. But + // all other implementations update the existing configuration with any new values instead. WPT relies on + // this behavior, and sends us one timeout value at time. + // https://github.com/w3c/webdriver/issues/1596 + // 1. Let timeouts be the result of trying to JSON deserialize as a timeouts configuration the request’s parameters. - auto timeouts = TRY(Web::WebDriver::json_deserialize_as_a_timeouts_configuration(payload)); + TRY(Web::WebDriver::json_deserialize_as_a_timeouts_configuration_into(payload, m_timeouts_configuration)); // 2. Make the session timeouts the new timeouts. - m_timeouts_configuration = move(timeouts); // 3. Return success with data null. return JsonValue {};