diff --git a/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.cpp
index c55efef7f03..48ef8b2aef2 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.cpp
@@ -65,6 +65,13 @@ void HTMLMediaElement::initialize(JS::Realm& realm)
// the document is active again.
pause_element().release_value_but_fixme_should_propagate_errors();
});
+
+ document().page().register_media_element({}, unique_id());
+}
+
+void HTMLMediaElement::finalize()
+{
+ document().page().unregister_media_element({}, unique_id());
}
// https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.h b/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.h
index 7f908424da3..c08d2da0469 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.h
@@ -132,6 +132,7 @@ protected:
HTMLMediaElement(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/Page/Page.cpp b/Userland/Libraries/LibWeb/Page/Page.cpp
index b1388406b89..6f4fff85e20 100644
--- a/Userland/Libraries/LibWeb/Page/Page.cpp
+++ b/Userland/Libraries/LibWeb/Page/Page.cpp
@@ -390,6 +390,18 @@ void Page::select_dropdown_closed(Optional value)
}
}
+void Page::register_media_element(Badge, int media_id)
+{
+ m_media_elements.append(media_id);
+}
+
+void Page::unregister_media_element(Badge, int media_id)
+{
+ m_media_elements.remove_all_matching([&](auto candidate_id) {
+ return candidate_id == media_id;
+ });
+}
+
void Page::did_request_media_context_menu(i32 media_id, CSSPixelPoint position, ByteString const& target, unsigned modifiers, MediaContextMenu menu)
{
m_media_context_menu_element_id = media_id;
diff --git a/Userland/Libraries/LibWeb/Page/Page.h b/Userland/Libraries/LibWeb/Page/Page.h
index 9b199900f16..0544979e842 100644
--- a/Userland/Libraries/LibWeb/Page/Page.h
+++ b/Userland/Libraries/LibWeb/Page/Page.h
@@ -150,6 +150,9 @@ public:
Select,
};
+ void register_media_element(Badge, int media_id);
+ void unregister_media_element(Badge, int media_id);
+
struct MediaContextMenu {
URL::URL media_url;
bool is_video { false };
@@ -204,6 +207,7 @@ private:
PendingNonBlockingDialog m_pending_non_blocking_dialog { PendingNonBlockingDialog::None };
WeakPtr m_pending_non_blocking_dialog_target;
+ Vector m_media_elements;
Optional m_media_context_menu_element_id;
Optional m_user_style_sheet_source;