diff --git a/Userland/Libraries/LibWeb/DOM/Document.cpp b/Userland/Libraries/LibWeb/DOM/Document.cpp index 83dd9cdc94e..b0749e76c9e 100644 --- a/Userland/Libraries/LibWeb/DOM/Document.cpp +++ b/Userland/Libraries/LibWeb/DOM/Document.cpp @@ -3045,6 +3045,19 @@ bool Document::anything_is_delaying_the_load_event() const return false; } +void Document::set_page_showing(bool page_showing) +{ + if (m_page_showing == page_showing) + return; + + m_page_showing = page_showing; + + for (auto document_observer : m_document_observers) { + if (document_observer->document_page_showing_observer()) + document_observer->document_page_showing_observer()->function()(m_page_showing); + } +} + void Document::invalidate_stacking_context_tree() { if (auto* paintable_box = this->paintable_box()) diff --git a/Userland/Libraries/LibWeb/DOM/Document.h b/Userland/Libraries/LibWeb/DOM/Document.h index 0687b2812a0..758ca510e30 100644 --- a/Userland/Libraries/LibWeb/DOM/Document.h +++ b/Userland/Libraries/LibWeb/DOM/Document.h @@ -426,7 +426,7 @@ public: void decrement_number_of_things_delaying_the_load_event(Badge); bool page_showing() const { return m_page_showing; } - void set_page_showing(bool value) { m_page_showing = value; } + void set_page_showing(bool); bool hidden() const; StringView visibility_state() const; diff --git a/Userland/Libraries/LibWeb/DOM/DocumentObserver.cpp b/Userland/Libraries/LibWeb/DOM/DocumentObserver.cpp index 0728a6defa1..ae2ee3aa3ce 100644 --- a/Userland/Libraries/LibWeb/DOM/DocumentObserver.cpp +++ b/Userland/Libraries/LibWeb/DOM/DocumentObserver.cpp @@ -27,6 +27,7 @@ void DocumentObserver::visit_edges(Cell::Visitor& visitor) visitor.visit(m_document_completely_loaded); visitor.visit(m_document_readiness_observer); visitor.visit(m_document_visibility_state_observer); + visitor.visit(m_document_page_showing_observer); } void DocumentObserver::finalize() @@ -67,4 +68,12 @@ void DocumentObserver::set_document_visibility_state_observer(Function callback) +{ + if (callback) + m_document_page_showing_observer = JS::create_heap_function(vm().heap(), move(callback)); + else + m_document_page_showing_observer = nullptr; +} + } diff --git a/Userland/Libraries/LibWeb/DOM/DocumentObserver.h b/Userland/Libraries/LibWeb/DOM/DocumentObserver.h index 25cd63661b6..ad4f0ba15e8 100644 --- a/Userland/Libraries/LibWeb/DOM/DocumentObserver.h +++ b/Userland/Libraries/LibWeb/DOM/DocumentObserver.h @@ -32,6 +32,9 @@ public: [[nodiscard]] JS::GCPtr> document_visibility_state_observer() const { return m_document_visibility_state_observer; } void set_document_visibility_state_observer(Function); + [[nodiscard]] JS::GCPtr> document_page_showing_observer() const { return m_document_page_showing_observer; } + void set_document_page_showing_observer(Function); + private: explicit DocumentObserver(JS::Realm&, DOM::Document&); @@ -43,6 +46,7 @@ private: JS::GCPtr> m_document_completely_loaded; JS::GCPtr> m_document_readiness_observer; JS::GCPtr> m_document_visibility_state_observer; + JS::GCPtr> m_document_page_showing_observer; }; }