Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(70)

Side by Side Diff: third_party/WebKit/Source/core/dom/shadow/SlotAssignment.cpp

Issue 2086013003: Make sure to lazyReattach a distributed node if it is already attached (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « third_party/WebKit/LayoutTests/shadow-dom/layout-expected.html ('k') | third_party/WebKit/Source/core/html/HTMLSlotElement.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698