From 6e416284b903feda4219eba81004a988921570d8 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 1 Jan 2023 17:43:05 +0100 Subject: [PATCH] LibWeb: Add API for finding Navigable with a given active document This will be used to look up a document's node navigable. It might be nice to have a direct pointer from Document to its Navigable, but at the moment I don't understand the algorithms well enough to maintain that linkage. --- Userland/Libraries/LibWeb/HTML/Navigable.cpp | 25 ++++++++++++++++++-- Userland/Libraries/LibWeb/HTML/Navigable.h | 2 ++ 2 files changed, 25 insertions(+), 2 deletions(-) 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();