From a1f4d1875e1c157218f7a15e27adce70d3375f78 Mon Sep 17 00:00:00 2001 From: Matthew Olsson Date: Wed, 27 Mar 2024 15:30:54 +0000 Subject: [PATCH] LibWeb: Add an InternalAnimationTimeline object This will allow fine grained control over animation times, which will allow us to write timing tests that can reliably pass on the much slower CI machines. --- Userland/Libraries/LibWeb/CMakeLists.txt | 1 + .../Internals/InternalAnimationTimeline.cpp | 37 +++++++++++++++++++ .../Internals/InternalAnimationTimeline.h | 29 +++++++++++++++ .../Internals/InternalAnimationTimeline.idl | 6 +++ .../Libraries/LibWeb/Internals/Internals.cpp | 6 +++ .../Libraries/LibWeb/Internals/Internals.h | 3 ++ .../Libraries/LibWeb/Internals/Internals.idl | 5 ++- Userland/Libraries/LibWeb/idl_files.cmake | 1 + 8 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 Userland/Libraries/LibWeb/Internals/InternalAnimationTimeline.cpp create mode 100644 Userland/Libraries/LibWeb/Internals/InternalAnimationTimeline.h create mode 100644 Userland/Libraries/LibWeb/Internals/InternalAnimationTimeline.idl diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index b0974b4913f..e64d07dd1bd 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -435,6 +435,7 @@ set(SOURCES Infra/JSON.cpp Infra/Strings.cpp Internals/Inspector.cpp + Internals/InternalAnimationTimeline.cpp Internals/Internals.cpp IntersectionObserver/IntersectionObserver.cpp IntersectionObserver/IntersectionObserverEntry.cpp diff --git a/Userland/Libraries/LibWeb/Internals/InternalAnimationTimeline.cpp b/Userland/Libraries/LibWeb/Internals/InternalAnimationTimeline.cpp new file mode 100644 index 00000000000..c658f7fe1d8 --- /dev/null +++ b/Userland/Libraries/LibWeb/Internals/InternalAnimationTimeline.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2024, Matthew Olsson . + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include + +namespace Web::Internals { + +JS_DEFINE_ALLOCATOR(InternalAnimationTimeline); + +void InternalAnimationTimeline::set_current_time(Optional current_time) +{ + // Do nothing + (void)current_time; +} + +void InternalAnimationTimeline::set_time(Optional time) +{ + Base::set_current_time(time); +} + +InternalAnimationTimeline::InternalAnimationTimeline(JS::Realm& realm) + : AnimationTimeline(realm) +{ + m_current_time = 0.0; +} + +void InternalAnimationTimeline::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + WEB_SET_PROTOTYPE_FOR_INTERFACE(InternalAnimationTimeline); +} + +} diff --git a/Userland/Libraries/LibWeb/Internals/InternalAnimationTimeline.h b/Userland/Libraries/LibWeb/Internals/InternalAnimationTimeline.h new file mode 100644 index 00000000000..f10477a1de1 --- /dev/null +++ b/Userland/Libraries/LibWeb/Internals/InternalAnimationTimeline.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2024, Matthew Olsson + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Web::Internals { + +class InternalAnimationTimeline : public Web::Animations::AnimationTimeline { +public: + WEB_PLATFORM_OBJECT(InternalAnimationTimeline, Web::Animations::AnimationTimeline); + JS_DECLARE_ALLOCATOR(InternalAnimationTimeline); + + virtual void set_current_time(Optional current_time) override; + + void set_time(Optional time); + +private: + explicit InternalAnimationTimeline(JS::Realm&); + virtual ~InternalAnimationTimeline() override = default; + + virtual void initialize(JS::Realm&) override; +}; + +} diff --git a/Userland/Libraries/LibWeb/Internals/InternalAnimationTimeline.idl b/Userland/Libraries/LibWeb/Internals/InternalAnimationTimeline.idl new file mode 100644 index 00000000000..cb7f0c3e303 --- /dev/null +++ b/Userland/Libraries/LibWeb/Internals/InternalAnimationTimeline.idl @@ -0,0 +1,6 @@ +#import + +[Exposed=Nobody] +interface InternalAnimationTimeline : AnimationTimeline { + undefined setTime(double? time); +}; diff --git a/Userland/Libraries/LibWeb/Internals/Internals.cpp b/Userland/Libraries/LibWeb/Internals/Internals.cpp index 9c06cff7f60..70f4f48219a 100644 --- a/Userland/Libraries/LibWeb/Internals/Internals.cpp +++ b/Userland/Libraries/LibWeb/Internals/Internals.cpp @@ -101,4 +101,10 @@ WebIDL::ExceptionOr Internals::dispatch_user_activated_event(DOM::EventTar return target.dispatch_event(event); } +JS::NonnullGCPtr Internals::create_internal_animation_timeline() +{ + auto& realm = this->realm(); + return realm.heap().allocate(realm, realm); +} + } diff --git a/Userland/Libraries/LibWeb/Internals/Internals.h b/Userland/Libraries/LibWeb/Internals/Internals.h index e26e6ac6e51..a186be33ba4 100644 --- a/Userland/Libraries/LibWeb/Internals/Internals.h +++ b/Userland/Libraries/LibWeb/Internals/Internals.h @@ -7,6 +7,7 @@ #pragma once #include +#include namespace Web::Internals { @@ -31,6 +32,8 @@ public: WebIDL::ExceptionOr dispatch_user_activated_event(DOM::EventTarget&, DOM::Event& event); + JS::NonnullGCPtr create_internal_animation_timeline(); + private: explicit Internals(JS::Realm&); virtual void initialize(JS::Realm&) override; diff --git a/Userland/Libraries/LibWeb/Internals/Internals.idl b/Userland/Libraries/LibWeb/Internals/Internals.idl index 9b8fb18b50a..194620a9414 100644 --- a/Userland/Libraries/LibWeb/Internals/Internals.idl +++ b/Userland/Libraries/LibWeb/Internals/Internals.idl @@ -1,7 +1,9 @@ #import #import +#import -[Exposed=Nobody] interface Internals { +[Exposed=Nobody] +interface Internals { undefined signalTextTestIsDone(); undefined gc(); @@ -16,4 +18,5 @@ boolean dispatchUserActivatedEvent(EventTarget target, Event event); + InternalAnimationTimeline createInternalAnimationTimeline(); }; diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index 464e468ba0f..a97435f2723 100644 --- a/Userland/Libraries/LibWeb/idl_files.cmake +++ b/Userland/Libraries/LibWeb/idl_files.cmake @@ -209,6 +209,7 @@ libweb_js_bindings(HTML/WorkerLocation) libweb_js_bindings(HTML/WorkerNavigator) libweb_js_bindings(HighResolutionTime/Performance) libweb_js_bindings(Internals/Inspector) +libweb_js_bindings(Internals/InternalAnimationTimeline) libweb_js_bindings(Internals/Internals) libweb_js_bindings(IntersectionObserver/IntersectionObserver) libweb_js_bindings(IntersectionObserver/IntersectionObserverEntry)