diff --git a/Tests/LibWeb/Text/data/video-gc-frame.html b/Tests/LibWeb/Text/data/video-gc-frame.html new file mode 100644 index 00000000000..9f7a69a30ac --- /dev/null +++ b/Tests/LibWeb/Text/data/video-gc-frame.html @@ -0,0 +1 @@ + diff --git a/Tests/LibWeb/Text/expected/video-gc.txt b/Tests/LibWeb/Text/expected/video-gc.txt new file mode 100644 index 00000000000..39701378c55 --- /dev/null +++ b/Tests/LibWeb/Text/expected/video-gc.txt @@ -0,0 +1 @@ + PASS (didn't crash) diff --git a/Tests/LibWeb/Text/input/video-gc.html b/Tests/LibWeb/Text/input/video-gc.html new file mode 100644 index 00000000000..a456996e4c6 --- /dev/null +++ b/Tests/LibWeb/Text/input/video-gc.html @@ -0,0 +1,25 @@ + + + diff --git a/Userland/Libraries/LibWeb/HTML/HTMLVideoElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLVideoElement.cpp index ae3d4da3cb7..414499dbc31 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLVideoElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLVideoElement.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -36,6 +37,14 @@ void HTMLVideoElement::initialize(JS::Realm& realm) WEB_SET_PROTOTYPE_FOR_INTERFACE(HTMLVideoElement); } +void HTMLVideoElement::finalize() +{ + Base::finalize(); + + for (auto video_track : video_tracks()->video_tracks()) + video_track->stop_video({}); +} + void HTMLVideoElement::visit_edges(Cell::Visitor& visitor) { Base::visit_edges(visitor); diff --git a/Userland/Libraries/LibWeb/HTML/HTMLVideoElement.h b/Userland/Libraries/LibWeb/HTML/HTMLVideoElement.h index cf55a6f7bc4..720a78e0a04 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLVideoElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLVideoElement.h @@ -46,6 +46,7 @@ private: HTMLVideoElement(DOM::Document&, DOM::QualifiedName); virtual void initialize(JS::Realm&) override; + virtual void finalize() override; virtual void visit_edges(Cell::Visitor&) override; virtual void attribute_changed(FlyString const& name, Optional const& value) override; diff --git a/Userland/Libraries/LibWeb/HTML/VideoTrack.cpp b/Userland/Libraries/LibWeb/HTML/VideoTrack.cpp index d6f598f53a0..3ca06c52858 100644 --- a/Userland/Libraries/LibWeb/HTML/VideoTrack.cpp +++ b/Userland/Libraries/LibWeb/HTML/VideoTrack.cpp @@ -98,6 +98,11 @@ void VideoTrack::pause_video(Badge) m_playback_manager->pause_playback(); } +void VideoTrack::stop_video(Badge) +{ + m_playback_manager->terminate_playback(); +} + Duration VideoTrack::position() const { return m_playback_manager->current_playback_time(); @@ -141,7 +146,7 @@ void VideoTrack::set_selected(bool selected) // no longer in a VideoTrackList object, then the track being selected or unselected has no effect beyond changing the value of // the attribute on the VideoTrack object.) if (m_video_track_list) { - for (auto video_track : m_video_track_list->video_tracks({})) { + for (auto video_track : m_video_track_list->video_tracks()) { if (video_track.ptr() != this) video_track->m_selected = false; } diff --git a/Userland/Libraries/LibWeb/HTML/VideoTrack.h b/Userland/Libraries/LibWeb/HTML/VideoTrack.h index ad6f48ab261..5efbe86f625 100644 --- a/Userland/Libraries/LibWeb/HTML/VideoTrack.h +++ b/Userland/Libraries/LibWeb/HTML/VideoTrack.h @@ -25,6 +25,7 @@ public: void play_video(Badge); void pause_video(Badge); + void stop_video(Badge); Duration position() const; Duration duration() const; diff --git a/Userland/Libraries/LibWeb/HTML/VideoTrackList.h b/Userland/Libraries/LibWeb/HTML/VideoTrackList.h index 607d6e0d76a..dab77300643 100644 --- a/Userland/Libraries/LibWeb/HTML/VideoTrackList.h +++ b/Userland/Libraries/LibWeb/HTML/VideoTrackList.h @@ -22,7 +22,7 @@ public: ErrorOr add_track(Badge, JS::NonnullGCPtr); void remove_all_tracks(Badge); - Span> video_tracks(Badge) { return m_video_tracks; } + Span> video_tracks() { return m_video_tracks; } // https://html.spec.whatwg.org/multipage/media.html#dom-videotracklist-length size_t length() const { return m_video_tracks.size(); }