Explorar o código

LibWeb: Implement [SameObject] behavior for HTMLTableSectionElement.rows

Andreas Kling %!s(int64=2) %!d(string=hai) anos
pai
achega
ad36bc72f4

+ 13 - 6
Userland/Libraries/LibWeb/HTML/HTMLTableSectionElement.cpp

@@ -22,17 +22,24 @@ HTMLTableSectionElement::HTMLTableSectionElement(DOM::Document& document, DOM::Q
 
 
 HTMLTableSectionElement::~HTMLTableSectionElement() = default;
 HTMLTableSectionElement::~HTMLTableSectionElement() = default;
 
 
+void HTMLTableSectionElement::visit_edges(Cell::Visitor& visitor)
+{
+    Base::visit_edges(visitor);
+    visitor.visit(m_rows);
+}
+
 // https://html.spec.whatwg.org/multipage/tables.html#dom-tbody-rows
 // https://html.spec.whatwg.org/multipage/tables.html#dom-tbody-rows
 JS::NonnullGCPtr<DOM::HTMLCollection> HTMLTableSectionElement::rows() const
 JS::NonnullGCPtr<DOM::HTMLCollection> HTMLTableSectionElement::rows() const
 {
 {
     // The rows attribute must return an HTMLCollection rooted at this element,
     // The rows attribute must return an HTMLCollection rooted at this element,
     // whose filter matches only tr elements that are children of this element.
     // whose filter matches only tr elements that are children of this element.
-    // FIXME: This should return the same HTMLCollection object every time,
-    //        but that would cause a reference cycle since HTMLCollection refs the root.
-    return DOM::HTMLCollection::create(const_cast<HTMLTableSectionElement&>(*this), [this](Element const& element) {
-        return element.parent() == this
-            && is<HTMLTableRowElement>(element);
-    });
+    if (!m_rows) {
+        m_rows = DOM::HTMLCollection::create(const_cast<HTMLTableSectionElement&>(*this), [this](Element const& element) {
+            return element.parent() == this
+                && is<HTMLTableRowElement>(element);
+        });
+    }
+    return *m_rows;
 }
 }
 
 
 // https://html.spec.whatwg.org/multipage/tables.html#dom-tbody-insertrow
 // https://html.spec.whatwg.org/multipage/tables.html#dom-tbody-insertrow

+ 4 - 0
Userland/Libraries/LibWeb/HTML/HTMLTableSectionElement.h

@@ -23,6 +23,10 @@ public:
 
 
 private:
 private:
     HTMLTableSectionElement(DOM::Document&, DOM::QualifiedName);
     HTMLTableSectionElement(DOM::Document&, DOM::QualifiedName);
+
+    virtual void visit_edges(Cell::Visitor&) override;
+
+    JS::GCPtr<DOM::HTMLCollection> mutable m_rows;
 };
 };
 
 
 }
 }