| Index: Source/core/css/invalidation/StyleInvalidator.cpp
|
| diff --git a/Source/core/css/invalidation/StyleInvalidator.cpp b/Source/core/css/invalidation/StyleInvalidator.cpp
|
| index cefc3d7b17650398f523f56d1e6adc0d4ec46b8d..dbb122de381934acaf8a0808fa9e52e454692fc2 100644
|
| --- a/Source/core/css/invalidation/StyleInvalidator.cpp
|
| +++ b/Source/core/css/invalidation/StyleInvalidator.cpp
|
| @@ -13,6 +13,7 @@
|
| #include "core/dom/ElementTraversal.h"
|
| #include "core/dom/shadow/ElementShadow.h"
|
| #include "core/dom/shadow/ShadowRoot.h"
|
| +#include "core/inspector/InspectorTraceEvents.h"
|
| #include "core/rendering/RenderObject.h"
|
|
|
| namespace blink {
|
| @@ -20,8 +21,15 @@ namespace blink {
|
| void StyleInvalidator::invalidate(Document& document)
|
| {
|
| RecursionData recursionData;
|
| - if (Element* documentElement = document.documentElement())
|
| - invalidate(*documentElement, recursionData);
|
| + if (Element* documentElement = document.documentElement()) {
|
| + bool isTracingEnabled;
|
| + TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.invalidationTracking"), &isTracingEnabled);
|
| +
|
| + if (isTracingEnabled)
|
| + invalidate<StyleInvalidationTracingEnabled>(*documentElement, recursionData);
|
| + else
|
| + invalidate<StyleInvalidationTracingDisabled>(*documentElement, recursionData);
|
| + }
|
| document.clearChildNeedsStyleInvalidation();
|
| document.clearNeedsStyleInvalidation();
|
| clearPendingInvalidations();
|
| @@ -82,21 +90,27 @@ void StyleInvalidator::RecursionData::pushInvalidationSet(const DescendantInvali
|
| m_invalidateCustomPseudo = invalidationSet.customPseudoInvalid();
|
| }
|
|
|
| +template <StyleInvalidationTracingEnabledFlag styleInvalidationTracingEnabled>
|
| bool StyleInvalidator::RecursionData::matchesCurrentInvalidationSets(Element& element)
|
| {
|
| ASSERT(!m_wholeSubtreeInvalid);
|
|
|
| - if (m_invalidateCustomPseudo && element.shadowPseudoId() != nullAtom)
|
| + if (m_invalidateCustomPseudo && element.shadowPseudoId() != nullAtom) {
|
| + if (styleInvalidationTracingEnabled == StyleInvalidationTracingEnabled)
|
| + TRACE_STYLE_INVALIDATOR_INVALIDATION(element, InvalidateCustomPseudo);
|
| +
|
| return true;
|
| + }
|
|
|
| for (InvalidationSets::iterator it = m_invalidationSets.begin(); it != m_invalidationSets.end(); ++it) {
|
| - if ((*it)->invalidatesElement(element))
|
| + if ((*it)->invalidatesElement<styleInvalidationTracingEnabled>(element))
|
| return true;
|
| }
|
|
|
| return false;
|
| }
|
|
|
| +template <StyleInvalidationTracingEnabledFlag styleInvalidationTracingEnabled>
|
| bool StyleInvalidator::checkInvalidationSetsAgainstElement(Element& element, StyleInvalidator::RecursionData& recursionData)
|
| {
|
| if (element.styleChangeType() >= SubtreeStyleChange || recursionData.wholeSubtreeInvalid()) {
|
| @@ -108,12 +122,19 @@ bool StyleInvalidator::checkInvalidationSetsAgainstElement(Element& element, Sty
|
| for (InvalidationList::const_iterator it = invalidationList->begin(); it != invalidationList->end(); ++it)
|
| recursionData.pushInvalidationSet(**it);
|
| // FIXME: It's really only necessary to clone the render style for this element, not full style recalc.
|
| + if (styleInvalidationTracingEnabled == StyleInvalidationTracingEnabled) {
|
| + TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.invalidationTracking"),
|
| + "StyleInvalidatorInvalidationTracking",
|
| + "data", InspectorStyleInvalidatorInvalidateEvent::invalidationList(element, *invalidationList));
|
| + }
|
| return true;
|
| }
|
| }
|
| - return recursionData.matchesCurrentInvalidationSets(element);
|
| +
|
| + return recursionData.matchesCurrentInvalidationSets<styleInvalidationTracingEnabled>(element);
|
| }
|
|
|
| +template <StyleInvalidationTracingEnabledFlag styleInvalidationTracingEnabled>
|
| bool StyleInvalidator::invalidateChildren(Element& element, StyleInvalidator::RecursionData& recursionData)
|
| {
|
| bool someChildrenNeedStyleRecalc = false;
|
| @@ -121,37 +142,41 @@ bool StyleInvalidator::invalidateChildren(Element& element, StyleInvalidator::Re
|
| if (!recursionData.treeBoundaryCrossing() && !root->childNeedsStyleInvalidation() && !root->needsStyleInvalidation())
|
| continue;
|
| for (Element* child = ElementTraversal::firstChild(*root); child; child = ElementTraversal::nextSibling(*child)) {
|
| - bool childRecalced = invalidate(*child, recursionData);
|
| + bool childRecalced = invalidate<styleInvalidationTracingEnabled>(*child, recursionData);
|
| someChildrenNeedStyleRecalc = someChildrenNeedStyleRecalc || childRecalced;
|
| }
|
| root->clearChildNeedsStyleInvalidation();
|
| root->clearNeedsStyleInvalidation();
|
| }
|
| for (Element* child = ElementTraversal::firstChild(element); child; child = ElementTraversal::nextSibling(*child)) {
|
| - bool childRecalced = invalidate(*child, recursionData);
|
| + bool childRecalced = invalidate<styleInvalidationTracingEnabled>(*child, recursionData);
|
| someChildrenNeedStyleRecalc = someChildrenNeedStyleRecalc || childRecalced;
|
| }
|
| return someChildrenNeedStyleRecalc;
|
| }
|
|
|
| +template <StyleInvalidationTracingEnabledFlag styleInvalidationTracingEnabled>
|
| bool StyleInvalidator::invalidate(Element& element, StyleInvalidator::RecursionData& recursionData)
|
| {
|
| RecursionCheckpoint checkpoint(&recursionData);
|
|
|
| - bool thisElementNeedsStyleRecalc = checkInvalidationSetsAgainstElement(element, recursionData);
|
| + bool thisElementNeedsStyleRecalc = checkInvalidationSetsAgainstElement<styleInvalidationTracingEnabled>(element, recursionData);
|
|
|
| bool someChildrenNeedStyleRecalc = false;
|
| if (recursionData.hasInvalidationSets() || element.childNeedsStyleInvalidation())
|
| - someChildrenNeedStyleRecalc = invalidateChildren(element, recursionData);
|
| + someChildrenNeedStyleRecalc = invalidateChildren<styleInvalidationTracingEnabled>(element, recursionData);
|
|
|
| if (thisElementNeedsStyleRecalc) {
|
| element.setNeedsStyleRecalc(recursionData.wholeSubtreeInvalid() ? SubtreeStyleChange : LocalStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::StyleInvalidator));
|
| } else if (recursionData.hasInvalidationSets() && someChildrenNeedStyleRecalc) {
|
| // Clone the RenderStyle in order to preserve correct style sharing, if possible. Otherwise recalc style.
|
| - if (RenderObject* renderer = element.renderer())
|
| + if (RenderObject* renderer = element.renderer()) {
|
| renderer->setStyleInternal(RenderStyle::clone(renderer->style()));
|
| - else
|
| + } else {
|
| + if (styleInvalidationTracingEnabled == StyleInvalidationTracingEnabled)
|
| + TRACE_STYLE_INVALIDATOR_INVALIDATION(element, PreventStyleSharingForParent);
|
| element.setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::StyleInvalidator));
|
| + }
|
| }
|
|
|
| element.clearChildNeedsStyleInvalidation();
|
|
|