/* * Copyright (c) 2026, Gregory Bertilson * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include namespace Web::HTML { class HTMLMediaElement; class MediaControls { public: explicit MediaControls(HTMLMediaElement&); ~MediaControls(); private: void create_shadow_tree(); enum class ListenOnce : bool { No, Yes, }; template Handler> GC::Ref add_event_listener(JS::Realm&, DOM::EventTarget&, FlyString const& event_name, ListenOnce, Handler); template Handler> GC::Ref add_event_listener(JS::Realm&, DOM::EventTarget&, FlyString const& event_nam, Handler); template Handler> GC::Ref add_event_listener(JS::Realm&, DOM::EventTarget&, FlyString const& event_name, Handler); template Handler> GC::Ref add_event_listener(JS::Realm&, DOM::EventTarget&, FlyString const& event_name, ListenOnce, Handler); template Handler> GC::Ref add_event_listener(JS::Realm&, DOM::EventTarget&, FlyString const& event_name, Handler); void remove_event_listeners(); void set_up_event_listeners(); void toggle_playback(); void set_current_time(double); void set_volume(double); void toggle_mute(); void update_play_pause_icon(); void update_timeline(); void update_timestamp(); void update_volume_and_mute_indicator(); void update_placeholder_visibility(); void show_controls(); void hide_controls(); GC::Weak m_media_element; GC::Weak m_control_bar; GC::Weak m_timeline_element; GC::Weak m_timeline_fill; GC::Weak m_play_button; GC::Weak m_play_pause_icon; GC::Weak m_timestamp_element; GC::Weak m_mute_button; GC::Weak m_volume_area; GC::Weak m_volume_element; GC::Weak m_volume_fill; GC::Weak m_video_overlay; GC::Weak m_placeholder_circle; struct RegisteredEventListener { GC::Weak target; FlyString event_name; GC::Weak listener; }; Vector m_registered_event_listeners; enum class Scrubbing : u8 { No, WhilePaused, WhilePlaying, }; Scrubbing m_scrubbing_timeline { Scrubbing::No }; bool m_scrubbing_volume { false }; bool m_hovering_controls { false }; RefPtr m_hover_timer; bool m_had_audio { true }; bool m_was_muted { false }; enum class MuteIconState : u8 { Empty, Low, High, }; MuteIconState m_mute_icon_state { MuteIconState::Empty }; }; }