diff --git a/Userland/Libraries/LibWeb/DOM/DocumentObserver.cpp b/Userland/Libraries/LibWeb/DOM/DocumentObserver.cpp index 7ca2642af9a..d1e1c196109 100644 --- a/Userland/Libraries/LibWeb/DOM/DocumentObserver.cpp +++ b/Userland/Libraries/LibWeb/DOM/DocumentObserver.cpp @@ -21,6 +21,8 @@ void DocumentObserver::visit_edges(Cell::Visitor& visitor) { Base::visit_edges(visitor); visitor.visit(m_document); + visitor.visit(m_document_became_inactive); + visitor.visit(m_document_completely_loaded); } void DocumentObserver::finalize() @@ -29,4 +31,14 @@ void DocumentObserver::finalize() m_document->unregister_document_observer({}, *this); } +void DocumentObserver::set_document_became_inactive(Function callback) +{ + m_document_became_inactive = JS::create_heap_function(vm().heap(), move(callback)); +} + +void DocumentObserver::set_document_completely_loaded(Function callback) +{ + m_document_completely_loaded = JS::create_heap_function(vm().heap(), move(callback)); +} + } diff --git a/Userland/Libraries/LibWeb/DOM/DocumentObserver.h b/Userland/Libraries/LibWeb/DOM/DocumentObserver.h index d41be84aaca..d48152ae018 100644 --- a/Userland/Libraries/LibWeb/DOM/DocumentObserver.h +++ b/Userland/Libraries/LibWeb/DOM/DocumentObserver.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include #include #include @@ -17,8 +18,11 @@ class DocumentObserver final : public Bindings::PlatformObject { WEB_PLATFORM_OBJECT(DocumentObserver, Bindings::PlatformObject); public: - JS::SafeFunction document_became_inactive; - JS::SafeFunction document_completely_loaded; + [[nodiscard]] JS::GCPtr> document_became_inactive() const { return m_document_became_inactive; } + void set_document_became_inactive(Function); + + [[nodiscard]] JS::GCPtr> document_completely_loaded() const { return m_document_completely_loaded; } + void set_document_completely_loaded(Function); private: explicit DocumentObserver(JS::Realm&, DOM::Document&); @@ -27,6 +31,8 @@ private: virtual void finalize() override; JS::NonnullGCPtr m_document; + JS::GCPtr> m_document_became_inactive; + JS::GCPtr> m_document_completely_loaded; }; } diff --git a/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.cpp index bcb3fff9733..90d14e372f1 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLMediaElement.cpp @@ -57,11 +57,11 @@ void HTMLMediaElement::initialize(JS::Realm& realm) m_document_observer = realm.heap().allocate(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]() { + m_document_observer->set_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(); - }; + }); } // https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task diff --git a/Userland/Libraries/LibWeb/SVG/SVGUseElement.cpp b/Userland/Libraries/LibWeb/SVG/SVGUseElement.cpp index ce93ff17d9c..f64f049a9da 100644 --- a/Userland/Libraries/LibWeb/SVG/SVGUseElement.cpp +++ b/Userland/Libraries/LibWeb/SVG/SVGUseElement.cpp @@ -34,9 +34,9 @@ void SVGUseElement::initialize(JS::Realm& realm) set_shadow_root(shadow_root); m_document_observer = realm.heap().allocate(realm, realm, document()); - m_document_observer->document_completely_loaded = [this]() { + m_document_observer->set_document_completely_loaded([this]() { clone_element_tree_as_our_shadow_tree(referenced_element()); - }; + }); } void SVGUseElement::visit_edges(Cell::Visitor& visitor)