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

Unified Diff: third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp

Issue 2289833002: Disable clipping on root scroller's ancestors. (Closed)
Patch Set: Also setNeedsCompositingUpdate from TopDocumentRootScrollerController Created 4 years, 3 months 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: 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 229fe43c32a97c2e6219e9c39137e22552472d26..fae9536ffe05741f0be678b32e314de5fbcf39f6 100644
--- a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp
+++ b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp
@@ -52,6 +52,7 @@
#include "core/page/ChromeClient.h"
#include "core/page/Page.h"
#include "core/page/scrolling/ScrollingCoordinator.h"
+#include "core/page/scrolling/TopDocumentRootScrollerController.h"
#include "core/paint/FramePainter.h"
#include "core/paint/ObjectPaintInvalidator.h"
#include "core/paint/TransformRecorder.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()
}
}
+ updateClippingOnCompositorLayers();
+
GraphicsLayerUpdater updater;
updater.update(*updateRoot, layersNeedingPaintInvalidation);
@@ -461,6 +465,37 @@ void PaintLayerCompositor::updateIfNeeded()
InspectorInstrumentation::layerTreeDidChange(m_layoutView.frame());
}
+void PaintLayerCompositor::updateClippingOnCompositorLayers()
+{
+ bool shouldClip = !rootLayer()->hasRootScrollerAsDescendant();
+ if (m_rootContentLayer) {
+ // FIXME: with rootLayerScrolls, we probably don't even need
+ // m_rootContentLayer?
+ m_rootContentLayer->setMasksToBounds(
+ !RuntimeEnabledFeatures::rootLayerScrollingEnabled() && shouldClip);
+ }
+
+ // TODO(bokan): Temporary hack-cast to TDRSC until the follow-up patch
+ // lands and we can get a pointer to a TopDocumentRootScrollerController
+ // legitimately.
+ TopDocumentRootScrollerController* globalRootScrollerController =
+ (TopDocumentRootScrollerController*)m_layoutView.document().topDocument().rootScrollerController();
+
+ Element* documentElement = m_layoutView.document().documentElement();
+ bool frameIsRootScroller = documentElement && documentElement->isSameNode(
+ globalRootScrollerController->globalRootScroller());
+
+ // 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);
+ if (m_overflowControlsHostLayer)
+ m_overflowControlsHostLayer->setMasksToBounds(shouldClip);
+}
+
static void restartAnimationOnCompositor(const LayoutObject& layoutObject)
{
Node* node = layoutObject.node();
@@ -739,6 +774,11 @@ GraphicsLayer* PaintLayerCompositor::containerLayer() const
return m_containerLayer.get();
}
+GraphicsLayer* PaintLayerCompositor::rootContentLayer() const
+{
+ return m_rootContentLayer.get();
+}
+
void PaintLayerCompositor::setIsInWindow(bool isInWindow)
{
if (!staleInCompositingMode())
@@ -1024,28 +1064,17 @@ void PaintLayerCompositor::ensureRootLayer()
m_rootContentLayer->setSize(FloatSize(overflowRect.maxX(), overflowRect.maxY()));
m_rootContentLayer->setPosition(FloatPoint());
m_rootContentLayer->setOwnerNodeId(DOMNodeIds::idForNode(m_layoutView.node()));
-
- // FIXME: with rootLayerScrolls, we probably don't even need m_rootContentLayer?
- if (!RuntimeEnabledFeatures::rootLayerScrollingEnabled()) {
- // Need to clip to prevent transformed content showing outside this frame
- m_rootContentLayer->setMasksToBounds(true);
- }
}
if (!m_overflowControlsHostLayer) {
ASSERT(!m_scrollLayer);
ASSERT(!m_containerLayer);
- // Create a layer to host the clipping layer and the overflow controls layers.
+ // Create a layer to host the clipping layer and the overflow controls
+ // layers. Whether these layers mask the content below is determined
+ // in updateClippingOnCompositorLayers.
m_overflowControlsHostLayer = GraphicsLayer::create(this);
-
- // Clip iframe's overflow controls layer.
- bool containerMasksToBounds = !m_layoutView.frame()->isLocalRoot();
- m_overflowControlsHostLayer->setMasksToBounds(containerMasksToBounds);
-
- // Create a clipping layer if this is an iframe or settings require to clip.
m_containerLayer = GraphicsLayer::create(this);
- m_containerLayer->setMasksToBounds(containerMasksToBounds);
m_scrollLayer = GraphicsLayer::create(this);
if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())

Powered by Google App Engine
This is Rietveld 408576698