| Index: third_party/WebKit/Source/core/layout/svg/LayoutSVGText.cpp
 | 
| diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGText.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGText.cpp
 | 
| index a5d12e49b7143fbf0b984da98180a79237c4bea8..899e1708cfc4e5208cb27eb0e8e16bea1f71afc0 100644
 | 
| --- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGText.cpp
 | 
| +++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGText.cpp
 | 
| @@ -102,26 +102,27 @@ static inline void collectLayoutAttributes(LayoutObject* text, Vector<SVGTextLay
 | 
|      }
 | 
|  }
 | 
|  
 | 
| -inline bool LayoutSVGText::shouldHandleSubtreeMutations() const
 | 
| +void LayoutSVGText::invalidatePositioningValues(LayoutInvalidationReasonForTracing reason)
 | 
| +{
 | 
| +    m_layoutAttributes.clear();
 | 
| +    m_layoutAttributesBuilder.clearTextPositioningElements();
 | 
| +    setNeedsPositioningValuesUpdate();
 | 
| +    setNeedsLayoutAndFullPaintInvalidation(reason);
 | 
| +}
 | 
| +
 | 
| +void LayoutSVGText::subtreeChildWasAdded()
 | 
|  {
 | 
|      if (beingDestroyed() || !everHadLayout()) {
 | 
|          ASSERT(m_layoutAttributes.isEmpty());
 | 
|          ASSERT(!m_layoutAttributesBuilder.numberOfTextPositioningElements());
 | 
| -        return false;
 | 
| +        return;
 | 
|      }
 | 
| -    return true;
 | 
| -}
 | 
| -
 | 
| -void LayoutSVGText::subtreeChildWasAdded(LayoutObject*)
 | 
| -{
 | 
| -    if (!shouldHandleSubtreeMutations() || documentBeingDestroyed())
 | 
| +    if (documentBeingDestroyed())
 | 
|          return;
 | 
|  
 | 
| -    // The positioning elements cache doesn't include the new 'child' yet. Clear the
 | 
| -    // cache, as the next buildLayoutAttributesForText() call rebuilds it.
 | 
| -    m_layoutAttributesBuilder.clearTextPositioningElements();
 | 
| -    setNeedsPositioningValuesUpdate();
 | 
| -    setNeedsLayoutAndFullPaintInvalidation(LayoutInvalidationReason::ChildChanged);
 | 
| +    // The positioning elements cache depends on the size of each text layoutObject in the
 | 
| +    // subtree. If this changes, clear the cache. It will be rebuilt on the next layout.
 | 
| +    invalidatePositioningValues(LayoutInvalidationReason::ChildChanged);
 | 
|  }
 | 
|  
 | 
|  void LayoutSVGText::willBeDestroyed()
 | 
| @@ -132,31 +133,21 @@ void LayoutSVGText::willBeDestroyed()
 | 
|      LayoutSVGBlock::willBeDestroyed();
 | 
|  }
 | 
|  
 | 
| -void LayoutSVGText::subtreeChildWillBeRemoved(LayoutObject* child)
 | 
| +void LayoutSVGText::subtreeChildWillBeRemoved()
 | 
|  {
 | 
| -    ASSERT(child);
 | 
| -    if (!shouldHandleSubtreeMutations())
 | 
| +    if (beingDestroyed() || !everHadLayout()) {
 | 
| +        ASSERT(m_layoutAttributes.isEmpty());
 | 
| +        ASSERT(!m_layoutAttributesBuilder.numberOfTextPositioningElements());
 | 
|          return;
 | 
| +    }
 | 
|  
 | 
|      // The positioning elements cache depends on the size of each text layoutObject in the
 | 
| -    // subtree. If this changes, clear the cache. It will be rebuilt below on the next layout.
 | 
| -    m_layoutAttributesBuilder.clearTextPositioningElements();
 | 
| -    setNeedsPositioningValuesUpdate();
 | 
| -    setNeedsLayoutAndFullPaintInvalidation(LayoutInvalidationReason::ChildChanged);
 | 
| -
 | 
| -    if (m_layoutAttributes.isEmpty() || !child->isSVGInlineText())
 | 
| -        return;
 | 
| -
 | 
| -    // Make sure that a text node (layout attribute) reference is not left
 | 
| -    // dangling in |m_layoutAttributes|.
 | 
| -    size_t position = m_layoutAttributes.find(toLayoutSVGInlineText(child)->layoutAttributes());
 | 
| -    ASSERT(position != kNotFound);
 | 
| -    m_layoutAttributes.remove(position);
 | 
| +    // subtree. If this changes, clear the cache. It will be rebuilt on the next layout.
 | 
| +    invalidatePositioningValues(LayoutInvalidationReason::ChildChanged);
 | 
|  }
 | 
|  
 | 
| -void LayoutSVGText::subtreeTextDidChange(LayoutSVGInlineText* text)
 | 
| +void LayoutSVGText::subtreeTextDidChange()
 | 
|  {
 | 
| -    ASSERT(text);
 | 
|      ASSERT(!beingDestroyed());
 | 
|      if (!everHadLayout()) {
 | 
|          ASSERT(m_layoutAttributes.isEmpty());
 | 
| @@ -167,9 +158,7 @@ void LayoutSVGText::subtreeTextDidChange(LayoutSVGInlineText* text)
 | 
|      // The positioning elements cache depends on the size of each text object in
 | 
|      // the subtree. If this changes, clear the cache and mark it for rebuilding
 | 
|      // in the next layout.
 | 
| -    m_layoutAttributesBuilder.clearTextPositioningElements();
 | 
| -    setNeedsPositioningValuesUpdate();
 | 
| -    setNeedsLayoutAndFullPaintInvalidation(LayoutInvalidationReason::TextChanged);
 | 
| +    invalidatePositioningValues(LayoutInvalidationReason::TextChanged);
 | 
|  }
 | 
|  
 | 
|  static inline void updateFontInAllDescendants(LayoutSVGText& textRoot, SVGTextLayoutAttributesBuilder* builder = nullptr)
 | 
| @@ -390,13 +379,13 @@ void LayoutSVGText::addChild(LayoutObject* child, LayoutObject* beforeChild)
 | 
|      LayoutSVGBlock::addChild(child, beforeChild);
 | 
|  
 | 
|      SVGResourcesCache::clientWasAddedToTree(child, child->styleRef());
 | 
| -    subtreeChildWasAdded(child);
 | 
| +    subtreeChildWasAdded();
 | 
|  }
 | 
|  
 | 
|  void LayoutSVGText::removeChild(LayoutObject* child)
 | 
|  {
 | 
|      SVGResourcesCache::clientWillBeRemovedFromTree(child);
 | 
| -    subtreeChildWillBeRemoved(child);
 | 
| +    subtreeChildWillBeRemoved();
 | 
|  
 | 
|      LayoutSVGBlock::removeChild(child);
 | 
|  }
 | 
| 
 |