| Index: Source/core/dom/RenderTreeBuilder.cpp
 | 
| diff --git a/Source/core/dom/RenderTreeBuilder.cpp b/Source/core/dom/RenderTreeBuilder.cpp
 | 
| index faa45502740da114ee05cbef3e76139de3e905c1..7572603e73763b11ab81fd4bb3a7ae75ca1aa8b9 100644
 | 
| --- a/Source/core/dom/RenderTreeBuilder.cpp
 | 
| +++ b/Source/core/dom/RenderTreeBuilder.cpp
 | 
| @@ -29,10 +29,8 @@
 | 
|  #include "core/HTMLNames.h"
 | 
|  #include "core/SVGNames.h"
 | 
|  #include "core/css/resolver/StyleResolver.h"
 | 
| -#include "core/dom/FirstLetterPseudoElement.h"
 | 
|  #include "core/dom/Fullscreen.h"
 | 
|  #include "core/dom/Node.h"
 | 
| -#include "core/dom/PseudoElement.h"
 | 
|  #include "core/dom/Text.h"
 | 
|  #include "core/rendering/RenderFullScreen.h"
 | 
|  #include "core/rendering/RenderObject.h"
 | 
| @@ -43,30 +41,6 @@
 | 
|  
 | 
|  namespace blink {
 | 
|  
 | 
| -RenderTreeBuilder::RenderTreeBuilder(Node* node, RenderStyle* style)
 | 
| -    : m_node(node)
 | 
| -    , m_renderingParent(nullptr)
 | 
| -    , m_style(style)
 | 
| -{
 | 
| -    ASSERT(!node->renderer());
 | 
| -    ASSERT(node->needsAttach());
 | 
| -    ASSERT(node->document().inStyleRecalc());
 | 
| -
 | 
| -    // FIXME: We should be able to ASSERT(node->inActiveDocument()) but childrenChanged is called
 | 
| -    // before ChildNodeInsertionNotifier in ContainerNode's methods and some implementations
 | 
| -    // will trigger a layout inside childrenChanged.
 | 
| -    // Mainly HTMLTextAreaElement::childrenChanged calls HTMLTextFormControlElement::setSelectionRange
 | 
| -    // which does an updateLayoutIgnorePendingStylesheets.
 | 
| -
 | 
| -    Element* element = node->isElementNode() ? toElement(node) : 0;
 | 
| -    if (element && element->isFirstLetterPseudoElement()) {
 | 
| -        if (RenderObject* nextRenderer = FirstLetterPseudoElement::firstLetterTextRenderer(*element))
 | 
| -            m_renderingParent = nextRenderer->parent();
 | 
| -    } else if (ContainerNode* containerNode = NodeRenderingTraversal::parent(node, &m_parentDetails)) {
 | 
| -        m_renderingParent = containerNode->renderer();
 | 
| -    }
 | 
| -}
 | 
| -
 | 
|  RenderObject* RenderTreeBuilder::nextRenderer() const
 | 
|  {
 | 
|      ASSERT(m_renderingParent);
 | 
| @@ -76,11 +50,8 @@ RenderObject* RenderTreeBuilder::nextRenderer() const
 | 
|      if (element && element->isInTopLayer())
 | 
|          return NodeRenderingTraversal::nextInTopLayer(element);
 | 
|  
 | 
| -    if (element && element->isFirstLetterPseudoElement())
 | 
| -        return FirstLetterPseudoElement::firstLetterTextRenderer(*element);
 | 
| -
 | 
|      // Avoid an O(N^2) walk over the children when reattaching all children of a node.
 | 
| -    if (m_renderingParent->node() && m_renderingParent->node()->needsAttach())
 | 
| +    if (m_renderingParent->needsAttach())
 | 
|          return 0;
 | 
|  
 | 
|      return NodeRenderingTraversal::nextSiblingRenderer(m_node);
 | 
| @@ -92,15 +63,15 @@ RenderObject* RenderTreeBuilder::parentRenderer() const
 | 
|  
 | 
|      Element* element = m_node->isElementNode() ? toElement(m_node) : 0;
 | 
|  
 | 
| -    if (element && m_renderingParent) {
 | 
| -        // FIXME: Guarding this by m_renderingParent isn't quite right as the spec for
 | 
| +    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();
 | 
|      }
 | 
|  
 | 
| -    return m_renderingParent;
 | 
| +    return m_renderingParent->renderer();
 | 
|  }
 | 
|  
 | 
|  bool RenderTreeBuilder::shouldCreateRenderer() const
 | 
| @@ -109,12 +80,11 @@ bool RenderTreeBuilder::shouldCreateRenderer() const
 | 
|          return false;
 | 
|      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->node() || !m_renderingParent->node()->isSVGElement()))
 | 
| +        if (!isSVGSVGElement(*m_node) && !m_renderingParent->isSVGElement())
 | 
|              return false;
 | 
|          if (!toSVGElement(m_node)->isValid())
 | 
|              return false;
 | 
|      }
 | 
| -
 | 
|      RenderObject* parentRenderer = this->parentRenderer();
 | 
|      if (!parentRenderer)
 | 
|          return false;
 | 
| 
 |