Title: [266212] trunk/Source/WebCore
Revision
266212
Author
[email protected]
Date
2020-08-26 18:26:24 -0700 (Wed, 26 Aug 2020)

Log Message

Make it possible to create a WeakPtr to Node and use it store assigned nodes in SlotAssignment
https://bugs.webkit.org/show_bug.cgi?id=215673
<rdar://problem/67440818>

Reviewed by Darin Adler.

This patch makes Node inherit from CanMakeWeakPtr<Node> and uses it in SlotAssignment's assignedNodes
and related member variables and functions.

No new tests since there should be no behavioral difference.

* dom/ComposedTreeIterator.cpp:
(WebCore::ComposedTreeIterator::traverseNextInShadowTree):
(WebCore::ComposedTreeIterator::advanceInSlot):
* dom/ComposedTreeIterator.h:
(WebCore::firstChildInComposedTreeIgnoringUserAgentShadow):
(WebCore::nextSiblingInComposedTreeIgnoringUserAgentShadow):
* dom/ContainerNode.h:
* dom/Node.h:
* dom/ShadowRoot.cpp:
(WebCore::ShadowRoot::assignedNodesForSlot):
* dom/ShadowRoot.h:
* dom/SlotAssignment.cpp:
(WebCore::SlotAssignment::assignedNodesForSlot):
(WebCore::SlotAssignment::assignToSlot):
* dom/SlotAssignment.h:
* html/HTMLSlotElement.cpp:
(WebCore::HTMLSlotElement::assignedNodes const):
(WebCore::flattenAssignedNodes):
(WebCore:: const): Deleted.
* html/HTMLSlotElement.h:
* page/FocusController.cpp:
(WebCore::FocusNavigationScope::firstNodeInScope const):
(WebCore::FocusNavigationScope::lastNodeInScope const):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (266211 => 266212)


--- trunk/Source/WebCore/ChangeLog	2020-08-27 01:02:21 UTC (rev 266211)
+++ trunk/Source/WebCore/ChangeLog	2020-08-27 01:26:24 UTC (rev 266212)
@@ -1,3 +1,40 @@
+2020-08-25  Ryosuke Niwa  <[email protected]>
+
+        Make it possible to create a WeakPtr to Node and use it store assigned nodes in SlotAssignment
+        https://bugs.webkit.org/show_bug.cgi?id=215673
+        <rdar://problem/67440818>
+
+        Reviewed by Darin Adler.
+
+        This patch makes Node inherit from CanMakeWeakPtr<Node> and uses it in SlotAssignment's assignedNodes
+        and related member variables and functions.
+
+        No new tests since there should be no behavioral difference.
+
+        * dom/ComposedTreeIterator.cpp:
+        (WebCore::ComposedTreeIterator::traverseNextInShadowTree):
+        (WebCore::ComposedTreeIterator::advanceInSlot):
+        * dom/ComposedTreeIterator.h:
+        (WebCore::firstChildInComposedTreeIgnoringUserAgentShadow):
+        (WebCore::nextSiblingInComposedTreeIgnoringUserAgentShadow):
+        * dom/ContainerNode.h:
+        * dom/Node.h:
+        * dom/ShadowRoot.cpp:
+        (WebCore::ShadowRoot::assignedNodesForSlot):
+        * dom/ShadowRoot.h:
+        * dom/SlotAssignment.cpp:
+        (WebCore::SlotAssignment::assignedNodesForSlot):
+        (WebCore::SlotAssignment::assignToSlot):
+        * dom/SlotAssignment.h:
+        * html/HTMLSlotElement.cpp:
+        (WebCore::HTMLSlotElement::assignedNodes const):
+        (WebCore::flattenAssignedNodes):
+        (WebCore:: const): Deleted.
+        * html/HTMLSlotElement.h:
+        * page/FocusController.cpp:
+        (WebCore::FocusNavigationScope::firstNodeInScope const):
+        (WebCore::FocusNavigationScope::lastNodeInScope const):
+
 2020-08-26  Andres Gonzalez  <[email protected]>
 
         Buttons with aria-haspopup attribute are not exposed to accessibility clients as form controls.

Modified: trunk/Source/WebCore/dom/ComposedTreeIterator.cpp (266211 => 266212)


--- trunk/Source/WebCore/dom/ComposedTreeIterator.cpp	2020-08-27 01:02:21 UTC (rev 266211)
+++ trunk/Source/WebCore/dom/ComposedTreeIterator.cpp	2020-08-27 01:26:24 UTC (rev 266212)
@@ -163,7 +163,7 @@
         auto& slot = downcast<HTMLSlotElement>(current());
         if (auto* assignedNodes = slot.assignedNodes()) {
             context().slotNodeIndex = 0;
-            auto* assignedNode = assignedNodes->at(0);
+            auto* assignedNode = assignedNodes->at(0).get();
             m_contextStack.append(Context(*assignedNode->parentElement(), *assignedNode, Context::Slotted));
             return;
         }
@@ -197,7 +197,9 @@
     if (context().slotNodeIndex >= assignedNodes.size())
         return false;
 
-    auto* slotNode = assignedNodes.at(context().slotNodeIndex);
+    auto* slotNode = assignedNodes.at(context().slotNodeIndex).get();
+    if (!slotNode)
+        return false;
     m_contextStack.append(Context(*slotNode->parentElement(), *slotNode, Context::Slotted));
     return true;
 }

Modified: trunk/Source/WebCore/dom/ComposedTreeIterator.h (266211 => 266212)


--- trunk/Source/WebCore/dom/ComposedTreeIterator.h	2020-08-27 01:02:21 UTC (rev 266211)
+++ trunk/Source/WebCore/dom/ComposedTreeIterator.h	2020-08-27 01:26:24 UTC (rev 266212)
@@ -226,7 +226,7 @@
         return shadowRoot->firstChild();
     if (is<HTMLSlotElement>(node)) {
         if (auto* assignedNodes = downcast<HTMLSlotElement>(node).assignedNodes())
-            return assignedNodes->at(0);
+            return assignedNodes->at(0).get();
     }
     return node.firstChild();
 }
@@ -239,7 +239,7 @@
         auto nodeIndex = assignedNodes->find(&node);
         ASSERT(nodeIndex != notFound);
         if (assignedNodes->size() > nodeIndex + 1)
-            return assignedNodes->at(nodeIndex + 1);
+            return assignedNodes->at(nodeIndex + 1).get();
         return nullptr;
     }
     return node.nextSibling();

Modified: trunk/Source/WebCore/dom/ContainerNode.h (266211 => 266212)


--- trunk/Source/WebCore/dom/ContainerNode.h	2020-08-27 01:02:21 UTC (rev 266211)
+++ trunk/Source/WebCore/dom/ContainerNode.h	2020-08-27 01:26:24 UTC (rev 266212)
@@ -25,7 +25,6 @@
 
 #include "CollectionType.h"
 #include "Node.h"
-#include <wtf/WeakPtr.h>
 
 namespace WebCore {
 
@@ -36,7 +35,7 @@
 const int initialNodeVectorSize = 11; // Covers 99.5%. See webkit.org/b/80706
 typedef Vector<Ref<Node>, initialNodeVectorSize> NodeVector;
 
-class ContainerNode : public CanMakeWeakPtr<ContainerNode>, public Node {
+class ContainerNode : public Node {
     WTF_MAKE_ISO_ALLOCATED(ContainerNode);
 public:
     virtual ~ContainerNode();

Modified: trunk/Source/WebCore/dom/Node.h (266211 => 266212)


--- trunk/Source/WebCore/dom/Node.h	2020-08-27 01:02:21 UTC (rev 266211)
+++ trunk/Source/WebCore/dom/Node.h	2020-08-27 01:26:24 UTC (rev 266212)
@@ -37,6 +37,7 @@
 #include <wtf/ListHashSet.h>
 #include <wtf/MainThread.h>
 #include <wtf/URLHash.h>
+#include <wtf/WeakPtr.h>
 
 // This needs to be here because Document.h also depends on it.
 #define DUMP_NODE_STATISTICS 0
@@ -69,7 +70,7 @@
 
 using NodeOrString = Variant<RefPtr<Node>, String>;
 
-class Node : public EventTarget {
+class Node : public CanMakeWeakPtr<Node>, public EventTarget {
     WTF_MAKE_ISO_ALLOCATED(Node);
 
     friend class Document;

Modified: trunk/Source/WebCore/dom/ShadowRoot.cpp (266211 => 266212)


--- trunk/Source/WebCore/dom/ShadowRoot.cpp	2020-08-27 01:02:21 UTC (rev 266211)
+++ trunk/Source/WebCore/dom/ShadowRoot.cpp	2020-08-27 01:26:24 UTC (rev 266212)
@@ -253,7 +253,7 @@
     return m_slotAssignment->slotFallbackDidChange(slot, *this);
 }
 
-const Vector<Node*>* ShadowRoot::assignedNodesForSlot(const HTMLSlotElement& slot)
+const Vector<WeakPtr<Node>>* ShadowRoot::assignedNodesForSlot(const HTMLSlotElement& slot)
 {
     if (!m_slotAssignment)
         return nullptr;

Modified: trunk/Source/WebCore/dom/ShadowRoot.h (266211 => 266212)


--- trunk/Source/WebCore/dom/ShadowRoot.h	2020-08-27 01:02:21 UTC (rev 266211)
+++ trunk/Source/WebCore/dom/ShadowRoot.h	2020-08-27 01:26:24 UTC (rev 266212)
@@ -99,7 +99,7 @@
     void hostChildElementDidChange(const Element&);
     void hostChildElementDidChangeSlotAttribute(Element&, const AtomString& oldValue, const AtomString& newValue);
 
-    const Vector<Node*>* assignedNodesForSlot(const HTMLSlotElement&);
+    const Vector<WeakPtr<Node>>* assignedNodesForSlot(const HTMLSlotElement&);
 
     void moveShadowRootToNewParentScope(TreeScope&, Document&);
     void moveShadowRootToNewDocument(Document&);

Modified: trunk/Source/WebCore/dom/SlotAssignment.cpp (266211 => 266212)


--- trunk/Source/WebCore/dom/SlotAssignment.cpp	2020-08-27 01:02:21 UTC (rev 266211)
+++ trunk/Source/WebCore/dom/SlotAssignment.cpp	2020-08-27 01:26:24 UTC (rev 266212)
@@ -311,7 +311,7 @@
     didChangeSlot(childElement.attributeWithoutSynchronization(slotAttr), shadowRoot);
 }
 
-const Vector<Node*>* SlotAssignment::assignedNodesForSlot(const HTMLSlotElement& slotElement, ShadowRoot& shadowRoot)
+const Vector<WeakPtr<Node>>* SlotAssignment::assignedNodesForSlot(const HTMLSlotElement& slotElement, ShadowRoot& shadowRoot)
 {
     ASSERT(slotElement.containingShadowRoot() == &shadowRoot);
     const AtomString& slotName = slotNameFromAttributeValue(slotElement.attributeWithoutSynchronization(nameAttr));
@@ -400,7 +400,7 @@
     if (slotName == defaultSlotName()) {
         auto defaultSlotEntry = m_slots.find(defaultSlotName());
         if (defaultSlotEntry != m_slots.end())
-            defaultSlotEntry->value->assignedNodes.append(&child);
+            defaultSlotEntry->value->assignedNodes.append(makeWeakPtr(child));
         return;
     }
 
@@ -407,7 +407,7 @@
     auto addResult = m_slots.ensure(slotName, [] {
         return makeUnique<Slot>();
     });
-    addResult.iterator->value->assignedNodes.append(&child);
+    addResult.iterator->value->assignedNodes.append(makeWeakPtr(child));
 }
 
 }

Modified: trunk/Source/WebCore/dom/SlotAssignment.h (266211 => 266212)


--- trunk/Source/WebCore/dom/SlotAssignment.h	2020-08-27 01:02:21 UTC (rev 266211)
+++ trunk/Source/WebCore/dom/SlotAssignment.h	2020-08-27 01:26:24 UTC (rev 266212)
@@ -60,7 +60,7 @@
     void didChangeSlot(const AtomString&, ShadowRoot&);
     void enqueueSlotChangeEvent(const AtomString&, ShadowRoot&);
 
-    const Vector<Node*>* assignedNodesForSlot(const HTMLSlotElement&, ShadowRoot&);
+    const Vector<WeakPtr<Node>>* assignedNodesForSlot(const HTMLSlotElement&, ShadowRoot&);
 
     virtual void hostChildElementDidChange(const Element&, ShadowRoot&);
 
@@ -78,7 +78,7 @@
         WeakPtr<HTMLSlotElement> oldElement;
         unsigned elementCount { 0 };
         bool seenFirstElement { false };
-        Vector<Node*> assignedNodes;
+        Vector<WeakPtr<Node>> assignedNodes;
     };
 
     bool hasAssignedNodes(ShadowRoot&, Slot&);

Modified: trunk/Source/WebCore/html/HTMLSlotElement.cpp (266211 => 266212)


--- trunk/Source/WebCore/html/HTMLSlotElement.cpp	2020-08-27 01:02:21 UTC (rev 266211)
+++ trunk/Source/WebCore/html/HTMLSlotElement.cpp	2020-08-27 01:26:24 UTC (rev 266212)
@@ -95,7 +95,7 @@
     }
 }
 
-const Vector<Node*>* HTMLSlotElement::assignedNodes() const
+const Vector<WeakPtr<Node>>* HTMLSlotElement::assignedNodes() const
 {
     auto shadowRoot = makeRefPtr(containingShadowRoot());
     if (!shadowRoot)
@@ -119,7 +119,12 @@
         }
         return;
     }
-    for (const RefPtr<Node>& node : *assignedNodes) {
+    for (auto& nodeWeakPtr : *assignedNodes) {
+        auto* node = nodeWeakPtr.get();
+        if (UNLIKELY(!node)) {
+            ASSERT_NOT_REACHED();
+            continue;
+        }
         if (is<HTMLSlotElement>(*node) && downcast<HTMLSlotElement>(*node).containingShadowRoot())
             flattenAssignedNodes(nodes, downcast<HTMLSlotElement>(*node));
         else
@@ -139,7 +144,17 @@
     auto* assignedNodes = this->assignedNodes();
     if (!assignedNodes)
         return { };
-    return assignedNodes->map([] (Node* node) { return makeRef(*node); });
+
+    Vector<Ref<Node>> nodes;
+    nodes.reserveInitialCapacity(assignedNodes->size());
+    for (auto& nodePtr : *assignedNodes) {
+        auto* node = nodePtr.get();
+        if (UNLIKELY(!node))
+            continue;
+        nodes.uncheckedAppend(*node);
+    }
+
+    return nodes;
 }
 
 Vector<Ref<Element>> HTMLSlotElement::assignedElements(const AssignedNodesOptions& options) const

Modified: trunk/Source/WebCore/html/HTMLSlotElement.h (266211 => 266212)


--- trunk/Source/WebCore/html/HTMLSlotElement.h	2020-08-27 01:02:21 UTC (rev 266211)
+++ trunk/Source/WebCore/html/HTMLSlotElement.h	2020-08-27 01:26:24 UTC (rev 266212)
@@ -35,7 +35,7 @@
 public:
     static Ref<HTMLSlotElement> create(const QualifiedName&, Document&);
 
-    const Vector<Node*>* assignedNodes() const;
+    const Vector<WeakPtr<Node>>* assignedNodes() const;
     struct AssignedNodesOptions {
         bool flatten;
     };

Modified: trunk/Source/WebCore/page/FocusController.cpp (266211 => 266212)


--- trunk/Source/WebCore/page/FocusController.cpp	2020-08-27 01:02:21 UTC (rev 266211)
+++ trunk/Source/WebCore/page/FocusController.cpp	2020-08-27 01:26:24 UTC (rev 266212)
@@ -180,7 +180,7 @@
         auto* assigneNodes = m_slotElement->assignedNodes();
         if (m_slotKind == SlotKind::Assigned) {
             ASSERT(assigneNodes);
-            return assigneNodes->first();
+            return assigneNodes->first().get();
         }
         ASSERT(m_slotKind == SlotKind::Fallback);
         return m_slotElement->firstChild();
@@ -195,7 +195,7 @@
         auto* assigneNodes = m_slotElement->assignedNodes();
         if (m_slotKind == SlotKind::Assigned) {
             ASSERT(assigneNodes);
-            return assigneNodes->last();
+            return assigneNodes->last().get();
         }
         ASSERT(m_slotKind == SlotKind::Fallback);
         return m_slotElement->lastChild();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to