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();