Browse Source

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.
Matthew Olsson 1 year ago
parent
commit
a1f4d1875e

+ 1 - 0
Userland/Libraries/LibWeb/CMakeLists.txt

@@ -435,6 +435,7 @@ set(SOURCES
     Infra/JSON.cpp
     Infra/JSON.cpp
     Infra/Strings.cpp
     Infra/Strings.cpp
     Internals/Inspector.cpp
     Internals/Inspector.cpp
+    Internals/InternalAnimationTimeline.cpp
     Internals/Internals.cpp
     Internals/Internals.cpp
     IntersectionObserver/IntersectionObserver.cpp
     IntersectionObserver/IntersectionObserver.cpp
     IntersectionObserver/IntersectionObserverEntry.cpp
     IntersectionObserver/IntersectionObserverEntry.cpp

+ 37 - 0
Userland/Libraries/LibWeb/Internals/InternalAnimationTimeline.cpp

@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2024, Matthew Olsson <mattco@serenityos.org>.
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <LibWeb/Bindings/Intrinsics.h>
+#include <LibWeb/Internals/InternalAnimationTimeline.h>
+
+namespace Web::Internals {
+
+JS_DEFINE_ALLOCATOR(InternalAnimationTimeline);
+
+void InternalAnimationTimeline::set_current_time(Optional<double> current_time)
+{
+    // Do nothing
+    (void)current_time;
+}
+
+void InternalAnimationTimeline::set_time(Optional<double> 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);
+}
+
+}

+ 29 - 0
Userland/Libraries/LibWeb/Internals/InternalAnimationTimeline.h

@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2024, Matthew Olsson <mattco@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibWeb/Animations/AnimationTimeline.h>
+
+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<double> current_time) override;
+
+    void set_time(Optional<double> time);
+
+private:
+    explicit InternalAnimationTimeline(JS::Realm&);
+    virtual ~InternalAnimationTimeline() override = default;
+
+    virtual void initialize(JS::Realm&) override;
+};
+
+}

+ 6 - 0
Userland/Libraries/LibWeb/Internals/InternalAnimationTimeline.idl

@@ -0,0 +1,6 @@
+#import <Animations/AnimationTimeline.idl>
+
+[Exposed=Nobody]
+interface InternalAnimationTimeline : AnimationTimeline {
+    undefined setTime(double? time);
+};

+ 6 - 0
Userland/Libraries/LibWeb/Internals/Internals.cpp

@@ -101,4 +101,10 @@ WebIDL::ExceptionOr<bool> Internals::dispatch_user_activated_event(DOM::EventTar
     return target.dispatch_event(event);
     return target.dispatch_event(event);
 }
 }
 
 
+JS::NonnullGCPtr<InternalAnimationTimeline> Internals::create_internal_animation_timeline()
+{
+    auto& realm = this->realm();
+    return realm.heap().allocate<InternalAnimationTimeline>(realm, realm);
+}
+
 }
 }

+ 3 - 0
Userland/Libraries/LibWeb/Internals/Internals.h

@@ -7,6 +7,7 @@
 #pragma once
 #pragma once
 
 
 #include <LibWeb/Bindings/PlatformObject.h>
 #include <LibWeb/Bindings/PlatformObject.h>
+#include <LibWeb/Internals/InternalAnimationTimeline.h>
 
 
 namespace Web::Internals {
 namespace Web::Internals {
 
 
@@ -31,6 +32,8 @@ public:
 
 
     WebIDL::ExceptionOr<bool> dispatch_user_activated_event(DOM::EventTarget&, DOM::Event& event);
     WebIDL::ExceptionOr<bool> dispatch_user_activated_event(DOM::EventTarget&, DOM::Event& event);
 
 
+    JS::NonnullGCPtr<InternalAnimationTimeline> create_internal_animation_timeline();
+
 private:
 private:
     explicit Internals(JS::Realm&);
     explicit Internals(JS::Realm&);
     virtual void initialize(JS::Realm&) override;
     virtual void initialize(JS::Realm&) override;

+ 4 - 1
Userland/Libraries/LibWeb/Internals/Internals.idl

@@ -1,7 +1,9 @@
 #import <DOM/EventTarget.idl>
 #import <DOM/EventTarget.idl>
 #import <HTML/HTMLElement.idl>
 #import <HTML/HTMLElement.idl>
+#import <Internals/InternalAnimationTimeline.idl>
 
 
-[Exposed=Nobody] interface Internals {
+[Exposed=Nobody]
+interface Internals {
 
 
     undefined signalTextTestIsDone();
     undefined signalTextTestIsDone();
     undefined gc();
     undefined gc();
@@ -16,4 +18,5 @@
 
 
     boolean dispatchUserActivatedEvent(EventTarget target, Event event);
     boolean dispatchUserActivatedEvent(EventTarget target, Event event);
 
 
+    InternalAnimationTimeline createInternalAnimationTimeline();
 };
 };

+ 1 - 0
Userland/Libraries/LibWeb/idl_files.cmake

@@ -209,6 +209,7 @@ libweb_js_bindings(HTML/WorkerLocation)
 libweb_js_bindings(HTML/WorkerNavigator)
 libweb_js_bindings(HTML/WorkerNavigator)
 libweb_js_bindings(HighResolutionTime/Performance)
 libweb_js_bindings(HighResolutionTime/Performance)
 libweb_js_bindings(Internals/Inspector)
 libweb_js_bindings(Internals/Inspector)
+libweb_js_bindings(Internals/InternalAnimationTimeline)
 libweb_js_bindings(Internals/Internals)
 libweb_js_bindings(Internals/Internals)
 libweb_js_bindings(IntersectionObserver/IntersectionObserver)
 libweb_js_bindings(IntersectionObserver/IntersectionObserver)
 libweb_js_bindings(IntersectionObserver/IntersectionObserverEntry)
 libweb_js_bindings(IntersectionObserver/IntersectionObserverEntry)