| Index: third_party/WebKit/Source/core/paint/PaintLayer.cpp
 | 
| diff --git a/third_party/WebKit/Source/core/paint/PaintLayer.cpp b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
 | 
| index 37a94ac80e0939e43eb374798ff3684fdb5e86ef..96427620064aae584561cbd9c69066c3d50f4803 100644
 | 
| --- a/third_party/WebKit/Source/core/paint/PaintLayer.cpp
 | 
| +++ b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
 | 
| @@ -2334,6 +2334,14 @@ GraphicsLayer* PaintLayer::graphicsLayerBackingForScrolling() const
 | 
|      }
 | 
|  }
 | 
|  
 | 
| +bool PaintLayer::shouldPaintBackgroundOntoScrollingContentsLayer() const
 | 
| +{
 | 
| +    return !isRootLayer()
 | 
| +        && scrollsOverflow()
 | 
| +        && layoutObject()->style()->hasEntirelyLocalBackground()
 | 
| +        && !stackingNode()->hasNegativeZOrderList();
 | 
| +}
 | 
| +
 | 
|  void PaintLayer::ensureCompositedLayerMapping()
 | 
|  {
 | 
|      if (m_rareData && m_rareData->compositedLayerMapping)
 | 
| @@ -2397,9 +2405,6 @@ bool PaintLayer::paintsWithTransform(GlobalPaintFlags globalPaintFlags) const
 | 
|  
 | 
|  bool PaintLayer::backgroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect) const
 | 
|  {
 | 
| -    if (!isSelfPaintingLayer() && !hasSelfPaintingLayerDescendant())
 | 
| -        return false;
 | 
| -
 | 
|      if (paintsWithTransparency(GlobalPaintNormalPhase))
 | 
|          return false;
 | 
|  
 | 
| @@ -2421,8 +2426,6 @@ bool PaintLayer::backgroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect)
 | 
|      if (m_stackingNode->zOrderListsDirty())
 | 
|          return false;
 | 
|  
 | 
| -    // FIXME: We currently only check the immediate layoutObject,
 | 
| -    // which will miss many cases.
 | 
|      if (layoutObject()->backgroundIsKnownToBeOpaqueInRect(localRect))
 | 
|          return true;
 | 
|  
 | 
| @@ -2431,16 +2434,22 @@ bool PaintLayer::backgroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect)
 | 
|      if (layoutObject()->hasClipRelatedProperty())
 | 
|          return false;
 | 
|  
 | 
| +    // TODO(schenney): This could be improved by unioning the opaque regions of all the children.
 | 
| +    // That would require a refactoring because currently children just check they at least
 | 
| +    // cover the given rect, but a unioning method would require children to compute and report
 | 
| +    // their rects.
 | 
|      return childBackgroundIsKnownToBeOpaqueInRect(localRect);
 | 
|  }
 | 
|  
 | 
|  bool PaintLayer::childBackgroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect) const
 | 
|  {
 | 
| -    PaintLayerStackingNodeReverseIterator revertseIterator(*m_stackingNode, PositiveZOrderChildren | NormalFlowChildren | NegativeZOrderChildren);
 | 
| -    while (PaintLayerStackingNode* child = revertseIterator.next()) {
 | 
| +    PaintLayerStackingNodeReverseIterator reverseIterator(*m_stackingNode, PositiveZOrderChildren | NormalFlowChildren | NegativeZOrderChildren);
 | 
| +    while (PaintLayerStackingNode* child = reverseIterator.next()) {
 | 
|          const PaintLayer* childLayer = child->layer();
 | 
| -        // Stop at composited paint boundaries.
 | 
| -        if (childLayer->isPaintInvalidationContainer())
 | 
| +        // Stop at composited paint boundaries and non-self-painting layers.
 | 
| +        if (childLayer->isPaintInvalidationContainer()
 | 
| +            || childLayer->isSelfPaintingLayer()
 | 
| +            || childLayer->hasSelfPaintingLayerDescendant())
 | 
|              continue;
 | 
|  
 | 
|          if (!childLayer->canUseConvertToLayerCoords())
 | 
| 
 |