diff --git a/Userland/Services/WebDriver/CMakeLists.txt b/Userland/Services/WebDriver/CMakeLists.txt index 10aae0d3cc..69d9e4352a 100644 --- a/Userland/Services/WebDriver/CMakeLists.txt +++ b/Userland/Services/WebDriver/CMakeLists.txt @@ -7,6 +7,7 @@ set(SOURCES BrowserConnection.cpp Client.cpp Session.cpp + TimeoutsConfiguration.cpp main.cpp ) diff --git a/Userland/Services/WebDriver/Client.cpp b/Userland/Services/WebDriver/Client.cpp index 8f277f38c1..2151465a43 100644 --- a/Userland/Services/WebDriver/Client.cpp +++ b/Userland/Services/WebDriver/Client.cpp @@ -7,14 +7,15 @@ * SPDX-License-Identifier: BSD-2-Clause */ -#include "Client.h" -#include "Session.h" #include #include #include #include #include #include +#include +#include +#include namespace WebDriver { @@ -24,6 +25,7 @@ Vector Client::s_routes = { { HTTP::HttpRequest::Method::POST, { "session" }, &Client::handle_new_session }, { HTTP::HttpRequest::Method::DELETE, { "session", ":session_id" }, &Client::handle_delete_session }, { HTTP::HttpRequest::Method::GET, { "status" }, &Client::handle_get_status }, + { HTTP::HttpRequest::Method::GET, { "session", ":session_id", "timeouts" }, &Client::handle_get_timeouts }, { HTTP::HttpRequest::Method::POST, { "session", ":session_id", "url" }, &Client::handle_navigate_to }, { HTTP::HttpRequest::Method::GET, { "session", ":session_id", "url" }, &Client::handle_get_current_url }, { HTTP::HttpRequest::Method::POST, { "session", ":session_id", "back" }, &Client::handle_back }, @@ -426,6 +428,18 @@ ErrorOr Client::handle_get_status(Vector const return body; } +// 9.1 Get Timeouts, https://w3c.github.io/webdriver/#dfn-get-timeouts +// GET /session/{session id}/timeouts +ErrorOr Client::handle_get_timeouts(Vector const& parameters, AK::JsonValue const&) +{ + dbgln_if(WEBDRIVER_DEBUG, "Handling GET /session//timeouts"); + auto* session = TRY(find_session_with_id(parameters[0])); + + // NOTE: Spec steps handled in Session::get_timeouts(). + auto result = session->get_timeouts(); + return make_json_value(result); +} + // 10.1 Navigate To, https://w3c.github.io/webdriver/#dfn-navigate-to // POST /session/{session id}/url ErrorOr Client::handle_navigate_to(Vector const& parameters, JsonValue const& payload) diff --git a/Userland/Services/WebDriver/Client.h b/Userland/Services/WebDriver/Client.h index 09f8d7b2f2..c08223d015 100644 --- a/Userland/Services/WebDriver/Client.h +++ b/Userland/Services/WebDriver/Client.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2022, Florent Castelli + * Copyright (c) 2022, Linus Groh * * SPDX-License-Identifier: BSD-2-Clause */ @@ -49,6 +50,7 @@ private: ErrorOr handle_new_session(Vector const&, JsonValue const& payload); ErrorOr handle_delete_session(Vector const&, JsonValue const& payload); ErrorOr handle_get_status(Vector const&, JsonValue const& payload); + ErrorOr handle_get_timeouts(Vector const&, JsonValue const& payload); ErrorOr handle_navigate_to(Vector const&, JsonValue const& payload); ErrorOr handle_get_current_url(Vector const&, JsonValue const& payload); ErrorOr handle_back(Vector const&, JsonValue const& payload); diff --git a/Userland/Services/WebDriver/Session.cpp b/Userland/Services/WebDriver/Session.cpp index d7a6e31174..964c3b31b2 100644 --- a/Userland/Services/WebDriver/Session.cpp +++ b/Userland/Services/WebDriver/Session.cpp @@ -73,6 +73,16 @@ ErrorOr Session::stop() return {}; } +// 9.1 Get Timeouts, https://w3c.github.io/webdriver/#dfn-get-timeouts +JsonObject Session::get_timeouts() +{ + // 1. Let timeouts be the timeouts object for session’s timeouts configuration + auto timeouts = timeouts_object(m_timeouts_configuration); + + // 2. Return success with data timeouts. + return timeouts; +} + // 10.1 Navigate To, https://w3c.github.io/webdriver/#dfn-navigate-to ErrorOr Session::navigate_to(JsonValue const& payload) { diff --git a/Userland/Services/WebDriver/Session.h b/Userland/Services/WebDriver/Session.h index 4ba3efcddd..bbf3ba073a 100644 --- a/Userland/Services/WebDriver/Session.h +++ b/Userland/Services/WebDriver/Session.h @@ -39,6 +39,7 @@ public: ErrorOr start(); ErrorOr stop(); + JsonObject get_timeouts(); ErrorOr navigate_to(JsonValue const& url); ErrorOr get_current_url(); ErrorOr back(); diff --git a/Userland/Services/WebDriver/TimeoutsConfiguration.cpp b/Userland/Services/WebDriver/TimeoutsConfiguration.cpp new file mode 100644 index 0000000000..a127ca1795 --- /dev/null +++ b/Userland/Services/WebDriver/TimeoutsConfiguration.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2022, Linus Groh + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include + +namespace WebDriver { + +// https://w3c.github.io/webdriver/#dfn-timeouts-object +JsonObject timeouts_object(TimeoutsConfiguration const& timeouts) +{ + // The timeouts object for a timeouts configuration timeouts is an object initialized with the following properties: + auto timeouts_object = JsonObject {}; + + // "script" + // timeouts' script timeout value, if set, or its default value. + if (timeouts.script_timeout.has_value()) + timeouts_object.set("script", *timeouts.script_timeout); + else + timeouts_object.set("script", JsonValue {}); + + // "pageLoad" + // timeouts' page load timeout’s value, if set, or its default value. + timeouts_object.set("pageLoad", timeouts.page_load_timeout); + + // "implicit" + // timeouts' implicit wait timeout’s value, if set, or its default value. + timeouts_object.set("implicit", timeouts.implicit_wait_timeout); + + return timeouts_object; +} + +} diff --git a/Userland/Services/WebDriver/TimeoutsConfiguration.h b/Userland/Services/WebDriver/TimeoutsConfiguration.h index 62af89bd3e..f9048cd49d 100644 --- a/Userland/Services/WebDriver/TimeoutsConfiguration.h +++ b/Userland/Services/WebDriver/TimeoutsConfiguration.h @@ -18,4 +18,6 @@ struct TimeoutsConfiguration { u64 implicit_wait_timeout { 0 }; }; +JsonObject timeouts_object(TimeoutsConfiguration const&); + }