bool StyleInvalidator::invalidate(Element& element) { RecursionCheckpoint checkpoint(&m_recursionData); bool thisElementNeedsStyleRecalc = checkInvalidationSetsAgainstElement(element); bool someChildrenNeedStyleRecalc = false; // foundInvalidationSet() will be true if we are in a subtree of a node with a DescendantInvalidationSet on it. // We need to check all nodes in the subtree of such a node. if (m_recursionData.foundInvalidationSet() || element.childNeedsStyleInvalidation()) someChildrenNeedStyleRecalc = invalidateChildren(element); if (thisElementNeedsStyleRecalc) { element.setNeedsStyleRecalc(LocalStyleChange); } else if (m_recursionData.foundInvalidationSet() && someChildrenNeedStyleRecalc) { // Clone the RenderStyle in order to preserve correct style sharing, if possible. Otherwise recalc style. if (RenderObject* renderer = element.renderer()) { ASSERT(renderer->style()); renderer->setStyleInternal(RenderStyle::clone(renderer->style())); } else { element.setNeedsStyleRecalc(LocalStyleChange); } } element.clearChildNeedsStyleInvalidation(); element.clearNeedsStyleInvalidation(); return thisElementNeedsStyleRecalc; }
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; }
bool StyleInvalidator::invalidate(Element& element) { RecursionCheckpoint checkpoint(&m_recursionData); bool thisElementNeedsStyleRecalc = checkInvalidationSetsAgainstElement(element); bool someChildrenNeedStyleRecalc = false; if (m_recursionData.hasInvalidationSets() || element.childNeedsStyleInvalidation()) someChildrenNeedStyleRecalc = invalidateChildren(element); if (thisElementNeedsStyleRecalc) { element.setNeedsStyleRecalc(m_recursionData.wholeSubtreeInvalid() ? SubtreeStyleChange : LocalStyleChange); } else if (m_recursionData.hasInvalidationSets() && someChildrenNeedStyleRecalc) { // Clone the RenderStyle in order to preserve correct style sharing, if possible. Otherwise recalc style. if (RenderObject* renderer = element.renderer()) renderer->setStyleInternal(RenderStyle::clone(renderer->style())); else element.setNeedsStyleRecalc(LocalStyleChange); } element.clearChildNeedsStyleInvalidation(); element.clearNeedsStyleInvalidation(); return thisElementNeedsStyleRecalc; }