bool StyleInvalidator::invalidate(Element& element, RecursionData& recursionData, SiblingData& siblingData) { siblingData.advance(); RecursionCheckpoint checkpoint(&recursionData); bool thisElementNeedsStyleRecalc = checkInvalidationSetsAgainstElement(element, recursionData, siblingData); bool someChildrenNeedStyleRecalc = false; if (recursionData.hasInvalidationSets() || element.childNeedsStyleInvalidation()) someChildrenNeedStyleRecalc = invalidateChildren(element, recursionData); if (thisElementNeedsStyleRecalc) { ASSERT(!recursionData.wholeSubtreeInvalid()); element.setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::StyleInvalidator)); } else if (recursionData.hasInvalidationSets() && someChildrenNeedStyleRecalc) { // Clone the ComputedStyle in order to preserve correct style sharing, if possible. Otherwise recalc style. if (LayoutObject* layoutObject = element.layoutObject()) { layoutObject->setStyleInternal(ComputedStyle::clone(layoutObject->styleRef())); } else { TRACE_STYLE_INVALIDATOR_INVALIDATION_IF_ENABLED(element, PreventStyleSharingForParent); element.setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::StyleInvalidator)); } } if (recursionData.insertionPointCrossing() && element.isInsertionPoint()) element.setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::StyleInvalidator)); element.clearChildNeedsStyleInvalidation(); element.clearNeedsStyleInvalidation(); return thisElementNeedsStyleRecalc; }