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;
};