StyleRecalcChange Element::recalcOwnStyle(StyleRecalcChange change) { ASSERT(document().inStyleRecalc()); ASSERT(!parentNode()->needsStyleRecalc()); ASSERT(change >= Inherit || needsStyleRecalc()); ASSERT(parentRenderStyle()); RefPtr<RenderStyle> oldStyle = renderStyle(); RefPtr<RenderStyle> newStyle = styleForRenderer(); StyleRecalcChange localChange = RenderStyle::stylePropagationDiff(oldStyle.get(), newStyle.get()); ASSERT(newStyle); if (localChange == Reattach) { AttachContext reattachContext; reattachContext.resolvedStyle = newStyle.get(); reattach(reattachContext); return Reattach; } ASSERT(oldStyle); if (RenderObject* renderer = this->renderer()) { if (localChange != NoChange) renderer->setStyle(newStyle.get()); } if (styleChangeType() >= SubtreeStyleChange) return Force; if (change > Inherit || localChange > Inherit) return max(localChange, change); return localChange; }
// If a whitespace node had no renderer and goes through a recalcStyle it may // need to create one if the parent style now has white-space: pre. bool Text::needsWhitespaceRenderer() { ASSERT(!renderer()); if (RenderStyle* style = parentRenderStyle()) return style->preserveNewline(); return false; }
void Element::recalcStyle(StyleRecalcChange change) { ASSERT(document().inStyleRecalc()); ASSERT(!parentNode()->needsStyleRecalc()); if (change >= Inherit || needsStyleRecalc()) { if (hasRareData()) { ElementRareData* data = elementRareData(); data->clearComputedStyle(); } if (parentRenderStyle()) change = recalcOwnStyle(change); clearNeedsStyleRecalc(); } // If we reattached we don't need to recalc the style of our descendants anymore. if ((change >= Inherit && change < Reattach) || childNeedsStyleRecalc()) { recalcChildStyle(change); clearChildNeedsStyleRecalc(); } }