diff options
author | Timothy Flynn <trflynn89@pm.me> | 2023-05-04 08:50:34 -0400 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2023-05-04 16:48:10 +0200 |
commit | ac8b892a25a0f00eb61ad6faf34aa52853f7d74e (patch) | |
tree | 23e8e8ceb84d8bebdee2bd6944835215d9f9b1ac /Userland | |
parent | f78eadf00f0b738ebd69a28e19890289cf184d9a (diff) | |
download | serenity-ac8b892a25a0f00eb61ad6faf34aa52853f7d74e.zip |
LibWeb: Pause HTMLMediaElement when its document becomes inactive
For example, when navigating to another page, this ensures any media
resource will not continue playing.
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Libraries/LibWeb/HTML/HTMLMediaElement.cpp | 10 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/HTML/HTMLMediaElement.h | 2 |
2 files changed, 12 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.cpp index a1c5e935e7..fd9a4cf34d 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.cpp @@ -10,6 +10,7 @@ #include <LibWeb/Bindings/HTMLMediaElementPrototype.h> #include <LibWeb/Bindings/Intrinsics.h> #include <LibWeb/DOM/Document.h> +#include <LibWeb/DOM/DocumentObserver.h> #include <LibWeb/DOM/Event.h> #include <LibWeb/Fetch/Fetching/Fetching.h> #include <LibWeb/Fetch/Infrastructure/FetchAlgorithms.h> @@ -46,6 +47,14 @@ JS::ThrowCompletionOr<void> HTMLMediaElement::initialize(JS::Realm& realm) set_prototype(&Bindings::ensure_web_prototype<Bindings::HTMLMediaElementPrototype>(realm, "HTMLMediaElement")); m_video_tracks = TRY(realm.heap().allocate<VideoTrackList>(realm, realm)); + m_document_observer = TRY(realm.heap().allocate<DOM::DocumentObserver>(realm, realm, document())); + + // https://html.spec.whatwg.org/multipage/media.html#playing-the-media-resource:media-element-82 + m_document_observer->document_became_inactive = [this]() { + // If the media element's node document stops being a fully active document, then the playback will stop until + // the document is active again. + pause_element().release_value_but_fixme_should_propagate_errors(); + }; return {}; } @@ -64,6 +73,7 @@ void HTMLMediaElement::visit_edges(Cell::Visitor& visitor) visitor.visit(m_error); visitor.visit(m_fetch_controller); visitor.visit(m_video_tracks); + visitor.visit(m_document_observer); } void HTMLMediaElement::parse_attribute(DeprecatedFlyString const& name, DeprecatedString const& value) diff --git a/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.h b/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.h index 74109250f5..9638e5464a 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.h @@ -208,6 +208,8 @@ private: bool m_running_time_update_event_handler { false }; Optional<Time> m_last_time_update_event_time; + JS::GCPtr<DOM::DocumentObserver> m_document_observer; + JS::GCPtr<Fetch::Infrastructure::FetchController> m_fetch_controller; bool m_seek_in_progress = false; |