Sfoglia il codice sorgente

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.
Andreas Kling 2 anni fa
parent
commit
6e416284b9

+ 23 - 2
Userland/Libraries/LibWeb/HTML/Navigable.cpp

@@ -13,9 +13,21 @@
 
 namespace Web::HTML {
 
-Navigable::Navigable() = default;
+static HashTable<Navigable*>& all_navigables()
+{
+    static HashTable<Navigable*> 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::navigable_with_active_document(JS::NonnullGCPtr<DOM::Document> 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<DOM::Document> Navigable::active_document()
 {

+ 2 - 0
Userland/Libraries/LibWeb/HTML/Navigable.h

@@ -43,6 +43,8 @@ public:
     JS::GCPtr<TraversableNavigable> traversable_navigable();
     JS::GCPtr<TraversableNavigable> top_level_traversable();
 
+    static JS::GCPtr<Navigable> navigable_with_active_document(JS::NonnullGCPtr<DOM::Document>);
+
 protected:
     Navigable();