1591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch/*
2591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * Copyright (C) 2013 Google Inc. All rights reserved.
3591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch *
4591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * Redistribution and use in source and binary forms, with or without
5591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * modification, are permitted provided that the following conditions are
6591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * met:
7591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch *
8591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch *     * Redistributions of source code must retain the above copyright
9591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * notice, this list of conditions and the following disclaimer.
10591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch *     * Redistributions in binary form must reproduce the above
11591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * copyright notice, this list of conditions and the following disclaimer
12591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * in the documentation and/or other materials provided with the
13591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * distribution.
14591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch *     * Neither the name of Google Inc. nor the names of its
15591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * contributors may be used to endorse or promote products derived from
16591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * this software without specific prior written permission.
17591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch *
18591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch */
30591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
31591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "config.h"
325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/frame/PinchViewport.h"
33591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
34d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/FrameHost.h"
351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/FrameView.h"
36d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h"
37d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/Settings.h"
38d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/page/Chrome.h"
39d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/page/ChromeClient.h"
40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/page/Page.h"
419bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/page/scrolling/ScrollingCoordinator.h"
42d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/RenderView.h"
43d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/compositing/RenderLayerCompositor.h"
44d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "platform/TraceEvent.h"
451e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/FloatSize.h"
46a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsLayer.h"
47d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "platform/graphics/GraphicsLayerFactory.h"
48a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/Scrollbar.h"
497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/scroll/ScrollbarTheme.h"
50591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "public/platform/Platform.h"
51591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "public/platform/WebCompositorSupport.h"
529bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "public/platform/WebLayer.h"
53591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "public/platform/WebLayerTreeView.h"
54d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "public/platform/WebScrollbar.h"
55591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "public/platform/WebScrollbarLayer.h"
56591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
57d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)using blink::WebLayer;
58d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)using blink::WebLayerTreeView;
59d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)using blink::WebScrollbar;
60d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)using blink::WebScrollbarLayer;
61c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using blink::FrameHost;
62c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using blink::GraphicsLayer;
63c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using blink::GraphicsLayerFactory;
64591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
65c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
66591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
67d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PinchViewport::PinchViewport(FrameHost& owner)
6807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    : m_frameHost(owner)
6910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    , m_scale(1)
70591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
71d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    reset();
72591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
73591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
74d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PinchViewport::~PinchViewport() { }
75591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
7610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid PinchViewport::setSize(const IntSize& size)
77591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
78323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (m_size == size)
7910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        return;
8010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
81197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    TRACE_EVENT2("blink", "PinchViewport::setSize", "width", size.width(), "height", size.height());
82323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    m_size = size;
8310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
8410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // Make sure we clamp the offset to within the new bounds.
8510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    setLocation(m_offset);
86591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
87d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (m_innerViewportContainerLayer) {
88d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_innerViewportContainerLayer->setSize(m_size);
89d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
90d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        // Need to re-compute sizes for the overlay scrollbars.
91d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        setupScrollbar(WebScrollbar::Horizontal);
92d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        setupScrollbar(WebScrollbar::Vertical);
93d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    }
94d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
95d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
96d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void PinchViewport::reset()
97d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
98d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    setLocation(FloatPoint());
99d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    setScale(1);
100591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
101591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
10210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid PinchViewport::mainFrameDidChangeSize()
10307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
104197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    TRACE_EVENT0("blink", "PinchViewport::mainFrameDidChangeSize");
105d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
10610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // In unit tests we may not have initialized the layer tree.
10710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (m_innerViewportScrollLayer)
10810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        m_innerViewportScrollLayer->setSize(contentsSize());
10910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
11010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // Make sure the viewport's offset is clamped within the newly sized main frame.
11110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    setLocation(m_offset);
11210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
11307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
11410f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochFloatRect PinchViewport::visibleRect() const
11510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
11610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    FloatSize scaledSize(m_size);
11710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    scaledSize.scale(1 / m_scale);
11810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return FloatRect(m_offset, scaledSize);
11910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
12007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
121f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)FloatRect PinchViewport::visibleRectInDocument() const
122f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
123f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    if (!mainFrame() || !mainFrame()->view())
124f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        return FloatRect();
125f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
126f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    FloatRect viewRect = mainFrame()->view()->visibleContentRect();
127f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    FloatRect pinchRect = visibleRect();
128f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    pinchRect.moveBy(viewRect.location());
129f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    return pinchRect;
130f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
131f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
132f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void PinchViewport::scrollIntoView(const FloatRect& rect)
133f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
134f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    if (!mainFrame() || !mainFrame()->view())
135f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        return;
136f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
137f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    FrameView* view = mainFrame()->view();
138f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
139f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    float centeringOffsetX = (visibleRect().width() - rect.width()) / 2;
140f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    float centeringOffsetY = (visibleRect().height() - rect.height()) / 2;
141f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
142f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    FloatPoint targetOffset(
143f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        rect.x() - centeringOffsetX - visibleRect().x(),
144f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        rect.y() - centeringOffsetY - visibleRect().y());
145f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
146f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    view->setScrollPosition(flooredIntPoint(targetOffset));
147f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
148f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    FloatPoint remainder = FloatPoint(targetOffset - view->scrollPosition());
149f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    move(remainder);
150f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
151f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
15210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid PinchViewport::setLocation(const FloatPoint& newLocation)
15310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
15410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    FloatPoint clampedOffset(clampOffsetToBoundaries(newLocation));
15510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
15610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (clampedOffset == m_offset)
15710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        return;
15810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
15910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    m_offset = clampedOffset;
16007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
16107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ScrollingCoordinator* coordinator = m_frameHost.page().scrollingCoordinator();
16207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ASSERT(coordinator);
16307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    coordinator->scrollableAreaScrollLayerDidChange(this);
164d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
165d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    mainFrame()->loader().saveScrollState();
166d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
167d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
168d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void PinchViewport::move(const FloatPoint& delta)
169d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
170d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    setLocation(m_offset + delta);
17107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
17207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
17310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid PinchViewport::setScale(float scale)
17410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
175d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (scale == m_scale)
176d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return;
177d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
17810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    m_scale = scale;
17910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
180d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (mainFrame())
181d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        mainFrame()->loader().saveScrollState();
182d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
18310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // Old-style pinch sets scale here but we shouldn't call into the
18410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // clamping code below.
18510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (!m_innerViewportScrollLayer)
18610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        return;
18710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
18810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // Ensure we clamp so we remain within the bounds.
18910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    setLocation(visibleRect().location());
190d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
191d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // TODO: We should probably be calling scaleDidChange type functions here.
192d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // see Page::setPageScaleFactor.
19310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
19410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
195591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch// Modifies the top of the graphics layer tree to add layers needed to support
196591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch// the inner/outer viewport fixed-position model for pinch zoom. When finished,
197591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch// the tree will look like this (with * denoting added layers):
198591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch//
199f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)// *rootTransformLayer
200f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)//  +- *innerViewportContainerLayer (fixed pos container)
201f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)//      +- *pageScaleLayer
202f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)//  |       +- *innerViewportScrollLayer
203f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)//  |           +-- overflowControlsHostLayer (root layer)
204d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)//  |               +-- outerViewportContainerLayer (fixed pos container) [frame container layer in RenderLayerCompositor]
205d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)//  |               |   +-- outerViewportScrollLayer [frame scroll layer in RenderLayerCompositor]
206d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)//  |               |       +-- content layers ...
207d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)//  |               +-- horizontal ScrollbarLayer (non-overlay)
208d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)//  |               +-- verticalScrollbarLayer (non-overlay)
209d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)//  |               +-- scroll corner (non-overlay)
210591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch//  +- *horizontalScrollbarLayer (overlay)
211591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch//  +- *verticalScrollbarLayer (overlay)
212591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch//
213d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void PinchViewport::attachToLayerTree(GraphicsLayer* currentLayerTreeRoot, GraphicsLayerFactory* graphicsLayerFactory)
214591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
215197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    TRACE_EVENT1("blink", "PinchViewport::attachToLayerTree", "currentLayerTreeRoot", (bool)currentLayerTreeRoot);
216d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!currentLayerTreeRoot) {
217591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        m_innerViewportScrollLayer->removeAllChildren();
218591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return;
219591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    }
220591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
221d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (currentLayerTreeRoot->parent() && currentLayerTreeRoot->parent() == m_innerViewportScrollLayer)
222591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return;
223591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
224d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_innerViewportScrollLayer) {
225d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        ASSERT(!m_overlayScrollbarHorizontal
226d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            && !m_overlayScrollbarVertical
227d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            && !m_pageScaleLayer
228d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            && !m_innerViewportContainerLayer);
229d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
230f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        // FIXME: The root transform layer should only be created on demand.
231f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        m_rootTransformLayer = GraphicsLayer::create(graphicsLayerFactory, this);
232d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_innerViewportContainerLayer = GraphicsLayer::create(graphicsLayerFactory, this);
233d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_pageScaleLayer = GraphicsLayer::create(graphicsLayerFactory, this);
234d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_innerViewportScrollLayer = GraphicsLayer::create(graphicsLayerFactory, this);
235d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_overlayScrollbarHorizontal = GraphicsLayer::create(graphicsLayerFactory, this);
236d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_overlayScrollbarVertical = GraphicsLayer::create(graphicsLayerFactory, this);
237d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
238c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        blink::ScrollingCoordinator* coordinator = m_frameHost.page().scrollingCoordinator();
239d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        ASSERT(coordinator);
240d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        coordinator->setLayerIsContainerForFixedPositionLayers(m_innerViewportScrollLayer.get(), true);
241d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
242f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        // Set masks to bounds so the compositor doesn't clobber a manually
243f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        // set inner viewport container layer size.
244f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        m_innerViewportContainerLayer->setMasksToBounds(m_frameHost.settings().mainFrameClipsContent());
245d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_innerViewportContainerLayer->setSize(m_size);
246d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
247d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_innerViewportScrollLayer->platformLayer()->setScrollClipLayer(
248d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            m_innerViewportContainerLayer->platformLayer());
249d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_innerViewportScrollLayer->platformLayer()->setUserScrollable(true, true);
250d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
251f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        m_rootTransformLayer->addChild(m_innerViewportContainerLayer.get());
252d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_innerViewportContainerLayer->addChild(m_pageScaleLayer.get());
253d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_pageScaleLayer->addChild(m_innerViewportScrollLayer.get());
254d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_innerViewportContainerLayer->addChild(m_overlayScrollbarHorizontal.get());
255d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_innerViewportContainerLayer->addChild(m_overlayScrollbarVertical.get());
256d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
257f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        // Ensure this class is set as the scroll layer's ScrollableArea.
25807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        coordinator->scrollableAreaScrollLayerDidChange(this);
25907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
260d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // Setup the inner viewport overlay scrollbars.
261d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        setupScrollbar(WebScrollbar::Horizontal);
262d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        setupScrollbar(WebScrollbar::Vertical);
263d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
264d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
265d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_innerViewportScrollLayer->removeAllChildren();
266d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_innerViewportScrollLayer->addChild(currentLayerTreeRoot);
267591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
268591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
269d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void PinchViewport::setupScrollbar(WebScrollbar::Orientation orientation)
270591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
271591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    bool isHorizontal = orientation == WebScrollbar::Horizontal;
272591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    GraphicsLayer* scrollbarGraphicsLayer = isHorizontal ?
273591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        m_overlayScrollbarHorizontal.get() : m_overlayScrollbarVertical.get();
2749bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    OwnPtr<WebScrollbarLayer>& webScrollbarLayer = isHorizontal ?
2759bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        m_webOverlayScrollbarHorizontal : m_webOverlayScrollbarVertical;
276591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
2777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    int thumbThickness = m_frameHost.settings().pinchOverlayScrollbarThickness();
2787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    int scrollbarThickness = thumbThickness;
2797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // FIXME: Rather than manually creating scrollbar layers, we should create
2817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // real scrollbars so we can reuse all the machinery from ScrollbarTheme.
2827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#if OS(ANDROID)
2837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    thumbThickness = ScrollbarTheme::theme()->thumbThickness(0);
2847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    scrollbarThickness = ScrollbarTheme::theme()->scrollbarThickness(RegularScrollbar);
2857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#endif
286591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
2879bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!webScrollbarLayer) {
28807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        ScrollingCoordinator* coordinator = m_frameHost.page().scrollingCoordinator();
2899bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        ASSERT(coordinator);
29007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        ScrollbarOrientation webcoreOrientation = isHorizontal ? HorizontalScrollbar : VerticalScrollbar;
2917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        webScrollbarLayer = coordinator->createSolidColorScrollbarLayer(webcoreOrientation, thumbThickness, 0, false);
2929bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
29309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        webScrollbarLayer->setClipLayer(m_innerViewportContainerLayer->platformLayer());
2949bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        scrollbarGraphicsLayer->setContentsToPlatformLayer(webScrollbarLayer->layer());
2959bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        scrollbarGraphicsLayer->setDrawsContent(false);
2969bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
2979bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
2987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    int xPosition = isHorizontal ? 0 : m_innerViewportContainerLayer->size().width() - scrollbarThickness;
2997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    int yPosition = isHorizontal ? m_innerViewportContainerLayer->size().height() - scrollbarThickness : 0;
3007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    int width = isHorizontal ? m_innerViewportContainerLayer->size().width() - scrollbarThickness : scrollbarThickness;
3017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    int height = isHorizontal ? scrollbarThickness : m_innerViewportContainerLayer->size().height() - scrollbarThickness;
302591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
30309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Use the GraphicsLayer to position the scrollbars.
30407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    scrollbarGraphicsLayer->setPosition(IntPoint(xPosition, yPosition));
30507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    scrollbarGraphicsLayer->setSize(IntSize(width, height));
30607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    scrollbarGraphicsLayer->setContentsRect(IntRect(0, 0, width, height));
307591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
308591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
30907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid PinchViewport::registerLayersWithTreeView(WebLayerTreeView* layerTreeView) const
310591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
311197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    TRACE_EVENT0("blink", "PinchViewport::registerLayersWithTreeView");
3129bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    ASSERT(layerTreeView);
31307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ASSERT(m_frameHost.page().mainFrame());
3145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    ASSERT(m_frameHost.page().mainFrame()->isLocalFrame());
3155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    ASSERT(m_frameHost.page().deprecatedLocalMainFrame()->contentRenderer());
316591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
3175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RenderLayerCompositor* compositor = m_frameHost.page().deprecatedLocalMainFrame()->contentRenderer()->compositor();
31809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Get the outer viewport scroll layer.
31909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    WebLayer* scrollLayer = compositor->scrollLayer()->platformLayer();
32009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
32109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_webOverlayScrollbarHorizontal->setScrollLayer(scrollLayer);
32209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_webOverlayScrollbarVertical->setScrollLayer(scrollLayer);
3239bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
324591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    ASSERT(compositor);
3259bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    layerTreeView->registerViewportLayers(
326591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        m_pageScaleLayer->platformLayer(),
327591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        m_innerViewportScrollLayer->platformLayer(),
32809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        scrollLayer);
329591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
330591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
33107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid PinchViewport::clearLayersForTreeView(WebLayerTreeView* layerTreeView) const
332591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
3339bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    ASSERT(layerTreeView);
334591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
3359bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    layerTreeView->clearViewportLayers();
336591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
337591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
33807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochint PinchViewport::scrollSize(ScrollbarOrientation orientation) const
33907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
34007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IntSize scrollDimensions = maximumScrollPosition() - minimumScrollPosition();
34107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return (orientation == HorizontalScrollbar) ? scrollDimensions.width() : scrollDimensions.height();
34207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
34307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
34407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochIntPoint PinchViewport::minimumScrollPosition() const
34507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
34607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return IntPoint();
34707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
34807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
34907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochIntPoint PinchViewport::maximumScrollPosition() const
35007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
35110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return flooredIntPoint(FloatSize(contentsSize()) - visibleRect().size());
35207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
35307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
35407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochIntRect PinchViewport::scrollableAreaBoundingBox() const
35507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
35607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // This method should return the bounding box in the parent view's coordinate
35707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // space; however, PinchViewport technically isn't a child of any Frames.
35807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // Nonetheless, the PinchViewport always occupies the entire main frame so just
35907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // return that.
36010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    LocalFrame* frame = mainFrame();
36107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
36207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (!frame || !frame->view())
36307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return IntRect();
36407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
36507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return frame->view()->frameRect();
36607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
36707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
36807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochIntSize PinchViewport::contentsSize() const
36907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
37010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    LocalFrame* frame = mainFrame();
37107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
37207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (!frame || !frame->view())
37307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return IntSize();
37407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
37510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    ASSERT(frame->view()->visibleContentScaleFactor() == 1);
37610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return frame->view()->visibleContentRect(IncludeScrollbars).size();
37707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
37807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
37907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid PinchViewport::invalidateScrollbarRect(Scrollbar*, const IntRect&)
38007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
38107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // Do nothing. Pinch scrollbars live on the compositor thread and will
38207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // be updated when the viewport is synced to the CC.
38307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
38407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
38507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid PinchViewport::setScrollOffset(const IntPoint& offset)
38607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
38707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setLocation(offset);
38807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
38907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
39007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochGraphicsLayer* PinchViewport::layerForContainer() const
39107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
39207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return m_innerViewportContainerLayer.get();
39307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
39407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
39507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochGraphicsLayer* PinchViewport::layerForScrolling() const
39607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
39707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return m_innerViewportScrollLayer.get();
39807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
39907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
40007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochGraphicsLayer* PinchViewport::layerForHorizontalScrollbar() const
40107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
40207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return m_overlayScrollbarHorizontal.get();
40307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
40407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
40507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochGraphicsLayer* PinchViewport::layerForVerticalScrollbar() const
40607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
40707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return m_overlayScrollbarVertical.get();
40807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
40907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
410d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void PinchViewport::notifyAnimationStarted(const GraphicsLayer*, double monotonicTime)
411591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
412591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
413591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
41407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid PinchViewport::paintContents(const GraphicsLayer*, GraphicsContext&, GraphicsLayerPaintingPhase, const IntRect& inClip)
415591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
416591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
417591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
41810f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochLocalFrame* PinchViewport::mainFrame() const
41910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
4205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return m_frameHost.page().mainFrame() && m_frameHost.page().mainFrame()->isLocalFrame() ? m_frameHost.page().deprecatedLocalMainFrame() : 0;
42110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
42210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
42310f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochFloatPoint PinchViewport::clampOffsetToBoundaries(const FloatPoint& offset)
42410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
42510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    FloatPoint clampedOffset(offset);
42610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    clampedOffset = clampedOffset.shrunkTo(FloatPoint(maximumScrollPosition()));
42710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    clampedOffset = clampedOffset.expandedTo(FloatPoint(minimumScrollPosition()));
42810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return clampedOffset;
42910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
43010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
431d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)String PinchViewport::debugName(const GraphicsLayer* graphicsLayer)
432e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
433e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    String name;
434e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (graphicsLayer == m_innerViewportContainerLayer.get()) {
435e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        name = "Inner Viewport Container Layer";
436e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    } else if (graphicsLayer == m_pageScaleLayer.get()) {
437e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        name =  "Page Scale Layer";
438e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    } else if (graphicsLayer == m_innerViewportScrollLayer.get()) {
439e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        name =  "Inner Viewport Scroll Layer";
440e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    } else if (graphicsLayer == m_overlayScrollbarHorizontal.get()) {
441e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        name =  "Overlay Scrollbar Horizontal Layer";
442e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    } else if (graphicsLayer == m_overlayScrollbarVertical.get()) {
443e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        name =  "Overlay Scrollbar Vertical Layer";
444e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    } else {
445e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        ASSERT_NOT_REACHED();
446e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
447e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
448e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return name;
449e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
450e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
451c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
452