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();