Index: third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp |
diff --git a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp |
index 6ec56ae219e45641cc2236ae067ceed775daf0b3..57c10fd8d9f9c884360f031eda8b1ea6695ecb49 100644 |
--- a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp |
+++ b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp |
@@ -51,6 +51,7 @@ |
#include "core/loader/FrameLoaderClient.h" |
#include "core/page/ChromeClient.h" |
#include "core/page/Page.h" |
+#include "core/page/scrolling/RootScrollerController.h" |
#include "core/page/scrolling/ScrollingCoordinator.h" |
#include "core/paint/FramePainter.h" |
#include "core/paint/ObjectPaintInvalidator.h" |
@@ -252,6 +253,7 @@ void PaintLayerCompositor::updateIfNeededRecursiveInternal() |
scrollableArea->updateCompositorScrollAnimations(); |
} |
+ m_layoutView.document().rootScrollerController()->didUpdateCompositing(); |
#if ENABLE(ASSERT) |
ASSERT(lifecycle().state() == DocumentLifecycle::CompositingClean); |
assertNoUnresolvedDirtyBits(); |
@@ -419,6 +421,8 @@ void PaintLayerCompositor::updateIfNeeded() |
} |
} |
+ setClippingOnRootScrollerAncestors(); |
+ |
GraphicsLayerUpdater updater; |
updater.update(*updateRoot, layersNeedingPaintInvalidation); |
@@ -461,6 +465,28 @@ void PaintLayerCompositor::updateIfNeeded() |
InspectorInstrumentation::layerTreeDidChange(m_layoutView.frame()); |
} |
+void PaintLayerCompositor::setClippingOnRootScrollerAncestors() |
+{ |
+ bool shouldClip = !rootLayer()->hasRootScrollerAsDescendant(); |
+ if (m_rootContentLayer) |
+ m_rootContentLayer->setMasksToBounds(shouldClip); |
+ |
+ RootScrollerController* topRootScrollerController = |
+ m_layoutView.document().topDocument().rootScrollerController(); |
+ bool frameIsRootScroller = |
+ topRootScrollerController->rootScrollerLayer() == scrollLayer(); |
+ |
+ // We normally clip iframes' (but not the root frame) overflow controls |
+ // host and container layers but if the root scroller is the iframe itself |
+ // we want it to behave like the root frame. |
+ shouldClip &= !frameIsRootScroller && !m_layoutView.frame()->isLocalRoot(); |
+ |
+ if (m_containerLayer) |
+ m_containerLayer->setMasksToBounds(shouldClip); |
chrishtr
2016/09/01 23:42:57
Could you try moving these to the sites where we c
bokan
2016/09/09 00:19:02
Currently, setMasksToBounds gets called only when
|
+ if (m_overflowControlsHostLayer) |
+ m_overflowControlsHostLayer->setMasksToBounds(shouldClip); |
+} |
+ |
static void restartAnimationOnCompositor(const LayoutObject& layoutObject) |
{ |
Node* node = layoutObject.node(); |