OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/dom/shadow/SlotAssignment.h" | 5 #include "core/dom/shadow/SlotAssignment.h" |
6 | 6 |
7 #include "core/HTMLNames.h" | 7 #include "core/HTMLNames.h" |
8 #include "core/dom/ElementTraversal.h" | 8 #include "core/dom/ElementTraversal.h" |
9 #include "core/dom/NodeTraversal.h" | 9 #include "core/dom/NodeTraversal.h" |
10 #include "core/dom/shadow/ElementShadow.h" | 10 #include "core/dom/shadow/ElementShadow.h" |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 | 109 |
110 static void detachNotAssignedNode(Node& node) | 110 static void detachNotAssignedNode(Node& node) |
111 { | 111 { |
112 if (node.layoutObject()) | 112 if (node.layoutObject()) |
113 node.lazyReattachIfAttached(); | 113 node.lazyReattachIfAttached(); |
114 } | 114 } |
115 | 115 |
116 void SlotAssignment::resolveAssignment() | 116 void SlotAssignment::resolveAssignment() |
117 { | 117 { |
118 for (Member<HTMLSlotElement> slot : slots()) | 118 for (Member<HTMLSlotElement> slot : slots()) |
119 slot->clearDistribution(); | 119 slot->saveAndClearDistribution(); |
120 | 120 |
121 for (Node& child : NodeTraversal::childrenOf(m_owner->host())) { | 121 for (Node& child : NodeTraversal::childrenOf(m_owner->host())) { |
122 if (!child.isSlotable()) { | 122 if (!child.isSlotable()) { |
123 detachNotAssignedNode(child); | 123 detachNotAssignedNode(child); |
124 continue; | 124 continue; |
125 } | 125 } |
126 HTMLSlotElement* slot = findSlotByName(child.slotName()); | 126 HTMLSlotElement* slot = findSlotByName(child.slotName()); |
127 if (slot) | 127 if (slot) |
128 slot->appendAssignedNode(child); | 128 slot->appendAssignedNode(child); |
129 else | 129 else |
130 detachNotAssignedNode(child); | 130 detachNotAssignedNode(child); |
131 } | 131 } |
132 } | 132 } |
133 | 133 |
134 void SlotAssignment::resolveDistribution() | 134 void SlotAssignment::resolveDistribution() |
135 { | 135 { |
136 resolveAssignment(); | 136 resolveAssignment(); |
137 const HeapVector<Member<HTMLSlotElement>>& slots = this->slots(); | 137 const HeapVector<Member<HTMLSlotElement>>& slots = this->slots(); |
138 | 138 |
139 for (auto slot : slots) | 139 for (auto slot : slots) |
140 slot->resolveDistributedNodes(); | 140 slot->resolveDistributedNodes(); |
141 | 141 |
142 // Update each slot's distribution in reverse tree order so that a child slo
t is visited before its parent slot. | 142 // Update each slot's distribution in reverse tree order so that a child slo
t is visited before its parent slot. |
143 for (auto slot = slots.rbegin(); slot != slots.rend(); ++slot) | 143 for (auto slot = slots.rbegin(); slot != slots.rend(); ++slot) { |
144 (*slot)->updateDistributedNodesWithFallback(); | 144 (*slot)->updateDistributedNodesWithFallback(); |
| 145 (*slot)->lazyReattachDistributedNodesIfNeeded(); |
| 146 } |
145 } | 147 } |
146 | 148 |
147 const HeapVector<Member<HTMLSlotElement>>& SlotAssignment::slots() | 149 const HeapVector<Member<HTMLSlotElement>>& SlotAssignment::slots() |
148 { | 150 { |
149 if (m_needsCollectSlots) | 151 if (m_needsCollectSlots) |
150 collectSlots(); | 152 collectSlots(); |
151 return m_slots; | 153 return m_slots; |
152 } | 154 } |
153 | 155 |
154 HTMLSlotElement* SlotAssignment::findSlot(const Node& node) | 156 HTMLSlotElement* SlotAssignment::findSlot(const Node& node) |
(...skipping 20 matching lines...) Expand all Loading... |
175 } | 177 } |
176 | 178 |
177 DEFINE_TRACE(SlotAssignment) | 179 DEFINE_TRACE(SlotAssignment) |
178 { | 180 { |
179 visitor->trace(m_slots); | 181 visitor->trace(m_slots); |
180 visitor->trace(m_slotMap); | 182 visitor->trace(m_slotMap); |
181 visitor->trace(m_owner); | 183 visitor->trace(m_owner); |
182 } | 184 } |
183 | 185 |
184 } // namespace blink | 186 } // namespace blink |
OLD | NEW |