diff --git a/Userland/Libraries/LibWeb/HTML/Navigable.cpp b/Userland/Libraries/LibWeb/HTML/Navigable.cpp index 0d3e1f377f9..a89349a302f 100644 --- a/Userland/Libraries/LibWeb/HTML/Navigable.cpp +++ b/Userland/Libraries/LibWeb/HTML/Navigable.cpp @@ -101,7 +101,8 @@ bool Navigable::is_ancestor_of(JS::NonnullGCPtr other) const return false; } -Navigable::Navigable() +Navigable::Navigable(JS::NonnullGCPtr page) + : m_page(page) { all_navigables().set(this); } @@ -114,6 +115,7 @@ Navigable::~Navigable() void Navigable::visit_edges(Cell::Visitor& visitor) { Base::visit_edges(visitor); + visitor.visit(m_page); visitor.visit(m_parent); visitor.visit(m_current_session_history_entry); visitor.visit(m_active_session_history_entry); diff --git a/Userland/Libraries/LibWeb/HTML/Navigable.h b/Userland/Libraries/LibWeb/HTML/Navigable.h index 9de036735c2..9ed65de98ba 100644 --- a/Userland/Libraries/LibWeb/HTML/Navigable.h +++ b/Userland/Libraries/LibWeb/HTML/Navigable.h @@ -183,8 +183,11 @@ public: }; void paint(Painting::RecordingPainter&, PaintConfig); + Page& page() { return m_page; } + Page const& page() const { return m_page; } + protected: - Navigable(); + explicit Navigable(JS::NonnullGCPtr); virtual void visit_edges(Cell::Visitor&) override; @@ -220,6 +223,8 @@ private: // Implied link between navigable and its container. JS::GCPtr m_container; + JS::NonnullGCPtr m_page; + bool m_has_been_destroyed { false }; CSSPixelSize m_size; diff --git a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp index f9cd5cce49c..6d2e6947716 100644 --- a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp +++ b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp @@ -23,8 +23,8 @@ namespace Web::HTML { JS_DEFINE_ALLOCATOR(TraversableNavigable); TraversableNavigable::TraversableNavigable(JS::NonnullGCPtr page) - : m_session_history_traversal_queue(vm().heap().allocate_without_realm()) - , m_page(page) + : Navigable(page) + , m_session_history_traversal_queue(vm().heap().allocate_without_realm()) { } @@ -33,7 +33,6 @@ TraversableNavigable::~TraversableNavigable() = default; void TraversableNavigable::visit_edges(Cell::Visitor& visitor) { Base::visit_edges(visitor); - visitor.visit(m_page); visitor.visit(m_session_history_entries); visitor.visit(m_session_history_traversal_queue); } diff --git a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h index c330d6347ed..bf2c9df4ee7 100644 --- a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h +++ b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h @@ -79,9 +79,6 @@ public: m_session_history_traversal_queue->append_sync(move(steps), target_navigable); } - Page& page() { return m_page; } - Page const& page() const { return m_page; } - String window_handle() const { return m_window_handle; } void set_window_handle(String window_handle) { m_window_handle = move(window_handle); } @@ -120,8 +117,6 @@ private: JS::NonnullGCPtr m_session_history_traversal_queue; - JS::NonnullGCPtr m_page; - String m_window_handle; };