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

Unified Diff: Source/core/rendering/RenderLayerCompositor.cpp

Issue 16136004: Add graphics layers for pinch virtual viewport. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Revised as per comments Created 7 years, 7 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
« no previous file with comments | « Source/core/rendering/RenderLayerCompositor.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/RenderLayerCompositor.cpp
diff --git a/Source/core/rendering/RenderLayerCompositor.cpp b/Source/core/rendering/RenderLayerCompositor.cpp
index 4b2c4d051671c05c0ec5db745f3f36cc37cec263..633a4992416408a5b73e4cb7d24695c2ce10479f 100644
--- a/Source/core/rendering/RenderLayerCompositor.cpp
+++ b/Source/core/rendering/RenderLayerCompositor.cpp
@@ -318,7 +318,7 @@ void RenderLayerCompositor::didChangeVisibleRect()
if (!frameView)
return;
- IntRect visibleRect = m_clipLayer ? IntRect(IntPoint(), frameView->contentsSize()) : frameView->visibleContentRect();
+ IntRect visibleRect = m_innerViewportClipLayer ? IntRect(IntPoint(), frameView->contentsSize()) : frameView->visibleContentRect();
if (rootLayer->visibleRectChangeRequiresFlush(visibleRect)) {
if (Page* page = this->page())
page->chrome().client()->scheduleCompositingLayerFlush();
@@ -1117,9 +1117,15 @@ void RenderLayerCompositor::frameViewDidChangeLocation(const IntPoint& contentsO
void RenderLayerCompositor::frameViewDidChangeSize()
{
- if (m_clipLayer) {
+ if (m_innerViewportClipLayer) {
FrameView* frameView = m_renderView->frameView();
- m_clipLayer->setSize(frameView->unscaledVisibleContentSize());
+ FloatSize unscaledVisibleContentSize = frameView->unscaledVisibleContentSize();
+ m_innerViewportClipLayer->setSize(frameView->frameRect().size());
+ if (m_outerViewportClipLayer) {
+ FloatSize visibleContentSize(unscaledVisibleContentSize);
+ visibleContentSize.scale(frameView->visibleContentScaleFactor());
+ m_outerViewportClipLayer->setSize(visibleContentSize);
+ }
frameViewDidScroll();
updateOverflowControlsLayers();
@@ -1136,7 +1142,7 @@ void RenderLayerCompositor::frameViewDidScroll()
FrameView* frameView = m_renderView->frameView();
IntPoint scrollPosition = frameView->scrollPosition();
- if (!m_scrollLayer)
+ if (!m_innerViewportScrollLayer)
return;
// If there's a scrolling coordinator that manages scrolling for this frame view,
@@ -1150,7 +1156,7 @@ void RenderLayerCompositor::frameViewDidScroll()
}
}
- m_scrollLayer->setPosition(FloatPoint(-scrollPosition.x(), -scrollPosition.y()));
+ m_innerViewportScrollLayer->setPosition(FloatPoint(-scrollPosition.x(), -scrollPosition.y()));
if (GraphicsLayer* fixedBackgroundLayer = fixedRootBackgroundLayer())
fixedBackgroundLayer->setPosition(IntPoint(frameView->scrollOffsetForFixedPosition()));
@@ -1415,7 +1421,7 @@ GraphicsLayer* RenderLayerCompositor::rootGraphicsLayer() const
GraphicsLayer* RenderLayerCompositor::scrollLayer() const
{
- return m_scrollLayer.get();
+ return m_innerViewportScrollLayer.get();
}
void RenderLayerCompositor::setIsInWindow(bool isInWindow)
@@ -1463,9 +1469,11 @@ void RenderLayerCompositor::updateRootLayerPosition()
m_rootContentLayer->setSize(documentRect.size());
m_rootContentLayer->setPosition(documentRect.location());
}
- if (m_clipLayer) {
+ if (m_innerViewportClipLayer) {
FrameView* frameView = m_renderView->frameView();
- m_clipLayer->setSize(frameView->unscaledVisibleContentSize());
+ m_innerViewportClipLayer->setSize(frameView->frameRect().size());
+ if (m_outerViewportClipLayer)
+ m_outerViewportClipLayer->setSize(frameView->unscaledVisibleContentSize());
}
#if ENABLE(RUBBER_BANDING)
@@ -2203,7 +2211,12 @@ GraphicsLayer* RenderLayerCompositor::updateLayerForTopOverhangArea(bool wantsLa
#ifndef NDEBUG
m_layerForTopOverhangArea->setName("top overhang area");
#endif
- m_scrollLayer->addChildBelow(m_layerForTopOverhangArea.get(), m_rootContentLayer.get());
+ // FIXME: When the pinch virtual viewport is enabled, do we really want
enne (OOO) 2013/05/30 21:03:31 This is wrong, but this patch doesn't make it any
wjmaclean 2013/05/31 18:21:10 Yes. Even better, it can be immortalized with a DC
+ // to be applying the page scale to the bottom overhang layer? Will it hurt anything?
+ if (!m_outerViewportScrollLayer)
+ m_innerViewportScrollLayer->addChildBelow(m_layerForTopOverhangArea.get(), m_rootContentLayer.get());
+ else
+ m_outerViewportScrollLayer->addChildBelow(m_layerForTopOverhangArea.get(), m_rootContentLayer.get());
}
return m_layerForTopOverhangArea.get();
@@ -2227,7 +2240,12 @@ GraphicsLayer* RenderLayerCompositor::updateLayerForBottomOverhangArea(bool want
#ifndef NDEBUG
m_layerForBottomOverhangArea->setName("bottom overhang area");
#endif
- m_scrollLayer->addChildBelow(m_layerForBottomOverhangArea.get(), m_rootContentLayer.get());
+ // FIXME: When the pinch virtual viewport is enabled, do we really want
+ // to be applying the page scale to the bottom overhang layer? Will it hurt anything?
+ if (!m_outerViewportScrollLayer)
+ m_innerViewportScrollLayer->addChildBelow(m_layerForBottomOverhangArea.get(), m_rootContentLayer.get());
+ else
+ m_outerViewportScrollLayer->addChildBelow(m_layerForBottomOverhangArea.get(), m_rootContentLayer.get());
}
m_layerForBottomOverhangArea->setPosition(FloatPoint(0, m_rootContentLayer->size().height()));
@@ -2257,6 +2275,8 @@ bool RenderLayerCompositor::viewHasTransparentBackground(Color* backgroundColor)
void RenderLayerCompositor::updateOverflowControlsLayers()
{
+ GraphicsLayer* hostLayerForOverflowControls = m_outerViewportClipLayer ?
+ m_innerViewportScrollLayer.get() : m_innerViewportClipLayer.get();
#if ENABLE(RUBBER_BANDING)
if (requiresOverhangAreasLayer()) {
if (!m_layerForOverhangAreas) {
@@ -2269,7 +2289,7 @@ void RenderLayerCompositor::updateOverflowControlsLayers()
// We want the overhang areas layer to be positioned below the frame contents,
// so insert it below the clip layer.
- m_overflowControlsHostLayer->addChildBelow(m_layerForOverhangAreas.get(), m_clipLayer.get());
+ m_overflowControlsHostLayer->addChildBelow(m_layerForOverhangAreas.get(), m_innerViewportClipLayer.get());
}
} else if (m_layerForOverhangAreas) {
m_layerForOverhangAreas->removeFromParent();
@@ -2286,7 +2306,10 @@ void RenderLayerCompositor::updateOverflowControlsLayers()
m_contentShadowLayer->setPosition(m_rootContentLayer->position());
ScrollbarTheme::theme()->setUpContentShadowLayer(m_contentShadowLayer.get());
- m_scrollLayer->addChildBelow(m_contentShadowLayer.get(), m_rootContentLayer.get());
+ if (!m_outerViewportScrollLayer)
+ m_innerViewportScrollLayer->addChildBelow(m_contentShadowLayer.get(), m_rootContentLayer.get());
+ else
+ m_outerViewportScrollLayer->addChildBelow(m_contentShadowLayer.get(), m_rootContentLayer.get());
}
} else if (m_contentShadowLayer) {
m_contentShadowLayer->removeFromParent();
@@ -2301,7 +2324,7 @@ void RenderLayerCompositor::updateOverflowControlsLayers()
#ifndef NDEBUG
m_layerForHorizontalScrollbar->setName("horizontal scrollbar");
#endif
- m_overflowControlsHostLayer->addChild(m_layerForHorizontalScrollbar.get());
+ hostLayerForOverflowControls->addChild(m_layerForHorizontalScrollbar.get());
if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
scrollingCoordinator->scrollableAreaScrollbarLayerDidChange(m_renderView->frameView(), HorizontalScrollbar);
@@ -2321,7 +2344,7 @@ void RenderLayerCompositor::updateOverflowControlsLayers()
#ifndef NDEBUG
m_layerForVerticalScrollbar->setName("vertical scrollbar");
#endif
- m_overflowControlsHostLayer->addChild(m_layerForVerticalScrollbar.get());
+ hostLayerForOverflowControls->addChild(m_layerForVerticalScrollbar.get());
if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
scrollingCoordinator->scrollableAreaScrollbarLayerDidChange(m_renderView->frameView(), VerticalScrollbar);
@@ -2341,7 +2364,7 @@ void RenderLayerCompositor::updateOverflowControlsLayers()
#ifndef NDEBUG
m_layerForScrollCorner->setName("scroll corner");
#endif
- m_overflowControlsHostLayer->addChild(m_layerForScrollCorner.get());
+ hostLayerForOverflowControls->addChild(m_layerForScrollCorner.get());
}
} else if (m_layerForScrollCorner) {
m_layerForScrollCorner->removeFromParent();
@@ -2371,8 +2394,8 @@ void RenderLayerCompositor::ensureRootLayer()
}
if (!m_overflowControlsHostLayer) {
- ASSERT(!m_scrollLayer);
- ASSERT(!m_clipLayer);
+ ASSERT(!m_innerViewportScrollLayer);
+ ASSERT(!m_innerViewportClipLayer);
// Create a layer to host the clipping layer and the overflow controls layers.
m_overflowControlsHostLayer = GraphicsLayer::create(graphicsLayerFactory(), this);
@@ -2381,23 +2404,68 @@ void RenderLayerCompositor::ensureRootLayer()
#endif
// Create a clipping layer if this is an iframe
enne (OOO) 2013/05/30 21:03:31 Is this comment true?
wjmaclean 2013/05/31 18:21:10 Hmm, not sure. The line below got changed in a sea
- m_clipLayer = GraphicsLayer::create(graphicsLayerFactory(), this);
+ m_innerViewportClipLayer = GraphicsLayer::create(graphicsLayerFactory(), this);
#ifndef NDEBUG
- m_clipLayer->setName("frame clipping");
+ m_innerViewportClipLayer->setName("inner viewport clipping");
#endif
- m_clipLayer->setMasksToBounds(true);
+ m_innerViewportClipLayer->setMasksToBounds(true);
- m_scrollLayer = GraphicsLayer::create(graphicsLayerFactory(), this);
+ m_innerViewportScrollLayer = GraphicsLayer::create(graphicsLayerFactory(), this);
#ifndef NDEBUG
- m_scrollLayer->setName("frame scrolling");
+ m_innerViewportScrollLayer->setName("inner viewport scrolling");
#endif
if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
- scrollingCoordinator->setLayerIsContainerForFixedPositionLayers(m_scrollLayer.get(), true);
-
+ scrollingCoordinator->setLayerIsContainerForFixedPositionLayers(m_innerViewportScrollLayer.get(), true);
// Hook them up
- m_overflowControlsHostLayer->addChild(m_clipLayer.get());
- m_clipLayer->addChild(m_scrollLayer.get());
- m_scrollLayer->addChild(m_rootContentLayer.get());
+ if (isMainFrame() && m_renderView->document()->settings()->pinchVirtualViewportEnabled()) {
+ // When using the pinch virtual viewport, the layer hierarchy looks like this:
enne (OOO) 2013/05/30 21:03:31 Can you add overhang layers too?
wjmaclean 2013/05/31 18:21:10 Will do.
+ //
+ // overflowControlsHostLayer
+ // innerViewportClipLayer (fixed pos container)
+ // pageScaleLayer
+ // innerViewportScrollLayer
+ // outerViewportClipLayer (fixed pos container)
+ // outerViewportScrollLayer
+ // horizontal ScrollbarLayer (non-overlay)
+ // verticalScrollbarLayer (non-overlay)
+ // scroll corner (non-overlay)
+ // horizontalScrollbarLayer (overlay)
+ // verticalScrollbarLayer (overlay)
+ //
+ m_outerViewportClipLayer = GraphicsLayer::create(graphicsLayerFactory(), this);
+ m_outerViewportClipLayer->setMasksToBounds(true);
+
+ m_outerViewportScrollLayer = GraphicsLayer::create(graphicsLayerFactory(), this);
+ if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
+ scrollingCoordinator->setLayerIsContainerForFixedPositionLayers(m_outerViewportScrollLayer.get(), true);
+
+ m_pageScaleLayer = GraphicsLayer::create(graphicsLayerFactory(), this);
+
+#ifndef NDEBUG
+ m_pageScaleLayer->setName("page scale layer");
+ m_outerViewportClipLayer->setName("outer viewport clip");
+ m_outerViewportScrollLayer->setName("outer viewport scrolling");
+#endif
+
+ m_overflowControlsHostLayer->addChild(m_innerViewportClipLayer.get());
+ m_innerViewportClipLayer->addChild(m_pageScaleLayer.get());
+ m_pageScaleLayer->addChild(m_innerViewportScrollLayer.get());
+ m_innerViewportScrollLayer->addChild(m_outerViewportClipLayer.get());
+ m_outerViewportClipLayer->addChild(m_outerViewportScrollLayer.get());
+ m_outerViewportScrollLayer->addChild(m_rootContentLayer.get());
+ } else {
+ // When not using the pinch virtual viewport, the layer hierarchy looks like this:
+ //
+ // overflowControlsHostLayer
+ // innerViewportClipLayer (fixed pos container)
+ // innerViewportScrollLayer
+ // horizontalScrollbarLayer (overlay/non-overlay)
+ // verticalScrollbarLayer (overlay/non-overlay)
+ //
+ m_overflowControlsHostLayer->addChild(m_innerViewportClipLayer.get());
+ m_innerViewportClipLayer->addChild(m_innerViewportScrollLayer.get());
+ m_innerViewportScrollLayer->addChild(m_rootContentLayer.get());
+ }
frameViewDidChangeSize();
frameViewDidScroll();
@@ -2449,10 +2517,13 @@ void RenderLayerCompositor::destroyRootLayer()
if (m_overflowControlsHostLayer) {
m_overflowControlsHostLayer = nullptr;
- m_clipLayer = nullptr;
- m_scrollLayer = nullptr;
+ m_innerViewportClipLayer = nullptr;
+ m_innerViewportScrollLayer = nullptr;
+ m_outerViewportClipLayer = nullptr;
+ m_outerViewportScrollLayer = nullptr;
+ m_pageScaleLayer = nullptr;
}
- ASSERT(!m_scrollLayer);
+ ASSERT(!m_innerViewportScrollLayer);
m_rootContentLayer = nullptr;
}
@@ -2732,8 +2803,11 @@ void RenderLayerCompositor::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo
MemoryClassInfo info(memoryObjectInfo, this, PlatformMemoryTypes::Rendering);
info.addWeakPointer(m_renderView);
info.addMember(m_rootContentLayer, "rootContentLayer");
- info.addMember(m_clipLayer, "clipLayer");
- info.addMember(m_scrollLayer, "scrollLayer");
+ info.addMember(m_innerViewportClipLayer, "innerViewportClipLayer");
+ info.addMember(m_innerViewportScrollLayer, "innerViewportScrollLayer");
+ info.addMember(m_outerViewportClipLayer, "outerViewportClipLayer");
+ info.addMember(m_outerViewportScrollLayer, "outerViewportScrollLayer");
+ info.addMember(m_pageScaleLayer, "pageScaleLayer");
info.addMember(m_viewportConstrainedLayers, "viewportConstrainedLayers");
info.addMember(m_overflowControlsHostLayer, "overflowControlsHostLayer");
info.addMember(m_layerForHorizontalScrollbar, "layerForHorizontalScrollbar");
« no previous file with comments | « Source/core/rendering/RenderLayerCompositor.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698