Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(636)

Unified Diff: Source/core/dom/RenderTreeBuilder.cpp

Issue 699213003: RenderTreeBuilder => RenderTreeBuilderForElement and RenderTreeBuilderForText (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
}

Powered by Google App Engine
This is Rietveld 408576698