void NodeRenderingContext::createRendererForTextIfNeeded() { ASSERT(!m_node->renderer()); Text* textNode = toText(m_node); if (!shouldCreateRenderer()) return; RenderObject* parentRenderer = this->parentRenderer(); if (m_parentDetails.resetStyleInheritance()) m_style = textNode->document()->styleResolver()->defaultStyleForElement(); else m_style = parentRenderer->style(); if (!textNode->textRendererIsNeeded(*this)) return; RenderText* newRenderer = textNode->createTextRenderer(m_style.get()); if (!parentRenderer->isChildAllowed(newRenderer, m_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 = this->nextRenderer(); textNode->setRenderer(newRenderer); // Parent takes care of the animations, no need to call setAnimatableStyle. newRenderer->setStyle(m_style.release()); parentRenderer->addChild(newRenderer, nextRenderer); }
void RenderTreeBuilder::createRendererForTextIfNeeded() { ASSERT(!m_node->renderer()); // If we're out of composition then we can't render since there's no parent to inherit from. if (!m_renderingParent) return; if (!shouldCreateRenderer()) return; Text* textNode = toText(m_node); RenderObject* parentRenderer = this->parentRenderer(); m_style = parentRenderer->style(); if (!textNode->textRendererIsNeeded(*m_style, *parentRenderer)) return; RenderText* newRenderer = textNode->createTextRenderer(m_style.get()); if (!parentRenderer->isChildAllowed(newRenderer, m_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 = this->nextRenderer(); textNode->setRenderer(newRenderer); // Parent takes care of the animations, no need to call setAnimatableStyle. newRenderer->setStyle(m_style.release()); parentRenderer->addChild(newRenderer, nextRenderer); }
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); }