From 43dc9dfb692cbd425b8bd329fad74d1ffe664655 Mon Sep 17 00:00:00 2001 From: Matthew Olsson Date: Sat, 4 Nov 2023 12:20:39 -0700 Subject: [PATCH] LibWeb: Add the AnimationPlaybackEvent IDL object --- .../Animations/AnimationPlaybackEvent.cpp | 36 ++++++++++++++ .../Animations/AnimationPlaybackEvent.h | 48 +++++++++++++++++++ .../Animations/AnimationPlaybackEvent.idl | 15 ++++++ Userland/Libraries/LibWeb/CMakeLists.txt | 1 + Userland/Libraries/LibWeb/Forward.h | 1 + Userland/Libraries/LibWeb/idl_files.cmake | 1 + 6 files changed, 102 insertions(+) create mode 100644 Userland/Libraries/LibWeb/Animations/AnimationPlaybackEvent.cpp create mode 100644 Userland/Libraries/LibWeb/Animations/AnimationPlaybackEvent.h create mode 100644 Userland/Libraries/LibWeb/Animations/AnimationPlaybackEvent.idl diff --git a/Userland/Libraries/LibWeb/Animations/AnimationPlaybackEvent.cpp b/Userland/Libraries/LibWeb/Animations/AnimationPlaybackEvent.cpp new file mode 100644 index 0000000000..21bb7420e2 --- /dev/null +++ b/Userland/Libraries/LibWeb/Animations/AnimationPlaybackEvent.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2023, Matthew Olsson . + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include + +namespace Web::Animations { + +JS::NonnullGCPtr AnimationPlaybackEvent::create(JS::Realm& realm, FlyString const& event_name, AnimationPlaybackEventInit const& event_init) +{ + return realm.heap().allocate(realm, realm, event_name, event_init); +} + +// https://www.w3.org/TR/web-animations-1/#dom-animationplaybackevent-animationplaybackevent +WebIDL::ExceptionOr> AnimationPlaybackEvent::construct_impl(JS::Realm& realm, FlyString const& event_name, AnimationPlaybackEventInit const& event_init) +{ + return create(realm, event_name, event_init); +} + +AnimationPlaybackEvent::AnimationPlaybackEvent(JS::Realm& realm, FlyString const& event_name, AnimationPlaybackEventInit const& event_init) + : DOM::Event(realm, event_name, event_init) + , m_current_time(event_init.current_time) + , m_timeline_time(event_init.timeline_time) +{ +} + +void AnimationPlaybackEvent::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + set_prototype(&Bindings::ensure_web_prototype(realm, "AnimationPlaybackEvent")); +} + +} diff --git a/Userland/Libraries/LibWeb/Animations/AnimationPlaybackEvent.h b/Userland/Libraries/LibWeb/Animations/AnimationPlaybackEvent.h new file mode 100644 index 0000000000..d9666f172a --- /dev/null +++ b/Userland/Libraries/LibWeb/Animations/AnimationPlaybackEvent.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2023, Matthew Olsson . + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Web::Animations { + +// https://www.w3.org/TR/web-animations-1/#dictdef-animationplaybackeventinit +struct AnimationPlaybackEventInit : public DOM::EventInit { + Optional current_time {}; + Optional timeline_time {}; +}; + +// https://www.w3.org/TR/web-animations-1/#animationplaybackevent +class AnimationPlaybackEvent : public DOM::Event { + WEB_PLATFORM_OBJECT(AnimationPlaybackEvent, DOM::Event); + +public: + [[nodiscard]] static JS::NonnullGCPtr create(JS::Realm&, FlyString const& event_name, AnimationPlaybackEventInit const& event_init = {}); + static WebIDL::ExceptionOr> construct_impl(JS::Realm&, FlyString const& event_name, AnimationPlaybackEventInit const& event_init); + + virtual ~AnimationPlaybackEvent() override = default; + + Optional current_time() const { return m_current_time; } + void set_current_time(Optional current_time) { m_current_time = current_time; } + + Optional timeline_time() const { return m_timeline_time; } + void set_timeline_time(Optional timeline_time) { m_timeline_time = timeline_time; } + +private: + AnimationPlaybackEvent(JS::Realm&, FlyString const& event_name, AnimationPlaybackEventInit const& event_init); + + virtual void initialize(JS::Realm&) override; + + // https://www.w3.org/TR/web-animations-1/#dom-animationplaybackeventinit-currenttime + Optional m_current_time {}; + + // https://www.w3.org/TR/web-animations-1/#dom-animationplaybackeventinit-timelinetime + Optional m_timeline_time {}; +}; + +} diff --git a/Userland/Libraries/LibWeb/Animations/AnimationPlaybackEvent.idl b/Userland/Libraries/LibWeb/Animations/AnimationPlaybackEvent.idl new file mode 100644 index 0000000000..60b271b23e --- /dev/null +++ b/Userland/Libraries/LibWeb/Animations/AnimationPlaybackEvent.idl @@ -0,0 +1,15 @@ +#import + +// https://www.w3.org/TR/web-animations-1/#animationplaybackevent +[Exposed=Window] +interface AnimationPlaybackEvent : Event { + constructor(DOMString type, optional AnimationPlaybackEventInit eventInitDict = {}); + readonly attribute double? currentTime; + readonly attribute double? timelineTime; +}; + +// https://www.w3.org/TR/web-animations-1/#dictdef-animationplaybackeventinit +dictionary AnimationPlaybackEventInit : EventInit { + double? currentTime = null; + double? timelineTime = null; +}; diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index c91e01bb61..f274bf8e99 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -4,6 +4,7 @@ include(accelerated_graphics) set(SOURCES Animations/Animation.cpp Animations/AnimationEffect.cpp + Animations/AnimationPlaybackEvent.cpp Animations/AnimationTimeline.cpp Animations/DocumentTimeline.cpp Animations/TimingFunction.cpp diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 6cfb0ddf5e..0bd042366e 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -29,6 +29,7 @@ class RecordingPainter; namespace Web::Animations { class Animation; class AnimationEffect; +class AnimationPlaybackEvent; class AnimationTimeline; class DocumentTimeline; } diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index 2be955df56..4f683e26bc 100644 --- a/Userland/Libraries/LibWeb/idl_files.cmake +++ b/Userland/Libraries/LibWeb/idl_files.cmake @@ -3,6 +3,7 @@ libweb_js_bindings(Animations/Animation) libweb_js_bindings(Animations/AnimationEffect) +libweb_js_bindings(Animations/AnimationPlaybackEvent) libweb_js_bindings(Animations/AnimationTimeline) libweb_js_bindings(Animations/DocumentTimeline) libweb_js_bindings(Clipboard/Clipboard)