Prechádzať zdrojové kódy

LibWeb: Add API for finding NavigableContainer by content navigable

This is only needed because currently spec doesn't explicitly define
that navigable should have a pointer to associated container and when
this pointer should be set.
Aliaksandr Kalenik 2 rokov pred
rodič
commit
d85bdd3ac5

+ 1 - 6
Userland/Libraries/LibWeb/HTML/Navigable.cpp

@@ -190,12 +190,7 @@ String Navigable::target_name() const
 JS::GCPtr<NavigableContainer> Navigable::container() const
 {
     // The container of a navigable navigable is the navigable container whose nested navigable is navigable, or null if there is no such element.
-    return m_container;
-}
-
-void Navigable::set_container(JS::GCPtr<NavigableContainer> container)
-{
-    m_container = container;
+    return NavigableContainer::navigable_container_with_content_navigable(const_cast<Navigable&>(*this));
 }
 
 // https://html.spec.whatwg.org/multipage/document-sequences.html#nav-traversable

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

@@ -60,7 +60,6 @@ public:
     String target_name() const;
 
     JS::GCPtr<NavigableContainer> container() const;
-    void set_container(JS::GCPtr<NavigableContainer>);
 
     JS::GCPtr<TraversableNavigable> traversable_navigable() const;
     JS::GCPtr<TraversableNavigable> top_level_traversable();

+ 14 - 1
Userland/Libraries/LibWeb/HTML/NavigableContainer.cpp

@@ -27,9 +27,13 @@ HashTable<NavigableContainer*>& NavigableContainer::all_instances()
 NavigableContainer::NavigableContainer(DOM::Document& document, DOM::QualifiedName qualified_name)
     : HTMLElement(document, move(qualified_name))
 {
+    all_instances().set(this);
 }
 
-NavigableContainer::~NavigableContainer() = default;
+NavigableContainer::~NavigableContainer()
+{
+    all_instances().remove(this);
+}
 
 void NavigableContainer::visit_edges(Cell::Visitor& visitor)
 {
@@ -37,6 +41,15 @@ void NavigableContainer::visit_edges(Cell::Visitor& visitor)
     visitor.visit(m_nested_browsing_context);
 }
 
+JS::GCPtr<NavigableContainer> NavigableContainer::navigable_container_with_content_navigable(JS::NonnullGCPtr<Navigable> navigable)
+{
+    for (auto* navigable_container : all_instances()) {
+        if (navigable_container->content_navigable() == navigable)
+            return navigable_container;
+    }
+    return nullptr;
+}
+
 // https://html.spec.whatwg.org/multipage/browsers.html#creating-a-new-nested-browsing-context
 void NavigableContainer::create_new_nested_browsing_context()
 {

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

@@ -14,6 +14,8 @@ class NavigableContainer : public HTMLElement {
     WEB_PLATFORM_OBJECT(NavigableContainer, HTMLElement);
 
 public:
+    static JS::GCPtr<NavigableContainer> navigable_container_with_content_navigable(JS::NonnullGCPtr<Navigable> navigable);
+
     virtual ~NavigableContainer() override;
 
     static HashTable<NavigableContainer*>& all_instances();