void Text::reattachIfNeeded(const AttachContext& context) { bool rendererIsNeeded = false; ContainerNode* renderingParent = NodeRenderingTraversal::parent(*this); if (renderingParent) { if (RenderObject* parentRenderer = renderingParent->renderer()) { if (textRendererIsNeeded(*parentRenderer->style(), *parentRenderer)) rendererIsNeeded = true; } } if (rendererIsNeeded == !!renderer()) return; // The following is almost the same as Node::reattach() except that we create renderer only if needed. // Not calling reattach() to avoid repeated calls to Text::textRendererIsNeeded(). AttachContext reattachContext(context); reattachContext.performingReattach = true; if (styleChangeType() < NeedsReattachStyleChange) detach(reattachContext); if (rendererIsNeeded) RenderTreeBuilderForText(*this, renderingParent->renderer()).createRenderer(); CharacterData::attach(reattachContext); }
void Text::attach(const AttachContext& context) { if (ContainerNode* renderingParent = NodeRenderingTraversal::parent(*this)) { if (RenderObject* parentRenderer = renderingParent->renderer()) { if (textRendererIsNeeded(*parentRenderer->style(), *parentRenderer)) RenderTreeBuilderForText(*this, parentRenderer).createRenderer(); } } CharacterData::attach(context); }
void Text::updateTextRenderer(unsigned offsetOfReplacedData, unsigned lengthOfReplacedData) { if (!attached()) return; RenderText* textRenderer = toRenderText(renderer()); if (!textRenderer || !textRendererIsNeeded(NodeRenderingContext(this, textRenderer->style()))) { reattach(); return; } textRenderer->setTextWithOffset(dataImpl(), offsetOfReplacedData, lengthOfReplacedData); }
void Text::updateTextRenderer(unsigned offsetOfReplacedData, unsigned lengthOfReplacedData, RecalcStyleBehavior recalcStyleBehavior) { if (!inActiveDocument()) return; RenderText* textRenderer = renderer(); if (!textRenderer || !textRendererIsNeeded(*textRenderer->style(), *textRenderer->parent())) { lazyReattachIfAttached(); // FIXME: Editing should be updated so this is not neccesary. if (recalcStyleBehavior == DeprecatedRecalcStyleImmediatlelyForEditing) document().updateRenderTreeIfNeeded(); return; } textRenderer->setTextWithOffset(dataImpl(), offsetOfReplacedData, lengthOfReplacedData); }
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 updateTextRendererAfterContentChange(Text& textNode, unsigned offsetOfReplacedData, unsigned lengthOfReplacedData) { if (!textNode.attached()) return; RenderText* textRenderer = toRenderText(textNode.renderer()); if (!textRenderer) { attachTextRenderer(textNode); return; } RenderObject* parentRenderer = NodeRenderingTraversal::parent(&textNode)->renderer(); if (!textRendererIsNeeded(textNode, *parentRenderer, *textRenderer->style())) { detachTextRenderer(textNode); attachTextRenderer(textNode); return; } textRenderer->setTextWithOffset(textNode.dataImpl(), offsetOfReplacedData, lengthOfReplacedData); }
static void createTextRendererIfNeeded(Text& textNode) { ASSERT(!textNode.renderer()); ContainerNode* renderingParentNode = NodeRenderingTraversal::parent(&textNode); if (!renderingParentNode) return; RenderObject* parentRenderer = renderingParentNode->renderer(); if (!parentRenderer || !parentRenderer->canHaveChildren()) return; if (!renderingParentNode->childShouldCreateRenderer(&textNode)) return; Document& document = textNode.document(); RefPtr<RenderStyle> style; bool resetStyleInheritance = textNode.parentNode()->isShadowRoot() && toShadowRoot(textNode.parentNode())->resetStyleInheritance(); if (resetStyleInheritance) style = document.ensureStyleResolver().defaultStyleForElement(); else style = parentRenderer->style(); if (!textRendererIsNeeded(textNode, *parentRenderer, *style)) return; RenderText* newRenderer = textNode.createTextRenderer(document.renderArena(), style.get()); if (!newRenderer) return; if (!parentRenderer->isChildAllowed(newRenderer, style.get())) { newRenderer->destroy(); return; } // Make sure the RenderObject already knows it is going to be added to a RenderFlowThread before we set the style // for the first time. Otherwise code using inRenderFlowThread() in the styleWillChange and styleDidChange will fail. newRenderer->setFlowThreadState(parentRenderer->flowThreadState()); RenderObject* nextRenderer = nextSiblingRenderer(textNode); textNode.setRenderer(newRenderer); // Parent takes care of the animations, no need to call setAnimatableStyle. newRenderer->setStyle(style.release()); parentRenderer->addChild(newRenderer, nextRenderer); Node* sibling = textNode.nextSibling(); if (sibling && !sibling->renderer() && sibling->attached()) createTextRenderersForSiblingsAfterAttachIfNeeded(sibling); }