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