Index: third_party/WebKit/Source/core/dom/shadow/SlotAssignment.cpp |
diff --git a/third_party/WebKit/Source/core/dom/shadow/SlotAssignment.cpp b/third_party/WebKit/Source/core/dom/shadow/SlotAssignment.cpp |
index fca3fa5350e6904cfe7b4fb92341a08506f50ccc..048687d341cd367266c9bdf4c66df7a1904b1049 100644 |
--- a/third_party/WebKit/Source/core/dom/shadow/SlotAssignment.cpp |
+++ b/third_party/WebKit/Source/core/dom/shadow/SlotAssignment.cpp |
@@ -35,7 +35,8 @@ void SlotAssignment::resolveAssignment(ShadowRoot& shadowRoot) |
const HeapVector<Member<HTMLSlotElement>>& slots = shadowRoot.descendantSlots(); |
for (Member<HTMLSlotElement> slot : slots) { |
- slot->willUpdateDistribution(); |
+ slot->willUpdateAssignment(); |
+ slot->willUpdateFallback(); |
name2slot.add(slot->name(), slot.get()); |
} |
@@ -57,6 +58,33 @@ void SlotAssignment::resolveAssignment(ShadowRoot& shadowRoot) |
detachNotAssignedNode(child); |
} |
+ for (auto slot = slots.rbegin(); slot != slots.rend(); ++slot) |
+ (*slot)->updateFallbackNodes(); |
+ |
+ // For each slot, check if assigned nodes have changed |
+ // If so, call fireSlotchange function |
+ for (const auto& slot : slots) |
+ slot->didUpdateAssignment(); |
+} |
+ |
+void SlotAssignment::resolveDistribution(ShadowRoot& shadowRoot) |
+{ |
+ |
+ using Name2Slot = HeapHashMap<AtomicString, Member<HTMLSlotElement>>; |
+ Name2Slot name2slot; |
hayato
2016/04/18 07:16:31
resolveDistribution does not need `name2slot`.
yuzuchan
2016/04/18 09:43:27
Done.
|
+ |
+ const HeapVector<Member<HTMLSlotElement>>& slots = shadowRoot.descendantSlots(); |
+ |
+ for (Member<HTMLSlotElement> slot : slots) { |
+ slot->willUpdateDistribution(); |
+ name2slot.add(slot->name(), slot.get()); |
+ } |
+ |
+ for (auto slot : slots) { |
+ for (auto node : slot->assignedNodes()) |
+ distribute(*node, *slot); |
+ } |
+ |
// Update each slot's distribution in reverse tree order so that a child slot is visited before its parent slot. |
for (auto slot = slots.rbegin(); slot != slots.rend(); ++slot) |
(*slot)->updateDistributedNodesWithFallback(); |
@@ -69,10 +97,16 @@ void SlotAssignment::assign(Node& hostChild, HTMLSlotElement& slot) |
DCHECK(hostChild.isSlotAssignable()); |
m_assignment.add(&hostChild, &slot); |
slot.appendAssignedNode(hostChild); |
+} |
+ |
+void SlotAssignment::distribute(Node& hostChild, HTMLSlotElement& slot) |
+{ |
+ DCHECK(hostChild.isSlotAssignable()); |
if (isHTMLSlotElement(hostChild)) |
slot.appendDistributedNodesFrom(toHTMLSlotElement(hostChild)); |
else |
slot.appendDistributedNode(hostChild); |
+ |
if (slot.isChildOfV1ShadowHost()) |
slot.parentElementShadow()->setNeedsDistributionRecalc(); |
} |