/* * Copyright (c) 2024, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include 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; struct PauseFields { Optional duration; }; struct KeyFields { u32 value { 0 }; }; struct PointerFields { PointerInputSource::Subtype pointer_type { PointerInputSource::Subtype::Mouse }; Optional width; Optional height; Optional pressure; Optional tangential_pressure; Optional tilt_x; Optional tilt_y; Optional twist; Optional altitude_angle; Optional azimuth_angle; }; struct PointerUpDownFields : public PointerFields { UIEvents::MouseButton button { UIEvents::MouseButton::None }; }; struct PointerMoveFields : public PointerFields { Optional duration; Origin origin { OriginType::Viewport }; CSSPixelPoint position; }; struct PointerCancelFields { PointerInputSource::Subtype pointer_type { PointerInputSource::Subtype::Mouse }; }; struct ScrollFields { Origin origin { OriginType::Viewport }; Optional 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 const& pause_fields() const { return fields.get(); } KeyFields& key_fields() { return fields.get(); } KeyFields const& key_fields() const { return fields.get(); } PointerUpDownFields& pointer_up_down_fields() { return fields.get(); } PointerUpDownFields const& pointer_up_down_fields() const { return fields.get(); } PointerMoveFields& pointer_move_fields() { return fields.get(); } PointerMoveFields const& pointer_move_fields() const { return fields.get(); } PointerCancelFields& pointer_cancel_fields() { return fields.get(); } PointerCancelFields const& pointer_cancel_fields() const { return fields.get(); } ScrollFields& scroll_fields() { return fields.get(); } ScrollFields const& scroll_fields() const { return fields.get(); } String id; InputSourceType type; Subtype subtype; using Fields = Variant; Fields fields; }; // https://w3c.github.io/webdriver/#dfn-actions-options struct ActionsOptions { using IsElementOrigin = bool (*)(JsonValue const&); using GetElementOrigin = ErrorOr, WebDriver::Error> (*)(HTML::BrowsingContext const&, StringView); IsElementOrigin is_element_origin { nullptr }; GetElementOrigin get_element_origin { nullptr }; }; using OnActionsComplete = GC::Ref>; ErrorOr>, WebDriver::Error> extract_an_action_sequence(InputState&, JsonValue const&, ActionsOptions const&); void wait_for_an_action_queue_token(InputState&); GC::Ref dispatch_actions(InputState&, Vector>, HTML::BrowsingContext&, ActionsOptions, OnActionsComplete); ErrorOr dispatch_tick_actions(InputState&, ReadonlySpan, AK::Duration, HTML::BrowsingContext&, ActionsOptions const&); GC::Ref dispatch_list_of_actions(InputState&, Vector, HTML::BrowsingContext&, ActionsOptions, OnActionsComplete); GC::Ref dispatch_actions_for_a_string(Web::WebDriver::InputState&, String const& input_id, Web::WebDriver::InputSource&, StringView text, Web::HTML::BrowsingContext&, Web::WebDriver::OnActionsComplete); }