void RenderTreeUpdater::updateTextRenderer(Text& text) { bool hasRenderer = text.renderer(); bool needsRenderer = textRendererIsNeeded(text, renderTreePosition()); if (hasRenderer) { if (needsRenderer) return; tearDownRenderer(text); invalidateWhitespaceOnlyTextSiblingsAfterAttachIfNeeded(text); return; } if (!needsRenderer) return; createTextRenderer(text, renderTreePosition()); invalidateWhitespaceOnlyTextSiblingsAfterAttachIfNeeded(text); }
void RenderTreeUpdater::updateElementRenderer(Element& element, const Style::ElementUpdate& update) { #if PLATFORM(IOS) CheckForVisibilityChange checkForVisibilityChange(element); #endif bool shouldTearDownRenderers = update.change == Style::Detach && (element.renderer() || element.isNamedFlowContentElement()); if (shouldTearDownRenderers) tearDownRenderers(element, TeardownType::KeepHoverAndActive); bool hasDisplayContents = update.style->display() == CONTENTS; if (hasDisplayContents != element.hasDisplayContents()) { element.setHasDisplayContents(hasDisplayContents); // Render tree position needs to be recomputed as rendering siblings may be found from the display:contents subtree. renderTreePosition().invalidateNextSibling(); } bool shouldCreateNewRenderer = !element.renderer() && !hasDisplayContents; if (shouldCreateNewRenderer) { if (element.hasCustomStyleResolveCallbacks()) element.willAttachRenderers(); createRenderer(element, RenderStyle::clone(*update.style)); invalidateWhitespaceOnlyTextSiblingsAfterAttachIfNeeded(element); return; } if (!element.renderer()) return; auto& renderer = *element.renderer(); if (update.recompositeLayer) { renderer.setStyle(RenderStyle::clone(*update.style), StyleDifferenceRecompositeLayer); return; } if (update.change == Style::NoChange) { if (pseudoStyleCacheIsInvalid(&renderer, update.style.get())) { renderer.setStyle(RenderStyle::clone(*update.style), StyleDifferenceEqual); return; } return; } renderer.setStyle(RenderStyle::clone(*update.style), StyleDifferenceEqual); }
void RenderTreeUpdater::updateElementRenderer(Element& element, Style::ElementUpdate& update) { bool shouldTearDownRenderers = update.change == Style::Detach && (element.renderer() || element.isNamedFlowContentNode()); if (shouldTearDownRenderers) tearDownRenderers(element, TeardownType::KeepHoverAndActive); bool hasDisplayContest = update.style && update.style->display() == CONTENTS; if (hasDisplayContest != element.hasDisplayContents()) { element.setHasDisplayContents(hasDisplayContest); // Render tree position needs to be recomputed as rendering siblings may be found from the display:contents subtree. renderTreePosition().invalidateNextSibling(); } bool shouldCreateNewRenderer = !element.renderer() && update.style && !hasDisplayContest; if (shouldCreateNewRenderer) { if (element.hasCustomStyleResolveCallbacks()) element.willAttachRenderers(); createRenderer(element, WTFMove(*update.style)); invalidateWhitespaceOnlyTextSiblingsAfterAttachIfNeeded(element); return; } if (!element.renderer()) return; auto& renderer = *element.renderer(); if (update.isSynthetic) { renderer.setStyle(WTFMove(*update.style), StyleDifferenceRecompositeLayer); return; } if (update.change == Style::NoChange) { if (pseudoStyleCacheIsInvalid(&renderer, update.style.get()) || (parent().styleChange == Style::Force && renderer.requiresForcedStyleRecalcPropagation())) { renderer.setStyle(WTFMove(*update.style), StyleDifferenceEqual); return; } return; } renderer.setStyle(WTFMove(*update.style), StyleDifferenceEqual); }