| 
									
										
										
										
											2024-09-26 16:33:21 -04:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2024, Tim Flynn <trflynn89@ladybird.org> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <AK/Optional.h>
 | 
					
						
							|  |  |  | #include <AK/String.h>
 | 
					
						
							|  |  |  | #include <AK/Time.h>
 | 
					
						
							|  |  |  | #include <AK/Variant.h>
 | 
					
						
							|  |  |  | #include <AK/Vector.h>
 | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  | #include <LibGC/Function.h>
 | 
					
						
							|  |  |  | #include <LibGC/Ptr.h>
 | 
					
						
							| 
									
										
										
										
											2024-09-26 16:33:21 -04:00
										 |  |  | #include <LibWeb/Forward.h>
 | 
					
						
							|  |  |  | #include <LibWeb/PixelUnits.h>
 | 
					
						
							|  |  |  | #include <LibWeb/UIEvents/MouseButton.h>
 | 
					
						
							|  |  |  | #include <LibWeb/WebDriver/Error.h>
 | 
					
						
							|  |  |  | #include <LibWeb/WebDriver/InputSource.h>
 | 
					
						
							| 
									
										
										
										
											2024-09-29 09:30:45 -04:00
										 |  |  | #include <LibWeb/WebDriver/Response.h>
 | 
					
						
							| 
									
										
										
										
											2024-09-26 16:33:21 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace Web::WebDriver { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // https://w3c.github.io/webdriver/#dfn-action-object
 | 
					
						
							|  |  |  | struct ActionObject { | 
					
						
							|  |  |  |     enum class Subtype { | 
					
						
							|  |  |  |         Pause, | 
					
						
							|  |  |  |         KeyUp, | 
					
						
							|  |  |  |         KeyDown, | 
					
						
							|  |  |  |         PointerUp, | 
					
						
							|  |  |  |         PointerDown, | 
					
						
							|  |  |  |         PointerMove, | 
					
						
							|  |  |  |         PointerCancel, | 
					
						
							|  |  |  |         Scroll, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     enum class OriginType { | 
					
						
							|  |  |  |         Viewport, | 
					
						
							|  |  |  |         Pointer, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     using Origin = Variant<OriginType, String>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     struct PauseFields { | 
					
						
							|  |  |  |         Optional<AK::Duration> duration; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     struct KeyFields { | 
					
						
							| 
									
										
										
										
											2024-10-07 10:21:02 -04:00
										 |  |  |         u32 value { 0 }; | 
					
						
							| 
									
										
										
										
											2024-09-26 16:33:21 -04:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     struct PointerFields { | 
					
						
							|  |  |  |         PointerInputSource::Subtype pointer_type { PointerInputSource::Subtype::Mouse }; | 
					
						
							|  |  |  |         Optional<double> width; | 
					
						
							|  |  |  |         Optional<double> height; | 
					
						
							|  |  |  |         Optional<double> pressure; | 
					
						
							|  |  |  |         Optional<double> tangential_pressure; | 
					
						
							|  |  |  |         Optional<i32> tilt_x; | 
					
						
							|  |  |  |         Optional<i32> tilt_y; | 
					
						
							|  |  |  |         Optional<u32> twist; | 
					
						
							|  |  |  |         Optional<double> altitude_angle; | 
					
						
							|  |  |  |         Optional<double> azimuth_angle; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     struct PointerUpDownFields : public PointerFields { | 
					
						
							|  |  |  |         UIEvents::MouseButton button { UIEvents::MouseButton::None }; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     struct PointerMoveFields : public PointerFields { | 
					
						
							|  |  |  |         Optional<AK::Duration> duration; | 
					
						
							|  |  |  |         Origin origin { OriginType::Viewport }; | 
					
						
							|  |  |  |         CSSPixelPoint position; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     struct PointerCancelFields { | 
					
						
							|  |  |  |         PointerInputSource::Subtype pointer_type { PointerInputSource::Subtype::Mouse }; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     struct ScrollFields { | 
					
						
							|  |  |  |         Origin origin { OriginType::Viewport }; | 
					
						
							|  |  |  |         Optional<AK::Duration> duration; | 
					
						
							|  |  |  |         i64 x { 0 }; | 
					
						
							|  |  |  |         i64 y { 0 }; | 
					
						
							|  |  |  |         i64 delta_x { 0 }; | 
					
						
							|  |  |  |         i64 delta_y { 0 }; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ActionObject(String id, InputSourceType type, Subtype subtype); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void set_pointer_type(PointerInputSource::Subtype); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     PauseFields& pause_fields() { return fields.get<PauseFields>(); } | 
					
						
							|  |  |  |     PauseFields const& pause_fields() const { return fields.get<PauseFields>(); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     KeyFields& key_fields() { return fields.get<KeyFields>(); } | 
					
						
							|  |  |  |     KeyFields const& key_fields() const { return fields.get<KeyFields>(); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     PointerUpDownFields& pointer_up_down_fields() { return fields.get<PointerUpDownFields>(); } | 
					
						
							|  |  |  |     PointerUpDownFields const& pointer_up_down_fields() const { return fields.get<PointerUpDownFields>(); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     PointerMoveFields& pointer_move_fields() { return fields.get<PointerMoveFields>(); } | 
					
						
							|  |  |  |     PointerMoveFields const& pointer_move_fields() const { return fields.get<PointerMoveFields>(); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     PointerCancelFields& pointer_cancel_fields() { return fields.get<PointerCancelFields>(); } | 
					
						
							|  |  |  |     PointerCancelFields const& pointer_cancel_fields() const { return fields.get<PointerCancelFields>(); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ScrollFields& scroll_fields() { return fields.get<ScrollFields>(); } | 
					
						
							|  |  |  |     ScrollFields const& scroll_fields() const { return fields.get<ScrollFields>(); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     String id; | 
					
						
							|  |  |  |     InputSourceType type; | 
					
						
							|  |  |  |     Subtype subtype; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     using Fields = Variant<PauseFields, KeyFields, PointerUpDownFields, PointerMoveFields, PointerCancelFields, ScrollFields>; | 
					
						
							|  |  |  |     Fields fields; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // https://w3c.github.io/webdriver/#dfn-actions-options
 | 
					
						
							|  |  |  | struct ActionsOptions { | 
					
						
							| 
									
										
										
										
											2024-11-02 21:12:52 -04:00
										 |  |  |     using IsElementOrigin = bool (*)(JsonValue const&); | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  |     using GetElementOrigin = ErrorOr<GC::Ref<DOM::Element>, WebDriver::Error> (*)(HTML::BrowsingContext const&, StringView); | 
					
						
							| 
									
										
										
										
											2024-11-02 21:12:52 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     IsElementOrigin is_element_origin { nullptr }; | 
					
						
							|  |  |  |     GetElementOrigin get_element_origin { nullptr }; | 
					
						
							| 
									
										
										
										
											2024-09-26 16:33:21 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  | using OnActionsComplete = GC::Ref<GC::Function<void(Web::WebDriver::Response)>>; | 
					
						
							| 
									
										
										
										
											2024-09-29 09:30:45 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-26 16:33:21 -04:00
										 |  |  | ErrorOr<Vector<Vector<ActionObject>>, WebDriver::Error> extract_an_action_sequence(InputState&, JsonValue const&, ActionsOptions const&); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-03 12:32:21 +00:00
										 |  |  | void wait_for_an_action_queue_token(InputState&); | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  | GC::Ref<JS::Cell> dispatch_actions(InputState&, Vector<Vector<ActionObject>>, HTML::BrowsingContext&, ActionsOptions, OnActionsComplete); | 
					
						
							| 
									
										
										
										
											2024-09-29 09:30:45 -04:00
										 |  |  | ErrorOr<void, WebDriver::Error> dispatch_tick_actions(InputState&, ReadonlySpan<ActionObject>, AK::Duration, HTML::BrowsingContext&, ActionsOptions const&); | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  | GC::Ref<JS::Cell> dispatch_list_of_actions(InputState&, Vector<ActionObject>, HTML::BrowsingContext&, ActionsOptions, OnActionsComplete); | 
					
						
							|  |  |  | GC::Ref<JS::Cell> dispatch_actions_for_a_string(Web::WebDriver::InputState&, String const& input_id, Web::WebDriver::InputSource&, StringView text, Web::HTML::BrowsingContext&, Web::WebDriver::OnActionsComplete); | 
					
						
							| 
									
										
										
										
											2024-09-29 09:30:45 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-26 16:33:21 -04:00
										 |  |  | } |