From b384f2009db79d522602f30399c5fdb3ed05b2b4 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Thu, 20 Apr 2023 06:49:06 -0400 Subject: [PATCH] LibWeb: Implement the HTMLMediaElement show-poster flag Note that this doesn't do much yet, as the HTMLVideoElement does not handle its poster attribute as of this commit. --- .../LibWeb/HTML/HTMLMediaElement.cpp | 32 ++++++++++++++++--- .../Libraries/LibWeb/HTML/HTMLMediaElement.h | 5 +++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.cpp index 9fec1596ba..d7960e696d 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.cpp @@ -385,7 +385,8 @@ WebIDL::ExceptionOr HTMLMediaElement::select_resource() // 1. Set the element's networkState attribute to the NETWORK_NO_SOURCE value. m_network_state = NetworkState::NoSource; - // FIXME: 2. Set the element's show poster flag to true. + // 2. Set the element's show poster flag to true. + set_show_poster(true); // 3. Set the media element's delaying-the-load-event flag to true (this delays the load event). m_delaying_the_load_event.emplace(document()); @@ -877,7 +878,8 @@ WebIDL::ExceptionOr HTMLMediaElement::handle_media_source_failure(Span HTMLMediaElement::play_element() // 1. Change the value of paused to false. set_paused(false); - // FIXME: 2. If the show poster flag is true, set the element's show poster flag to false and run the time marches on steps. + // 2. If the show poster flag is true, set the element's show poster flag to false and run the time marches on steps. + if (m_show_poster) { + set_show_poster(false); + time_marches_on(); + } // 3. Queue a media element task given the media element to fire an event named play at the element. queue_a_media_element_task([this]() { @@ -1110,7 +1120,8 @@ WebIDL::ExceptionOr HTMLMediaElement::pause_element() // https://html.spec.whatwg.org/multipage/media.html#dom-media-seek void HTMLMediaElement::seek_element(double playback_position, MediaSeekMode seek_mode) { - // FIXME: 1. Set the media element's show poster flag to false. + // 1. Set the media element's show poster flag to false. + set_show_poster(false); // 2. If the media element's readyState is HAVE_NOTHING, return. if (m_ready_state == ReadyState::HaveNothing) @@ -1200,6 +1211,17 @@ void HTMLMediaElement::notify_about_playing() on_playing(); } +void HTMLMediaElement::set_show_poster(bool show_poster) +{ + if (m_show_poster == show_poster) + return; + + m_show_poster = show_poster; + + if (auto* layout_node = this->layout_node()) + layout_node->set_needs_display(); +} + void HTMLMediaElement::set_paused(bool paused) { if (m_paused == paused) diff --git a/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.h b/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.h index 307402b13b..5756414602 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.h @@ -68,6 +68,7 @@ public: void set_current_playback_position(double); double duration() const; + bool show_poster() const { return m_show_poster; } bool paused() const { return m_paused; } bool ended() const; bool potentially_playing() const; @@ -113,6 +114,7 @@ private: WebIDL::ExceptionOr pause_element(); void seek_element(double playback_position, MediaSeekMode = MediaSeekMode::Accurate); void notify_about_playing(); + void set_show_poster(bool); void set_paused(bool); void set_duration(double); @@ -171,6 +173,9 @@ private: // https://html.spec.whatwg.org/multipage/media.html#default-playback-start-position double m_default_playback_start_position { 0 }; + // https://html.spec.whatwg.org/multipage/media.html#show-poster-flag + bool m_show_poster { true }; + // https://html.spec.whatwg.org/multipage/media.html#dom-media-duration double m_duration { NAN };