diff --git a/Tests/LibWeb/Text/input/clipboard.html b/Tests/LibWeb/Text/input/clipboard.html index dfc6d391db..9a317faf0a 100644 --- a/Tests/LibWeb/Text/input/clipboard.html +++ b/Tests/LibWeb/Text/input/clipboard.html @@ -16,10 +16,7 @@ asyncTest((done) => { writeText(() => { - const button = document.getElementById("button"); - internals.dispatchUserActivatedEvent(button, new Event("mousedown")); - button.dispatchEvent(new Event("click")); - + internals.bypassNextTransientActivationTest = true; writeText(done); }); }); diff --git a/Userland/Libraries/LibWeb/HTML/Window.cpp b/Userland/Libraries/LibWeb/HTML/Window.cpp index fbe87a7e24..e8a595c59f 100644 --- a/Userland/Libraries/LibWeb/HTML/Window.cpp +++ b/Userland/Libraries/LibWeb/HTML/Window.cpp @@ -134,6 +134,7 @@ void Window::visit_edges(JS::Cell::Visitor& visitor) visitor.visit(mime_type_object); visitor.visit(m_count_queuing_strategy_size_function); visitor.visit(m_byte_length_queuing_strategy_size_function); + visitor.visit(m_internals); } void Window::finalize() @@ -605,6 +606,14 @@ bool Window::has_transient_activation() const // perceive the link between an interaction with the page and the page calling the activation-gated API. auto transient_activation_duration = 5; + // AD-HOC: Due to resource limitations on CI, we cannot rely on the time between the activation timestamp and the + // transient activation timeout being predictable. So we allow tests to indicate when they want the next + // check for a user gesture to succeed. + if (m_internals && m_internals->bypass_next_transient_activation_test()) { + m_internals->set_bypass_next_transient_activation_test(false); + return true; + } + // When the current high resolution time given W auto unsafe_shared_time = HighResolutionTime::unsafe_shared_current_time(); auto current_time = HighResolutionTime::relative_high_resolution_time(unsafe_shared_time, realm().global_object()); @@ -813,8 +822,11 @@ WebIDL::ExceptionOr Window::initialize_web_interfaces(Badge(realm, realm), JS::default_attributes); - if (s_internals_object_exposed) - define_direct_property("internals", heap().allocate(realm, realm), JS::default_attributes); + + if (s_internals_object_exposed) { + m_internals = heap().allocate(realm, realm); + define_direct_property("internals", m_internals, JS::default_attributes); + } return {}; } diff --git a/Userland/Libraries/LibWeb/HTML/Window.h b/Userland/Libraries/LibWeb/HTML/Window.h index 89eab444cb..8a07e50965 100644 --- a/Userland/Libraries/LibWeb/HTML/Window.h +++ b/Userland/Libraries/LibWeb/HTML/Window.h @@ -282,6 +282,8 @@ private: // https://html.spec.whatwg.org/multipage/nav-history-apis.html#dom-window-status // When the Window object is created, the attribute must be set to the empty string. It does not do anything else. String m_status; + + JS::GCPtr m_internals; }; void run_animation_frame_callbacks(DOM::Document&, double now); diff --git a/Userland/Libraries/LibWeb/Internals/Internals.cpp b/Userland/Libraries/LibWeb/Internals/Internals.cpp index c856b615b6..7223d28993 100644 --- a/Userland/Libraries/LibWeb/Internals/Internals.cpp +++ b/Userland/Libraries/LibWeb/Internals/Internals.cpp @@ -89,10 +89,4 @@ void Internals::wheel(double x, double y, double delta_x, double delta_y) page.handle_mousewheel({ x, y }, { x, y }, 0, 0, 0, delta_x, delta_y); } -WebIDL::ExceptionOr Internals::dispatch_user_activated_event(DOM::EventTarget& target, DOM::Event& event) -{ - event.set_is_trusted(true); - return target.dispatch_event(event); -} - } diff --git a/Userland/Libraries/LibWeb/Internals/Internals.h b/Userland/Libraries/LibWeb/Internals/Internals.h index 3ebe5d19c9..ba34ee5c04 100644 --- a/Userland/Libraries/LibWeb/Internals/Internals.h +++ b/Userland/Libraries/LibWeb/Internals/Internals.h @@ -28,11 +28,14 @@ public: void click(double x, double y); void wheel(double x, double y, double delta_x, double delta_y); - WebIDL::ExceptionOr dispatch_user_activated_event(DOM::EventTarget&, DOM::Event& event); + bool bypass_next_transient_activation_test() const { return m_bypass_next_transient_activation_test; } + void set_bypass_next_transient_activation_test(bool bypass_next_transient_activation_test) { m_bypass_next_transient_activation_test = bypass_next_transient_activation_test; } private: explicit Internals(JS::Realm&); virtual void initialize(JS::Realm&) override; + + bool m_bypass_next_transient_activation_test { false }; }; } diff --git a/Userland/Libraries/LibWeb/Internals/Internals.idl b/Userland/Libraries/LibWeb/Internals/Internals.idl index c3d13f3c0f..d158b3a7bc 100644 --- a/Userland/Libraries/LibWeb/Internals/Internals.idl +++ b/Userland/Libraries/LibWeb/Internals/Internals.idl @@ -13,6 +13,6 @@ undefined click(double x, double y); undefined wheel(double x, double y, double deltaX, double deltaY); - boolean dispatchUserActivatedEvent(EventTarget target, Event event); + attribute boolean bypassNextTransientActivationTest; };