| Index: third_party/WebKit/Source/core/frame/VisualViewport.cpp
|
| diff --git a/third_party/WebKit/Source/core/frame/VisualViewport.cpp b/third_party/WebKit/Source/core/frame/VisualViewport.cpp
|
| index 6c854a62375373c20e8a37372cf52cf397098140..ab54a3ca6eb202870fe078a7d61f4e4b351fb39e 100644
|
| --- a/third_party/WebKit/Source/core/frame/VisualViewport.cpp
|
| +++ b/third_party/WebKit/Source/core/frame/VisualViewport.cpp
|
| @@ -319,30 +319,57 @@ bool VisualViewport::magnifyScaleAroundAnchor(float magnifyDelta,
|
| return true;
|
| }
|
|
|
| -// Modifies the top of the graphics layer tree to add layers needed to support
|
| -// the inner/outer viewport fixed-position model for pinch zoom. When finished,
|
| -// the tree will look like this (with * denoting added layers):
|
| -//
|
| -// *rootTransformLayer
|
| -// +- *innerViewportContainerLayer (fixed pos container)
|
| -// +- *overscrollElasticityLayer
|
| -// | +- *pageScaleLayer
|
| -// | +- *innerViewportScrollLayer
|
| -// | +-- overflowControlsHostLayer (root layer)
|
| -// | | [ owned by PaintLayerCompositor ]
|
| -// | +-- outerViewportContainerLayer (fixed pos container)
|
| -// | | [frame container layer in PaintLayerCompositor]
|
| -// | | +-- outerViewportScrollLayer
|
| -// | | | [frame scroll layer in PaintLayerCompositor]
|
| -// | | +-- content layers ...
|
| -// +- *PageOverlay for InspectorOverlay
|
| -// +- *PageOverlay for ColorOverlay
|
| -// +- horizontalScrollbarLayer [ owned by PaintLayerCompositor ]
|
| -// +- verticalScrollbarLayer [ owned by PaintLayerCompositor ]
|
| -// +- scroll corner (non-overlay only) [ owned by PaintLayerCompositor ]
|
| -//
|
| -void VisualViewport::attachToLayerTree(GraphicsLayer* currentLayerTreeRoot) {
|
| - TRACE_EVENT1("blink", "VisualViewport::attachToLayerTree",
|
| +void VisualViewport::createLayerTree() {
|
| + if (m_innerViewportScrollLayer)
|
| + return;
|
| +
|
| + DCHECK(!m_overlayScrollbarHorizontal && !m_overlayScrollbarVertical &&
|
| + !m_overscrollElasticityLayer && !m_pageScaleLayer &&
|
| + !m_innerViewportContainerLayer);
|
| +
|
| + // FIXME: The root transform layer should only be created on demand.
|
| + m_rootTransformLayer = GraphicsLayer::create(this);
|
| + m_innerViewportContainerLayer = GraphicsLayer::create(this);
|
| + m_overscrollElasticityLayer = GraphicsLayer::create(this);
|
| + m_pageScaleLayer = GraphicsLayer::create(this);
|
| + m_innerViewportScrollLayer = GraphicsLayer::create(this);
|
| + m_overlayScrollbarHorizontal = GraphicsLayer::create(this);
|
| + m_overlayScrollbarVertical = GraphicsLayer::create(this);
|
| +
|
| + ScrollingCoordinator* coordinator = frameHost().page().scrollingCoordinator();
|
| + DCHECK(coordinator);
|
| + coordinator->setLayerIsContainerForFixedPositionLayers(
|
| + m_innerViewportScrollLayer.get(), true);
|
| +
|
| + // Set masks to bounds so the compositor doesn't clobber a manually
|
| + // set inner viewport container layer size.
|
| + m_innerViewportContainerLayer->setMasksToBounds(
|
| + frameHost().page().settings().getMainFrameClipsContent());
|
| + m_innerViewportContainerLayer->setSize(FloatSize(m_size));
|
| +
|
| + m_innerViewportScrollLayer->platformLayer()->setScrollClipLayer(
|
| + m_innerViewportContainerLayer->platformLayer());
|
| + m_innerViewportScrollLayer->platformLayer()->setUserScrollable(true, true);
|
| + if (mainFrame()) {
|
| + if (Document* document = mainFrame()->document()) {
|
| + m_innerViewportScrollLayer->setElementId(createCompositorElementId(
|
| + DOMNodeIds::idForNode(document), CompositorSubElementId::Viewport));
|
| + }
|
| + }
|
| +
|
| + m_rootTransformLayer->addChild(m_innerViewportContainerLayer.get());
|
| + m_innerViewportContainerLayer->addChild(m_overscrollElasticityLayer.get());
|
| + m_overscrollElasticityLayer->addChild(m_pageScaleLayer.get());
|
| + m_pageScaleLayer->addChild(m_innerViewportScrollLayer.get());
|
| +
|
| + // Ensure this class is set as the scroll layer's ScrollableArea.
|
| + coordinator->scrollableAreaScrollLayerDidChange(this);
|
| +
|
| + initializeScrollbars();
|
| +}
|
| +
|
| +void VisualViewport::attachLayerTree(GraphicsLayer* currentLayerTreeRoot) {
|
| + TRACE_EVENT1("blink", "VisualViewport::attachLayerTree",
|
| "currentLayerTreeRoot", (bool)currentLayerTreeRoot);
|
| if (!currentLayerTreeRoot) {
|
| if (m_innerViewportScrollLayer)
|
| @@ -354,53 +381,7 @@ void VisualViewport::attachToLayerTree(GraphicsLayer* currentLayerTreeRoot) {
|
| currentLayerTreeRoot->parent() == m_innerViewportScrollLayer.get())
|
| return;
|
|
|
| - if (!m_innerViewportScrollLayer) {
|
| - ASSERT(!m_overlayScrollbarHorizontal && !m_overlayScrollbarVertical &&
|
| - !m_overscrollElasticityLayer && !m_pageScaleLayer &&
|
| - !m_innerViewportContainerLayer);
|
| -
|
| - // FIXME: The root transform layer should only be created on demand.
|
| - m_rootTransformLayer = GraphicsLayer::create(this);
|
| - m_innerViewportContainerLayer = GraphicsLayer::create(this);
|
| - m_overscrollElasticityLayer = GraphicsLayer::create(this);
|
| - m_pageScaleLayer = GraphicsLayer::create(this);
|
| - m_innerViewportScrollLayer = GraphicsLayer::create(this);
|
| - m_overlayScrollbarHorizontal = GraphicsLayer::create(this);
|
| - m_overlayScrollbarVertical = GraphicsLayer::create(this);
|
| -
|
| - ScrollingCoordinator* coordinator =
|
| - frameHost().page().scrollingCoordinator();
|
| - ASSERT(coordinator);
|
| - coordinator->setLayerIsContainerForFixedPositionLayers(
|
| - m_innerViewportScrollLayer.get(), true);
|
| -
|
| - // Set masks to bounds so the compositor doesn't clobber a manually
|
| - // set inner viewport container layer size.
|
| - m_innerViewportContainerLayer->setMasksToBounds(
|
| - frameHost().page().settings().getMainFrameClipsContent());
|
| - m_innerViewportContainerLayer->setSize(FloatSize(m_size));
|
| -
|
| - m_innerViewportScrollLayer->platformLayer()->setScrollClipLayer(
|
| - m_innerViewportContainerLayer->platformLayer());
|
| - m_innerViewportScrollLayer->platformLayer()->setUserScrollable(true, true);
|
| - if (mainFrame()) {
|
| - if (Document* document = mainFrame()->document()) {
|
| - m_innerViewportScrollLayer->setElementId(createCompositorElementId(
|
| - DOMNodeIds::idForNode(document), CompositorSubElementId::Viewport));
|
| - }
|
| - }
|
| -
|
| - m_rootTransformLayer->addChild(m_innerViewportContainerLayer.get());
|
| - m_innerViewportContainerLayer->addChild(m_overscrollElasticityLayer.get());
|
| - m_overscrollElasticityLayer->addChild(m_pageScaleLayer.get());
|
| - m_pageScaleLayer->addChild(m_innerViewportScrollLayer.get());
|
| -
|
| - // Ensure this class is set as the scroll layer's ScrollableArea.
|
| - coordinator->scrollableAreaScrollLayerDidChange(this);
|
| -
|
| - initializeScrollbars();
|
| - }
|
| -
|
| + DCHECK(m_innerViewportScrollLayer);
|
| m_innerViewportScrollLayer->removeAllChildren();
|
| m_innerViewportScrollLayer->addChild(currentLayerTreeRoot);
|
| }
|
|
|