Chromium Code Reviews| 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"); |