mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 15:12:45 +00:00 
			
		
		
		
	WebDriver: Implement POST /session/{session id}/timeouts endpoint
				
					
				
			This commit is contained in:
		
							parent
							
								
									5c32eacac9
								
							
						
					
					
						commit
						0064d2e8c8
					
				
					 6 changed files with 85 additions and 0 deletions
				
			
		|  | @ -26,6 +26,7 @@ Vector<Client::Route> Client::s_routes = { | |||
|     { 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", "timeouts" }, &Client::handle_set_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 }, | ||||
|  | @ -440,6 +441,18 @@ ErrorOr<JsonValue, HttpError> Client::handle_get_timeouts(Vector<AK::StringView> | |||
|     return make_json_value(result); | ||||
| } | ||||
| 
 | ||||
| // 9.2 Set Timeouts, https://w3c.github.io/webdriver/#dfn-set-timeouts
 | ||||
| // POST /session/{session id}/timeouts
 | ||||
| ErrorOr<JsonValue, HttpError> Client::handle_set_timeouts(Vector<AK::StringView> const& parameters, AK::JsonValue const& payload) | ||||
| { | ||||
|     dbgln_if(WEBDRIVER_DEBUG, "Handling POST /session/<session id>/timeouts"); | ||||
|     auto* session = TRY(find_session_with_id(parameters[0])); | ||||
| 
 | ||||
|     // NOTE: Spec steps handled in Session::set_timeouts().
 | ||||
|     auto result = TRY(session->set_timeouts(payload)); | ||||
|     return make_json_value(result); | ||||
| } | ||||
| 
 | ||||
| // 10.1 Navigate To, https://w3c.github.io/webdriver/#dfn-navigate-to
 | ||||
| // POST /session/{session id}/url
 | ||||
| ErrorOr<JsonValue, HttpError> Client::handle_navigate_to(Vector<StringView> const& parameters, JsonValue const& payload) | ||||
|  |  | |||
|  | @ -51,6 +51,7 @@ private: | |||
|     ErrorOr<JsonValue, HttpError> handle_delete_session(Vector<StringView> const&, JsonValue const& payload); | ||||
|     ErrorOr<JsonValue, HttpError> handle_get_status(Vector<StringView> const&, JsonValue const& payload); | ||||
|     ErrorOr<JsonValue, HttpError> handle_get_timeouts(Vector<StringView> const&, JsonValue const& payload); | ||||
|     ErrorOr<JsonValue, HttpError> handle_set_timeouts(Vector<StringView> const&, JsonValue const& payload); | ||||
|     ErrorOr<JsonValue, HttpError> handle_navigate_to(Vector<StringView> const&, JsonValue const& payload); | ||||
|     ErrorOr<JsonValue, HttpError> handle_get_current_url(Vector<StringView> const&, JsonValue const& payload); | ||||
|     ErrorOr<JsonValue, HttpError> handle_back(Vector<StringView> const&, JsonValue const& payload); | ||||
|  |  | |||
|  | @ -83,6 +83,19 @@ JsonObject Session::get_timeouts() | |||
|     return timeouts; | ||||
| } | ||||
| 
 | ||||
| // 9.2 Set Timeouts, https://w3c.github.io/webdriver/#dfn-set-timeouts
 | ||||
| ErrorOr<JsonValue, HttpError> Session::set_timeouts(JsonValue const& payload) | ||||
| { | ||||
|     // 1. Let timeouts be the result of trying to JSON deserialize as a timeouts configuration the request’s parameters.
 | ||||
|     auto timeouts = TRY(json_deserialize_as_a_timeouts_configuration(payload)); | ||||
| 
 | ||||
|     // 2. Make the session timeouts the new timeouts.
 | ||||
|     m_timeouts_configuration = move(timeouts); | ||||
| 
 | ||||
|     // 3. Return success with data null.
 | ||||
|     return JsonValue {}; | ||||
| } | ||||
| 
 | ||||
| // 10.1 Navigate To, https://w3c.github.io/webdriver/#dfn-navigate-to
 | ||||
| ErrorOr<JsonValue, HttpError> Session::navigate_to(JsonValue const& payload) | ||||
| { | ||||
|  |  | |||
|  | @ -40,6 +40,7 @@ public: | |||
|     ErrorOr<void> start(); | ||||
|     ErrorOr<void> stop(); | ||||
|     JsonObject get_timeouts(); | ||||
|     ErrorOr<JsonValue, HttpError> set_timeouts(JsonValue const& payload); | ||||
|     ErrorOr<JsonValue, HttpError> navigate_to(JsonValue const& url); | ||||
|     ErrorOr<JsonValue, HttpError> get_current_url(); | ||||
|     ErrorOr<JsonValue, HttpError> back(); | ||||
|  |  | |||
|  | @ -5,6 +5,7 @@ | |||
|  */ | ||||
| 
 | ||||
| #include <AK/JsonObject.h> | ||||
| #include <WebDriver/HttpError.h> | ||||
| #include <WebDriver/TimeoutsConfiguration.h> | ||||
| 
 | ||||
| namespace WebDriver { | ||||
|  | @ -33,4 +34,59 @@ JsonObject timeouts_object(TimeoutsConfiguration const& timeouts) | |||
|     return timeouts_object; | ||||
| } | ||||
| 
 | ||||
| // https://w3c.github.io/webdriver/#ref-for-dfn-json-deserialize-3
 | ||||
| ErrorOr<TimeoutsConfiguration, HttpError> json_deserialize_as_a_timeouts_configuration(JsonValue const& value) | ||||
| { | ||||
|     constexpr i64 max_safe_integer = 9007199254740991; | ||||
| 
 | ||||
|     // 1. Let timeouts be a new timeouts configuration.
 | ||||
|     auto timeouts = TimeoutsConfiguration {}; | ||||
| 
 | ||||
|     // 2. If value is not a JSON Object, return error with error code invalid argument.
 | ||||
|     if (!value.is_object()) | ||||
|         return HttpError { 400, "invalid argument", "Payload is not a JSON object" }; | ||||
| 
 | ||||
|     // 3. If value has a property with the key "script":
 | ||||
|     if (value.as_object().has("script"sv)) { | ||||
|         // 1. Let script duration be the value of property "script".
 | ||||
|         auto const& script_duration = value.as_object().get("script"sv); | ||||
| 
 | ||||
|         // 2. If script duration is a number and less than 0 or greater than maximum safe integer, or it is not null, return error with error code invalid argument.
 | ||||
|         if ((script_duration.is_number() && (script_duration.to_i64() < 0 || script_duration.to_i64() > max_safe_integer)) || !script_duration.is_null()) | ||||
|             return HttpError { 400, "invalid argument", "Invalid script duration" }; | ||||
| 
 | ||||
|         // 3. Set timeouts’s script timeout to script duration.
 | ||||
|         timeouts.script_timeout = script_duration.is_null() ? Optional<u64> {} : script_duration.to_u64(); | ||||
|     } | ||||
| 
 | ||||
|     // 4. If value has a property with the key "pageLoad":
 | ||||
|     if (value.as_object().has("pageLoad"sv)) { | ||||
|         // 1. Let page load duration be the value of property "pageLoad".
 | ||||
|         auto const& page_load_duration = value.as_object().get("pageLoad"sv); | ||||
| 
 | ||||
|         // 2. If page load duration is less than 0 or greater than maximum safe integer, return error with error code invalid argument.
 | ||||
|         if (!page_load_duration.is_number() || page_load_duration.to_i64() < 0 || page_load_duration.to_i64() > max_safe_integer) | ||||
|             return HttpError { 400, "invalid argument", "Invalid page load duration" }; | ||||
| 
 | ||||
|         // 3. Set timeouts’s page load timeout to page load duration.
 | ||||
|         timeouts.page_load_timeout = page_load_duration.to_u64(); | ||||
|     } | ||||
| 
 | ||||
|     // 5. If value has a property with the key "implicit":
 | ||||
|     if (value.as_object().has("implicit"sv)) { | ||||
|         // 1. Let implicit duration be the value of property "implicit".
 | ||||
|         auto const& implicit_duration = value.as_object().get("implicit"sv); | ||||
| 
 | ||||
|         // 2. If implicit duration is less than 0 or greater than maximum safe integer, return error with error code invalid argument.
 | ||||
|         if (!implicit_duration.is_number() || implicit_duration.to_i64() < 0 || implicit_duration.to_i64() > max_safe_integer) | ||||
|             return HttpError { 400, "invalid argument", "Invalid implicit duration" }; | ||||
| 
 | ||||
|         // 3. Set timeouts’s implicit wait timeout to implicit duration.
 | ||||
|         timeouts.implicit_wait_timeout = implicit_duration.to_u64(); | ||||
|     } | ||||
| 
 | ||||
|     // 6. Return success with data timeouts.
 | ||||
|     return timeouts; | ||||
| } | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -19,5 +19,6 @@ struct TimeoutsConfiguration { | |||
| }; | ||||
| 
 | ||||
| JsonObject timeouts_object(TimeoutsConfiguration const&); | ||||
| ErrorOr<TimeoutsConfiguration, HttpError> json_deserialize_as_a_timeouts_configuration(JsonValue const&); | ||||
| 
 | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Linus Groh
						Linus Groh