diff --git a/Userland/Libraries/LibWeb/DOM/Document.cpp b/Userland/Libraries/LibWeb/DOM/Document.cpp index 6777b8ec8e0..5176523297b 100644 --- a/Userland/Libraries/LibWeb/DOM/Document.cpp +++ b/Userland/Libraries/LibWeb/DOM/Document.cpp @@ -2729,7 +2729,11 @@ void Document::update_the_visibility_state(HTML::VisibilityState visibility_stat // 2. Set document's visibility state to visibilityState. m_visibility_state = visibility_state; - // FIXME: 3. Run any page visibility change steps which may be defined in other specifications, with visibility state and document. + // 3. Run any page visibility change steps which may be defined in other specifications, with visibility state and document. + for (auto document_observer : m_document_observers) { + if (document_observer->document_visibility_state_observer()) + document_observer->document_visibility_state_observer()->function()(m_visibility_state); + } // 4. Fire an event named visibilitychange at document, with its bubbles attribute initialized to true. auto event = DOM::Event::create(realm(), HTML::EventNames::visibilitychange); diff --git a/Userland/Libraries/LibWeb/DOM/Document.h b/Userland/Libraries/LibWeb/DOM/Document.h index 08896e81966..30d6c5d3c30 100644 --- a/Userland/Libraries/LibWeb/DOM/Document.h +++ b/Userland/Libraries/LibWeb/DOM/Document.h @@ -430,6 +430,7 @@ public: bool hidden() const; StringView visibility_state() const; + HTML::VisibilityState visibility_state_value() const { return m_visibility_state; } // https://html.spec.whatwg.org/multipage/interaction.html#update-the-visibility-state void update_the_visibility_state(HTML::VisibilityState); diff --git a/Userland/Libraries/LibWeb/DOM/DocumentObserver.cpp b/Userland/Libraries/LibWeb/DOM/DocumentObserver.cpp index 335bd15fe38..0728a6defa1 100644 --- a/Userland/Libraries/LibWeb/DOM/DocumentObserver.cpp +++ b/Userland/Libraries/LibWeb/DOM/DocumentObserver.cpp @@ -26,6 +26,7 @@ void DocumentObserver::visit_edges(Cell::Visitor& visitor) visitor.visit(m_document_became_inactive); visitor.visit(m_document_completely_loaded); visitor.visit(m_document_readiness_observer); + visitor.visit(m_document_visibility_state_observer); } void DocumentObserver::finalize() @@ -58,4 +59,12 @@ void DocumentObserver::set_document_readiness_observer(Function callback) +{ + if (callback) + m_document_visibility_state_observer = JS::create_heap_function(vm().heap(), move(callback)); + else + m_document_visibility_state_observer = nullptr; +} + } diff --git a/Userland/Libraries/LibWeb/DOM/DocumentObserver.h b/Userland/Libraries/LibWeb/DOM/DocumentObserver.h index 7858c029af1..91ccbdb1d8f 100644 --- a/Userland/Libraries/LibWeb/DOM/DocumentObserver.h +++ b/Userland/Libraries/LibWeb/DOM/DocumentObserver.h @@ -12,6 +12,7 @@ #include #include #include +#include namespace Web::DOM { @@ -29,6 +30,9 @@ public: [[nodiscard]] JS::GCPtr> document_readiness_observer() const { return m_document_readiness_observer; } void set_document_readiness_observer(Function); + [[nodiscard]] JS::GCPtr> document_visibility_state_observer() const { return m_document_visibility_state_observer; } + void set_document_visibility_state_observer(Function); + private: explicit DocumentObserver(JS::Realm&, DOM::Document&); @@ -39,6 +43,7 @@ private: JS::GCPtr> m_document_became_inactive; JS::GCPtr> m_document_completely_loaded; JS::GCPtr> m_document_readiness_observer; + JS::GCPtr> m_document_visibility_state_observer; }; }