Changeset 266212 in webkit


Ignore:
Timestamp:
Aug 26, 2020 6:26:24 PM (4 years ago)
Author:
rniwa@webkit.org
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):

Location:
trunk/Source/WebCore
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r266207 r266212  
     12020-08-25  Ryosuke Niwa  <rniwa@webkit.org>
     2
     3        Make it possible to create a WeakPtr to Node and use it store assigned nodes in SlotAssignment
     4        https://bugs.webkit.org/show_bug.cgi?id=215673
     5        <rdar://problem/67440818>
     6
     7        Reviewed by Darin Adler.
     8
     9        This patch makes Node inherit from CanMakeWeakPtr<Node> and uses it in SlotAssignment's assignedNodes
     10        and related member variables and functions.
     11
     12        No new tests since there should be no behavioral difference.
     13
     14        * dom/ComposedTreeIterator.cpp:
     15        (WebCore::ComposedTreeIterator::traverseNextInShadowTree):
     16        (WebCore::ComposedTreeIterator::advanceInSlot):
     17        * dom/ComposedTreeIterator.h:
     18        (WebCore::firstChildInComposedTreeIgnoringUserAgentShadow):
     19        (WebCore::nextSiblingInComposedTreeIgnoringUserAgentShadow):
     20        * dom/ContainerNode.h:
     21        * dom/Node.h:
     22        * dom/ShadowRoot.cpp:
     23        (WebCore::ShadowRoot::assignedNodesForSlot):
     24        * dom/ShadowRoot.h:
     25        * dom/SlotAssignment.cpp:
     26        (WebCore::SlotAssignment::assignedNodesForSlot):
     27        (WebCore::SlotAssignment::assignToSlot):
     28        * dom/SlotAssignment.h:
     29        * html/HTMLSlotElement.cpp:
     30        (WebCore::HTMLSlotElement::assignedNodes const):
     31        (WebCore::flattenAssignedNodes):
     32        (WebCore:: const): Deleted.
     33        * html/HTMLSlotElement.h:
     34        * page/FocusController.cpp:
     35        (WebCore::FocusNavigationScope::firstNodeInScope const):
     36        (WebCore::FocusNavigationScope::lastNodeInScope const):
     37
    1382020-08-26  Andres Gonzalez  <andresg_22@apple.com>
    239
  • trunk/Source/WebCore/dom/ComposedTreeIterator.cpp

    r260997 r266212  
    164164        if (auto* assignedNodes = slot.assignedNodes()) {
    165165            context().slotNodeIndex = 0;
    166             auto* assignedNode = assignedNodes->at(0);
     166            auto* assignedNode = assignedNodes->at(0).get();
    167167            m_contextStack.append(Context(*assignedNode->parentElement(), *assignedNode, Context::Slotted));
    168168            return;
     
    198198        return false;
    199199
    200     auto* slotNode = assignedNodes.at(context().slotNodeIndex);
     200    auto* slotNode = assignedNodes.at(context().slotNodeIndex).get();
     201    if (!slotNode)
     202        return false;
    201203    m_contextStack.append(Context(*slotNode->parentElement(), *slotNode, Context::Slotted));
    202204    return true;
  • trunk/Source/WebCore/dom/ComposedTreeIterator.h

    r238693 r266212  
    227227    if (is<HTMLSlotElement>(node)) {
    228228        if (auto* assignedNodes = downcast<HTMLSlotElement>(node).assignedNodes())
    229             return assignedNodes->at(0);
     229            return assignedNodes->at(0).get();
    230230    }
    231231    return node.firstChild();
     
    240240        ASSERT(nodeIndex != notFound);
    241241        if (assignedNodes->size() > nodeIndex + 1)
    242             return assignedNodes->at(nodeIndex + 1);
     242            return assignedNodes->at(nodeIndex + 1).get();
    243243        return nullptr;
    244244    }
  • trunk/Source/WebCore/dom/ContainerNode.h

    r265844 r266212  
    2626#include "CollectionType.h"
    2727#include "Node.h"
    28 #include <wtf/WeakPtr.h>
    2928
    3029namespace WebCore {
     
    3736typedef Vector<Ref<Node>, initialNodeVectorSize> NodeVector;
    3837
    39 class ContainerNode : public CanMakeWeakPtr<ContainerNode>, public Node {
     38class ContainerNode : public Node {
    4039    WTF_MAKE_ISO_ALLOCATED(ContainerNode);
    4140public:
  • trunk/Source/WebCore/dom/Node.h

    r266026 r266212  
    3838#include <wtf/MainThread.h>
    3939#include <wtf/URLHash.h>
     40#include <wtf/WeakPtr.h>
    4041
    4142// This needs to be here because Document.h also depends on it.
     
    7071using NodeOrString = Variant<RefPtr<Node>, String>;
    7172
    72 class Node : public EventTarget {
     73class Node : public CanMakeWeakPtr<Node>, public EventTarget {
    7374    WTF_MAKE_ISO_ALLOCATED(Node);
    7475
  • trunk/Source/WebCore/dom/ShadowRoot.cpp

    r260195 r266212  
    254254}
    255255
    256 const Vector<Node*>* ShadowRoot::assignedNodesForSlot(const HTMLSlotElement& slot)
     256const Vector<WeakPtr<Node>>* ShadowRoot::assignedNodesForSlot(const HTMLSlotElement& slot)
    257257{
    258258    if (!m_slotAssignment)
  • trunk/Source/WebCore/dom/ShadowRoot.h

    r259577 r266212  
    100100    void hostChildElementDidChangeSlotAttribute(Element&, const AtomString& oldValue, const AtomString& newValue);
    101101
    102     const Vector<Node*>* assignedNodesForSlot(const HTMLSlotElement&);
     102    const Vector<WeakPtr<Node>>* assignedNodesForSlot(const HTMLSlotElement&);
    103103
    104104    void moveShadowRootToNewParentScope(TreeScope&, Document&);
  • trunk/Source/WebCore/dom/SlotAssignment.cpp

    r254087 r266212  
    312312}
    313313
    314 const Vector<Node*>* SlotAssignment::assignedNodesForSlot(const HTMLSlotElement& slotElement, ShadowRoot& shadowRoot)
     314const Vector<WeakPtr<Node>>* SlotAssignment::assignedNodesForSlot(const HTMLSlotElement& slotElement, ShadowRoot& shadowRoot)
    315315{
    316316    ASSERT(slotElement.containingShadowRoot() == &shadowRoot);
     
    401401        auto defaultSlotEntry = m_slots.find(defaultSlotName());
    402402        if (defaultSlotEntry != m_slots.end())
    403             defaultSlotEntry->value->assignedNodes.append(&child);
     403            defaultSlotEntry->value->assignedNodes.append(makeWeakPtr(child));
    404404        return;
    405405    }
     
    408408        return makeUnique<Slot>();
    409409    });
    410     addResult.iterator->value->assignedNodes.append(&child);
    411 }
    412 
    413 }
    414 
    415 
     410    addResult.iterator->value->assignedNodes.append(makeWeakPtr(child));
     411}
     412
     413}
     414
     415
  • trunk/Source/WebCore/dom/SlotAssignment.h

    r254087 r266212  
    6161    void enqueueSlotChangeEvent(const AtomString&, ShadowRoot&);
    6262
    63     const Vector<Node*>* assignedNodesForSlot(const HTMLSlotElement&, ShadowRoot&);
     63    const Vector<WeakPtr<Node>>* assignedNodesForSlot(const HTMLSlotElement&, ShadowRoot&);
    6464
    6565    virtual void hostChildElementDidChange(const Element&, ShadowRoot&);
     
    7979        unsigned elementCount { 0 };
    8080        bool seenFirstElement { false };
    81         Vector<Node*> assignedNodes;
     81        Vector<WeakPtr<Node>> assignedNodes;
    8282    };
    8383
  • trunk/Source/WebCore/html/HTMLSlotElement.cpp

    r261433 r266212  
    9696}
    9797
    98 const Vector<Node*>* HTMLSlotElement::assignedNodes() const
     98const Vector<WeakPtr<Node>>* HTMLSlotElement::assignedNodes() const
    9999{
    100100    auto shadowRoot = makeRefPtr(containingShadowRoot());
     
    120120        return;
    121121    }
    122     for (const RefPtr<Node>& node : *assignedNodes) {
     122    for (auto& nodeWeakPtr : *assignedNodes) {
     123        auto* node = nodeWeakPtr.get();
     124        if (UNLIKELY(!node)) {
     125            ASSERT_NOT_REACHED();
     126            continue;
     127        }
    123128        if (is<HTMLSlotElement>(*node) && downcast<HTMLSlotElement>(*node).containingShadowRoot())
    124129            flattenAssignedNodes(nodes, downcast<HTMLSlotElement>(*node));
     
    140145    if (!assignedNodes)
    141146        return { };
    142     return assignedNodes->map([] (Node* node) { return makeRef(*node); });
     147
     148    Vector<Ref<Node>> nodes;
     149    nodes.reserveInitialCapacity(assignedNodes->size());
     150    for (auto& nodePtr : *assignedNodes) {
     151        auto* node = nodePtr.get();
     152        if (UNLIKELY(!node))
     153            continue;
     154        nodes.uncheckedAppend(*node);
     155    }
     156
     157    return nodes;
    143158}
    144159
  • trunk/Source/WebCore/html/HTMLSlotElement.h

    r246490 r266212  
    3636    static Ref<HTMLSlotElement> create(const QualifiedName&, Document&);
    3737
    38     const Vector<Node*>* assignedNodes() const;
     38    const Vector<WeakPtr<Node>>* assignedNodes() const;
    3939    struct AssignedNodesOptions {
    4040        bool flatten;
  • trunk/Source/WebCore/page/FocusController.cpp

    r265228 r266212  
    181181        if (m_slotKind == SlotKind::Assigned) {
    182182            ASSERT(assigneNodes);
    183             return assigneNodes->first();
     183            return assigneNodes->first().get();
    184184        }
    185185        ASSERT(m_slotKind == SlotKind::Fallback);
     
    196196        if (m_slotKind == SlotKind::Assigned) {
    197197            ASSERT(assigneNodes);
    198             return assigneNodes->last();
     198            return assigneNodes->last().get();
    199199        }
    200200        ASSERT(m_slotKind == SlotKind::Fallback);
Note: See TracChangeset for help on using the changeset viewer.