| Index: Source/core/dom/RenderTreeBuilder.cpp
|
| diff --git a/Source/core/dom/RenderTreeBuilder.cpp b/Source/core/dom/RenderTreeBuilder.cpp
|
| index 7572603e73763b11ab81fd4bb3a7ae75ca1aa8b9..af6f95232c28e83e31fc9768bdeb2286fa016099 100644
|
| --- a/Source/core/dom/RenderTreeBuilder.cpp
|
| +++ b/Source/core/dom/RenderTreeBuilder.cpp
|
| @@ -59,25 +59,37 @@ RenderObject* RenderTreeBuilder::nextRenderer() const
|
|
|
| RenderObject* RenderTreeBuilder::parentRenderer() const
|
| {
|
| - ASSERT(m_renderingParent);
|
| + return m_renderingParent->renderer();
|
| +}
|
|
|
| - Element* element = m_node->isElementNode() ? toElement(m_node) : 0;
|
| +bool RenderTreeBuilder::rendererIsNeeded() const
|
| +{
|
| + if (!m_renderingParent)
|
| + return false;
|
| + RenderObject* parentRenderer = this->parentRenderer();
|
| + if (!parentRenderer)
|
| + return false;
|
| + if (!parentRenderer->canHaveChildren())
|
| + return false;
|
| + return true;
|
| +}
|
|
|
| - if (element && m_renderingParent->renderer()) {
|
| - // FIXME: Guarding this by m_renderingParent->renderer() isn't quite right as the spec for
|
| - // top layer only talks about display: none ancestors so putting a <dialog> inside an
|
| - // <optgroup> seems like it should still work even though this check will prevent it.
|
| - if (element->isInTopLayer())
|
| - return m_node->document().renderView();
|
| - }
|
| +void RenderTreeBuilder::createRendererIfNeeded()
|
| +{
|
| + ASSERT(!m_node->renderer());
|
|
|
| - return m_renderingParent->renderer();
|
| + if (rendererIsNeeded())
|
| + createRenderer();
|
| }
|
|
|
| -bool RenderTreeBuilder::shouldCreateRenderer() const
|
| +bool RenderTreeBuilderForElement::rendererIsNeeded() const
|
| {
|
| - if (!m_renderingParent)
|
| + if (!RenderTreeBuilder::rendererIsNeeded())
|
| return false;
|
| +
|
| + ASSERT(m_renderingParent);
|
| +
|
| + // FIXME: Should the following be in SVGElement::rendererIsNeeded()?
|
| if (m_node->isSVGElement()) {
|
| // SVG elements only render when inside <svg>, or if the element is an <svg> itself.
|
| if (!isSVGSVGElement(*m_node) && !m_renderingParent->isSVGElement())
|
| @@ -85,33 +97,32 @@ bool RenderTreeBuilder::shouldCreateRenderer() const
|
| if (!toSVGElement(m_node)->isValid())
|
| return false;
|
| }
|
| - RenderObject* parentRenderer = this->parentRenderer();
|
| - if (!parentRenderer)
|
| - return false;
|
| - if (!parentRenderer->canHaveChildren())
|
| - return false;
|
| - return true;
|
| +
|
| + return toElement(m_node)->rendererIsNeeded(*m_style.get());
|
| }
|
|
|
| -RenderStyle& RenderTreeBuilder::style() const
|
| +RenderObject* RenderTreeBuilderForElement::parentRenderer() const
|
| {
|
| - if (!m_style)
|
| - m_style = toElement(m_node)->styleForRenderer();
|
| - return *m_style;
|
| + ASSERT(m_renderingParent);
|
| +
|
| + if (m_renderingParent->renderer()) {
|
| + // FIXME: Guarding this by m_renderingParent->renderer() isn't quite right as the spec for
|
| + // top layer only talks about display: none ancestors so putting a <dialog> inside an
|
| + // <optgroup> seems like it should still work even though this check will prevent it.
|
| + if (toElement(m_node)->isInTopLayer())
|
| + return m_node->document().renderView();
|
| + }
|
| +
|
| + return RenderTreeBuilder::parentRenderer();
|
| }
|
|
|
| -void RenderTreeBuilder::createRendererForElementIfNeeded()
|
| +void RenderTreeBuilderForElement::createRenderer()
|
| {
|
| + ASSERT(rendererIsNeeded());
|
| ASSERT(!m_node->renderer());
|
|
|
| - if (!shouldCreateRenderer())
|
| - return;
|
| -
|
| Element* element = toElement(m_node);
|
| - RenderStyle& style = this->style();
|
| -
|
| - if (!element->rendererIsNeeded(style))
|
| - return;
|
| + RenderStyle& style = *m_style.get();
|
|
|
| RenderObject* newRenderer = element->createRenderer(&style);
|
| if (!newRenderer)
|
| @@ -142,23 +153,25 @@ void RenderTreeBuilder::createRendererForElementIfNeeded()
|
| parentRenderer->addChild(newRenderer, nextRenderer);
|
| }
|
|
|
| -void RenderTreeBuilder::createRendererForTextIfNeeded()
|
| +bool RenderTreeBuilderForText::rendererIsNeeded() const
|
| {
|
| - ASSERT(!m_node->renderer());
|
| + if (!RenderTreeBuilder::rendererIsNeeded())
|
| + return false;
|
|
|
| - if (!shouldCreateRenderer())
|
| - return;
|
| + return toText(m_node)->textRendererIsNeeded(*parentRenderer()->style(), *parentRenderer());
|
| +}
|
| +
|
| +void RenderTreeBuilderForText::createRenderer()
|
| +{
|
| + ASSERT(rendererIsNeeded());
|
| + ASSERT(!m_node->renderer());
|
|
|
| Text* textNode = toText(m_node);
|
| RenderObject* parentRenderer = this->parentRenderer();
|
| + RenderStyle* style = parentRenderer->style();
|
|
|
| - 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())) {
|
| + RenderText* newRenderer = textNode->createTextRenderer(style);
|
| + if (!parentRenderer->isChildAllowed(newRenderer, style)) {
|
| newRenderer->destroy();
|
| return;
|
| }
|
| @@ -170,7 +183,7 @@ void RenderTreeBuilder::createRendererForTextIfNeeded()
|
| RenderObject* nextRenderer = this->nextRenderer();
|
| textNode->setRenderer(newRenderer);
|
| // Parent takes care of the animations, no need to call setAnimatableStyle.
|
| - newRenderer->setStyle(m_style.release());
|
| + newRenderer->setStyle(style);
|
| parentRenderer->addChild(newRenderer, nextRenderer);
|
| }
|
|
|
|
|