OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/css/invalidation/StyleInvalidator.h" | 5 #include "core/css/invalidation/StyleInvalidator.h" |
6 | 6 |
7 #include "core/css/invalidation/InvalidationSet.h" | 7 #include "core/css/invalidation/InvalidationSet.h" |
8 #include "core/dom/Document.h" | 8 #include "core/dom/Document.h" |
9 #include "core/dom/Element.h" | 9 #include "core/dom/Element.h" |
10 #include "core/dom/ElementTraversal.h" | 10 #include "core/dom/ElementTraversal.h" |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 const SiblingInvalidationSet& invalidationSet = *m_invalidationEntries[i
ndex].m_invalidationSet; | 170 const SiblingInvalidationSet& invalidationSet = *m_invalidationEntries[i
ndex].m_invalidationSet; |
171 ++index; | 171 ++index; |
172 if (!invalidationSet.invalidatesElement(element)) | 172 if (!invalidationSet.invalidatesElement(element)) |
173 continue; | 173 continue; |
174 | 174 |
175 if (invalidationSet.invalidatesSelf()) | 175 if (invalidationSet.invalidatesSelf()) |
176 thisElementNeedsStyleRecalc = true; | 176 thisElementNeedsStyleRecalc = true; |
177 | 177 |
178 if (const DescendantInvalidationSet* descendants = invalidationSet.sibli
ngDescendants()) { | 178 if (const DescendantInvalidationSet* descendants = invalidationSet.sibli
ngDescendants()) { |
179 if (descendants->wholeSubtreeInvalid()) { | 179 if (descendants->wholeSubtreeInvalid()) { |
180 // Avoid directly setting SubtreeStyleChange on element, or Cont
ainerNode::checkForChildrenAdjacentRuleChanges() | 180 element.setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReaso
nForTracing::create(StyleChangeReason::StyleInvalidator)); |
181 // may propagate the SubtreeStyleChange to our own siblings' sub
trees. | |
182 | |
183 for (Element* child = ElementTraversal::firstChild(element); chi
ld; child = ElementTraversal::nextSibling(*child)) { | |
184 child->setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeRe
asonForTracing::create(StyleChangeReason::SiblingSelector)); | |
185 } | |
186 return true; | 181 return true; |
187 } | 182 } |
188 | 183 |
189 if (!descendants->isEmpty()) | 184 if (!descendants->isEmpty()) |
190 recursionData.pushInvalidationSet(*descendants); | 185 recursionData.pushInvalidationSet(*descendants); |
191 } | 186 } |
192 | 187 |
193 } | 188 } |
194 return thisElementNeedsStyleRecalc; | 189 return thisElementNeedsStyleRecalc; |
195 } | 190 } |
196 | 191 |
197 void StyleInvalidator::pushInvalidationSetsForElement(Element& element, Recursio
nData& recursionData, SiblingData& siblingData) | 192 void StyleInvalidator::pushInvalidationSetsForElement(Element& element, Recursio
nData& recursionData, SiblingData& siblingData) |
198 { | 193 { |
199 PendingInvalidations* pendingInvalidations = m_pendingInvalidationMap.get(&e
lement); | 194 PendingInvalidations* pendingInvalidations = m_pendingInvalidationMap.get(&e
lement); |
200 ASSERT(pendingInvalidations); | 195 ASSERT(pendingInvalidations); |
201 | 196 |
202 for (const auto& invalidationSet : pendingInvalidations->siblings()) | 197 for (const auto& invalidationSet : pendingInvalidations->siblings()) |
203 siblingData.pushInvalidationSet(toSiblingInvalidationSet(*invalidationSe
t)); | 198 siblingData.pushInvalidationSet(toSiblingInvalidationSet(*invalidationSe
t)); |
204 | 199 |
| 200 if (element.styleChangeType() >= SubtreeStyleChange) |
| 201 return; |
| 202 |
205 if (!pendingInvalidations->descendants().isEmpty()) { | 203 if (!pendingInvalidations->descendants().isEmpty()) { |
206 for (const auto& invalidationSet : pendingInvalidations->descendants()) | 204 for (const auto& invalidationSet : pendingInvalidations->descendants()) |
207 recursionData.pushInvalidationSet(toDescendantInvalidationSet(*inval
idationSet)); | 205 recursionData.pushInvalidationSet(toDescendantInvalidationSet(*inval
idationSet)); |
208 if (UNLIKELY(*s_tracingEnabled)) { | 206 if (UNLIKELY(*s_tracingEnabled)) { |
209 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.in
validationTracking"), | 207 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.in
validationTracking"), |
210 "StyleInvalidatorInvalidationTracking", | 208 "StyleInvalidatorInvalidationTracking", |
211 TRACE_EVENT_SCOPE_THREAD, | 209 TRACE_EVENT_SCOPE_THREAD, |
212 "data", InspectorStyleInvalidatorInvalidateEvent::invalidationLi
st(element, pendingInvalidations->descendants())); | 210 "data", InspectorStyleInvalidatorInvalidateEvent::invalidationLi
st(element, pendingInvalidations->descendants())); |
213 } | 211 } |
214 } | 212 } |
215 } | 213 } |
216 | 214 |
217 ALWAYS_INLINE bool StyleInvalidator::checkInvalidationSetsAgainstElement(Element
& element, RecursionData& recursionData, SiblingData& siblingData) | 215 ALWAYS_INLINE bool StyleInvalidator::checkInvalidationSetsAgainstElement(Element
& element, RecursionData& recursionData, SiblingData& siblingData) |
218 { | 216 { |
219 if (element.styleChangeType() >= SubtreeStyleChange || recursionData.wholeSu
btreeInvalid()) { | 217 if (recursionData.wholeSubtreeInvalid()) |
| 218 return false; |
| 219 |
| 220 bool thisElementNeedsStyleRecalc = false; |
| 221 if (element.styleChangeType() >= SubtreeStyleChange) { |
220 recursionData.setWholeSubtreeInvalid(); | 222 recursionData.setWholeSubtreeInvalid(); |
221 return false; | 223 } else { |
| 224 thisElementNeedsStyleRecalc = recursionData.matchesCurrentInvalidationSe
ts(element); |
| 225 if (UNLIKELY(!siblingData.isEmpty())) |
| 226 thisElementNeedsStyleRecalc |= siblingData.matchCurrentInvalidationS
ets(element, recursionData); |
222 } | 227 } |
223 | 228 |
224 bool thisElementNeedsStyleRecalc = recursionData.matchesCurrentInvalidationS
ets(element); | |
225 if (UNLIKELY(!siblingData.isEmpty())) | |
226 thisElementNeedsStyleRecalc |= siblingData.matchCurrentInvalidationSets(
element, recursionData); | |
227 | |
228 if (UNLIKELY(element.needsStyleInvalidation())) | 229 if (UNLIKELY(element.needsStyleInvalidation())) |
229 pushInvalidationSetsForElement(element, recursionData, siblingData); | 230 pushInvalidationSetsForElement(element, recursionData, siblingData); |
| 231 |
230 return thisElementNeedsStyleRecalc; | 232 return thisElementNeedsStyleRecalc; |
231 } | 233 } |
232 | 234 |
233 bool StyleInvalidator::invalidateShadowRootChildren(Element& element, RecursionD
ata& recursionData) | 235 bool StyleInvalidator::invalidateShadowRootChildren(Element& element, RecursionD
ata& recursionData) |
234 { | 236 { |
235 bool someChildrenNeedStyleRecalc = false; | 237 bool someChildrenNeedStyleRecalc = false; |
236 for (ShadowRoot* root = element.youngestShadowRoot(); root; root = root->old
erShadowRoot()) { | 238 for (ShadowRoot* root = element.youngestShadowRoot(); root; root = root->old
erShadowRoot()) { |
237 if (!recursionData.treeBoundaryCrossing() && !root->childNeedsStyleInval
idation() && !root->needsStyleInvalidation()) | 239 if (!recursionData.treeBoundaryCrossing() && !root->childNeedsStyleInval
idation() && !root->needsStyleInvalidation()) |
238 continue; | 240 continue; |
239 SiblingData siblingData; | 241 SiblingData siblingData; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 } | 298 } |
297 | 299 |
298 DEFINE_TRACE(StyleInvalidator) | 300 DEFINE_TRACE(StyleInvalidator) |
299 { | 301 { |
300 #if ENABLE(OILPAN) | 302 #if ENABLE(OILPAN) |
301 visitor->trace(m_pendingInvalidationMap); | 303 visitor->trace(m_pendingInvalidationMap); |
302 #endif | 304 #endif |
303 } | 305 } |
304 | 306 |
305 } // namespace blink | 307 } // namespace blink |
OLD | NEW |