diff --git a/Userland/Libraries/LibWeb/HTML/Navigable.cpp b/Userland/Libraries/LibWeb/HTML/Navigable.cpp
index 5fab6968c6..215e7d6d25 100644
--- a/Userland/Libraries/LibWeb/HTML/Navigable.cpp
+++ b/Userland/Libraries/LibWeb/HTML/Navigable.cpp
@@ -13,9 +13,21 @@
namespace Web::HTML {
-Navigable::Navigable() = default;
+static HashTable& all_navigables()
+{
+ static HashTable set;
+ return set;
+}
-Navigable::~Navigable() = default;
+Navigable::Navigable()
+{
+ all_navigables().set(this);
+}
+
+Navigable::~Navigable()
+{
+ all_navigables().remove(this);
+}
void Navigable::visit_edges(Cell::Visitor& visitor)
{
@@ -26,6 +38,15 @@ void Navigable::visit_edges(Cell::Visitor& visitor)
visitor.visit(m_container);
}
+JS::GCPtr Navigable::navigable_with_active_document(JS::NonnullGCPtr document)
+{
+ for (auto* navigable : all_navigables()) {
+ if (navigable->active_document() == document)
+ return navigable;
+ }
+ return nullptr;
+}
+
// https://html.spec.whatwg.org/multipage/document-sequences.html#nav-document
JS::GCPtr Navigable::active_document()
{
diff --git a/Userland/Libraries/LibWeb/HTML/Navigable.h b/Userland/Libraries/LibWeb/HTML/Navigable.h
index dc896e0d98..834c4b103e 100644
--- a/Userland/Libraries/LibWeb/HTML/Navigable.h
+++ b/Userland/Libraries/LibWeb/HTML/Navigable.h
@@ -43,6 +43,8 @@ public:
JS::GCPtr traversable_navigable();
JS::GCPtr top_level_traversable();
+ static JS::GCPtr navigable_with_active_document(JS::NonnullGCPtr);
+
protected:
Navigable();