18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ScrollView.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29cad810f21b803229eb11403f9209855525a25d57Steve Block#include "AXObjectCache.h"
30a3d6f6aedc8ed044682d65258bb964c64fc7511bNicolas Roard#if PLATFORM(ANDROID)
31a3d6f6aedc8ed044682d65258bb964c64fc7511bNicolas Roard#include "FrameView.h"
329a8423b643a8ce99e5642f2548600f9125382e89John Reck#include "GraphicsLayerAndroid.h"
339a8423b643a8ce99e5642f2548600f9125382e89John Reck#include "RenderLayer.h"
349a8423b643a8ce99e5642f2548600f9125382e89John Reck#include "RenderLayerBacking.h"
359a8423b643a8ce99e5642f2548600f9125382e89John Reck#include "RenderView.h"
36a3d6f6aedc8ed044682d65258bb964c64fc7511bNicolas Roard#endif
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h"
382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "GraphicsLayer.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HostWindow.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformMouseEvent.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformWheelEvent.h"
422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "ScrollAnimator.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Scrollbar.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ScrollbarTheme.h"
45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/StdLibExtras.h>
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
472fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockusing namespace std;
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectScrollView::ScrollView()
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_horizontalScrollbarMode(ScrollbarAuto)
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_verticalScrollbarMode(ScrollbarAuto)
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_horizontalScrollbarLock(false)
55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_verticalScrollbarLock(false)
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_prohibitsScrolling(false)
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_canBlitOnScroll(true)
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_scrollbarsAvoidingResizer(0)
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_scrollbarsSuppressed(false)
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_inUpdateScrollbars(false)
615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    , m_updateScrollbarsPass(0)
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_drawPanScrollIcon(false)
63635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    , m_useFixedLayout(false)
64643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_paintsEntireContents(false)
65cad810f21b803229eb11403f9209855525a25d57Steve Block    , m_clipsRepaints(true)
664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    , m_delegatesScrolling(false)
672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_containsScrollableAreaWithOverlayScrollbars(false)
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    platformInit();
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectScrollView::~ScrollView()
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    platformDestroy();
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid ScrollView::addChild(PassRefPtr<Widget> prpChild)
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Widget* child = prpChild.get();
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(child != this && !child->parent());
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    child->setParent(this);
820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_children.add(prpChild);
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (child->platformWidget())
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        platformAddChild(child);
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::removeChild(Widget* child)
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(child->parent() == this);
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    child->setParent(0);
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_children.remove(child);
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (child->platformWidget())
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        platformRemoveChild(child);
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::setHasHorizontalScrollbar(bool hasBar)
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (hasBar && avoidScrollbarCreation())
99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (hasBar && !m_horizontalScrollbar) {
102635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_horizontalScrollbar = createScrollbar(HorizontalScrollbar);
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addChild(m_horizontalScrollbar.get());
10481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        didAddHorizontalScrollbar(m_horizontalScrollbar.get());
105231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_horizontalScrollbar->styleChanged();
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (!hasBar && m_horizontalScrollbar) {
10781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        willRemoveHorizontalScrollbar(m_horizontalScrollbar.get());
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        removeChild(m_horizontalScrollbar.get());
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_horizontalScrollbar = 0;
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
111cad810f21b803229eb11403f9209855525a25d57Steve Block
112cad810f21b803229eb11403f9209855525a25d57Steve Block    if (AXObjectCache::accessibilityEnabled() && axObjectCache())
113cad810f21b803229eb11403f9209855525a25d57Steve Block        axObjectCache()->handleScrollbarUpdate(this);
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::setHasVerticalScrollbar(bool hasBar)
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (hasBar && avoidScrollbarCreation())
119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (hasBar && !m_verticalScrollbar) {
122635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_verticalScrollbar = createScrollbar(VerticalScrollbar);
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addChild(m_verticalScrollbar.get());
12481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        didAddVerticalScrollbar(m_verticalScrollbar.get());
125231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_verticalScrollbar->styleChanged();
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (!hasBar && m_verticalScrollbar) {
12781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        willRemoveVerticalScrollbar(m_verticalScrollbar.get());
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        removeChild(m_verticalScrollbar.get());
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_verticalScrollbar = 0;
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
131cad810f21b803229eb11403f9209855525a25d57Steve Block
132cad810f21b803229eb11403f9209855525a25d57Steve Block    if (AXObjectCache::accessibilityEnabled() && axObjectCache())
133cad810f21b803229eb11403f9209855525a25d57Steve Block        axObjectCache()->handleScrollbarUpdate(this);
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1362bde8e466a4451c7319e3a072d118917957d6554Steve Block#if !USE(NATIVE_GTK_MAIN_FRAME_SCROLLBAR)
137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectPassRefPtr<Scrollbar> ScrollView::createScrollbar(ScrollbarOrientation orientation)
138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
139635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return Scrollbar::createNativeScrollbar(this, orientation, RegularScrollbar);
140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
141635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ScrollView::setScrollbarModes(ScrollbarMode horizontalMode, ScrollbarMode verticalMode,
143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                                   bool horizontalLock, bool verticalLock)
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool needsUpdate = false;
146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (horizontalMode != horizontalScrollbarMode() && !m_horizontalScrollbarLock) {
148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_horizontalScrollbarMode = horizontalMode;
149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        needsUpdate = true;
150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (verticalMode != verticalScrollbarMode() && !m_verticalScrollbarLock) {
153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_verticalScrollbarMode = verticalMode;
154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        needsUpdate = true;
155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (horizontalLock)
158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        setHorizontalScrollbarLock();
159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (verticalLock)
161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        setVerticalScrollbarLock();
162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
163dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!needsUpdate)
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (platformWidget())
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        platformSetScrollbarModes();
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        updateScrollbars(scrollOffset());
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
171231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::scrollbarModes(ScrollbarMode& horizontalMode, ScrollbarMode& verticalMode) const
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (platformWidget()) {
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        platformScrollbarModes(horizontalMode, verticalMode);
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    horizontalMode = m_horizontalScrollbarMode;
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verticalMode = m_verticalScrollbarMode;
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::setCanHaveScrollbars(bool canScroll)
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScrollbarMode newHorizontalMode;
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScrollbarMode newVerticalMode;
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    scrollbarModes(newHorizontalMode, newVerticalMode);
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (canScroll && newVerticalMode == ScrollbarAlwaysOff)
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        newVerticalMode = ScrollbarAuto;
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (!canScroll)
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        newVerticalMode = ScrollbarAlwaysOff;
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (canScroll && newHorizontalMode == ScrollbarAlwaysOff)
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        newHorizontalMode = ScrollbarAuto;
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (!canScroll)
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        newHorizontalMode = ScrollbarAlwaysOff;
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setScrollbarModes(newHorizontalMode, newVerticalMode);
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::setCanBlitOnScroll(bool b)
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
205635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (platformWidget()) {
206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        platformSetCanBlitOnScroll(b);
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
208635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
209635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_canBlitOnScroll = b;
211635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
212635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
213635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool ScrollView::canBlitOnScroll() const
214635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (platformWidget())
216635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return platformCanBlitOnScroll();
217635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
218635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return m_canBlitOnScroll;
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
221643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ScrollView::setPaintsEntireContents(bool paintsEntireContents)
222643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
223643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_paintsEntireContents = paintsEntireContents;
224643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
225643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
226cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid ScrollView::setClipsRepaints(bool clipsRepaints)
227cad810f21b803229eb11403f9209855525a25d57Steve Block{
228cad810f21b803229eb11403f9209855525a25d57Steve Block    m_clipsRepaints = clipsRepaints;
229cad810f21b803229eb11403f9209855525a25d57Steve Block}
230cad810f21b803229eb11403f9209855525a25d57Steve Block
2314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid ScrollView::setDelegatesScrolling(bool delegatesScrolling)
2324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
2334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    m_delegatesScrolling = delegatesScrolling;
2344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
2354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
2362bde8e466a4451c7319e3a072d118917957d6554Steve Block#if !USE(NATIVE_GTK_MAIN_FRAME_SCROLLBAR)
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect ScrollView::visibleContentRect(bool includeScrollbars) const
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (platformWidget())
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return platformVisibleContentRect(includeScrollbars);
2416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
2426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (paintsEntireContents())
2436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return IntRect(IntPoint(0, 0), contentsSize());
2446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
24581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    int verticalScrollbarWidth = verticalScrollbar() && !verticalScrollbar()->isOverlayScrollbar()
24681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        && !includeScrollbars ? verticalScrollbar()->width() : 0;
24781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    int horizontalScrollbarHeight = horizontalScrollbar() && !horizontalScrollbar()->isOverlayScrollbar()
24881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        && !includeScrollbars ? horizontalScrollbar()->height() : 0;
249ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return IntRect(IntPoint(m_scrollOffset.width(), m_scrollOffset.height()),
25181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                   IntSize(max(0, m_boundsSize.width() - verticalScrollbarWidth),
25281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                           max(0, m_boundsSize.height() - horizontalScrollbarHeight)));
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
256635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectint ScrollView::layoutWidth() const
257635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
258635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return m_fixedLayoutSize.isEmpty() || !m_useFixedLayout ? visibleWidth() : m_fixedLayoutSize.width();
259635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
260635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
261635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectint ScrollView::layoutHeight() const
262635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
263635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return m_fixedLayoutSize.isEmpty() || !m_useFixedLayout ? visibleHeight() : m_fixedLayoutSize.height();
264635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
265635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
266635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectIntSize ScrollView::fixedLayoutSize() const
267635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
268635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return m_fixedLayoutSize;
269635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
270635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
271635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid ScrollView::setFixedLayoutSize(const IntSize& newSize)
272635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
273635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (fixedLayoutSize() == newSize)
274635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
275635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_fixedLayoutSize = newSize;
276635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    updateScrollbars(scrollOffset());
277635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
278635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
279635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool ScrollView::useFixedLayout() const
280635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
281635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return m_useFixedLayout;
282635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
283635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
284635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid ScrollView::setUseFixedLayout(bool enable)
285635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
286635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (useFixedLayout() == enable)
287635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
288635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_useFixedLayout = enable;
289635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    updateScrollbars(scrollOffset());
290635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
291635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntSize ScrollView::contentsSize() const
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (platformWidget())
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return platformContentsSize();
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_contentsSize;
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::setContentsSize(const IntSize& newSize)
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (contentsSize() == newSize)
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_contentsSize = newSize;
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (platformWidget())
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        platformSetContentsSize();
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        updateScrollbars(scrollOffset());
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
310a551d0e188b3b4a05e05cc70ff0838c3165c10f6Grace Kloba#if PLATFORM(ANDROID)
311541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiwareint ScrollView::actualWidth() const {
312541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiware    if (platformWidget())
313541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiware        return platformActualWidth();
314541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiware    return width();
315541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiware}
316541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiware
317541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiwareint ScrollView::actualHeight() const {
318541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiware    if (platformWidget())
319541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiware        return platformActualHeight();
320541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiware    return height();
321541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiware}
322541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiware
323541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiwareint ScrollView::actualScrollX() const {
324541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiware    if (platformWidget())
325541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiware        return platformActualScrollX();
326541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiware    return scrollX();
327541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiware}
328541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiware
329541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiwareint ScrollView::actualScrollY() const {
330541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiware    if (platformWidget())
331541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiware        return platformActualScrollY();
332541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiware    return scrollY();
333541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiware}
334541af8dff4d592277d0f835deafaf728dad8bc57Mangesh Ghiware
335a3d6f6aedc8ed044682d65258bb964c64fc7511bNicolas RoardFrameView* ScrollView::frameView() {
336a3d6f6aedc8ed044682d65258bb964c64fc7511bNicolas Roard    if (this->isFrameView()) {
337a3d6f6aedc8ed044682d65258bb964c64fc7511bNicolas Roard        FrameView* frameView = reinterpret_cast<FrameView*>(this);
338a3d6f6aedc8ed044682d65258bb964c64fc7511bNicolas Roard        return frameView;
339a3d6f6aedc8ed044682d65258bb964c64fc7511bNicolas Roard    }
340a3d6f6aedc8ed044682d65258bb964c64fc7511bNicolas Roard    return 0;
341a3d6f6aedc8ed044682d65258bb964c64fc7511bNicolas Roard}
342a551d0e188b3b4a05e05cc70ff0838c3165c10f6Grace Kloba#endif
343a551d0e188b3b4a05e05cc70ff0838c3165c10f6Grace Kloba
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntPoint ScrollView::maximumScrollPosition() const
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
346f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    IntPoint maximumOffset(contentsWidth() - visibleWidth() - m_scrollOrigin.x(), contentsHeight() - visibleHeight() - m_scrollOrigin.y());
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    maximumOffset.clampNegativeToZero();
3484a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    return maximumOffset;
3494a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch}
3504a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch
3514a156157940f51b91eadd76f6c86f862ec0a1da0Ben MurdochIntPoint ScrollView::minimumScrollPosition() const
3524a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch{
353f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return IntPoint(-m_scrollOrigin.x(), -m_scrollOrigin.y());
3544a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch}
3554a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch
3564a156157940f51b91eadd76f6c86f862ec0a1da0Ben MurdochIntPoint ScrollView::adjustScrollPositionWithinRange(const IntPoint& scrollPoint) const
3574a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch{
3584a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    IntPoint newScrollPosition = scrollPoint.shrunkTo(maximumScrollPosition());
3594a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    newScrollPosition = newScrollPosition.expandedTo(minimumScrollPosition());
3604a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    return newScrollPosition;
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickint ScrollView::scrollSize(ScrollbarOrientation orientation) const
3645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
3655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    Scrollbar* scrollbar = ((orientation == HorizontalScrollbar) ? m_horizontalScrollbar : m_verticalScrollbar).get();
3665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return scrollbar ? (scrollbar->totalSize() - scrollbar->visibleSize()) : 0;
3675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
3685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
3692fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid ScrollView::didCompleteRubberBand(const IntSize&) const
3702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3732bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid ScrollView::notifyPageThatContentAreaWillPaint() const
3742bde8e466a4451c7319e3a072d118917957d6554Steve Block{
3752bde8e466a4451c7319e3a072d118917957d6554Steve Block}
3762bde8e466a4451c7319e3a072d118917957d6554Steve Block
377ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid ScrollView::setScrollOffset(const IntPoint& offset)
3785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
3792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    int horizontalOffset = offset.x();
3802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    int verticalOffset = offset.y();
3812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (constrainsScrollingToContentEdge()) {
3822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        horizontalOffset = max(min(horizontalOffset, contentsWidth() - visibleWidth()), 0);
3832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        verticalOffset = max(min(verticalOffset, contentsHeight() - visibleHeight()), 0);
3842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
3855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntSize newOffset = m_scrollOffset;
387ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    newOffset.setWidth(horizontalOffset - m_scrollOrigin.x());
388ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    newOffset.setHeight(verticalOffset - m_scrollOrigin.y());
389ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
390ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    scrollTo(newOffset);
391ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
393ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid ScrollView::scrollTo(const IntSize& newOffset)
394ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntSize scrollDelta = newOffset - m_scrollOffset;
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (scrollDelta == IntSize())
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_scrollOffset = newOffset;
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4009a8423b643a8ce99e5642f2548600f9125382e89John Reck#if PLATFORM(ANDROID)
4019a8423b643a8ce99e5642f2548600f9125382e89John Reck    if (parent()) {
4029a8423b643a8ce99e5642f2548600f9125382e89John Reck        FrameView* frameView = this->frameView();
4039a8423b643a8ce99e5642f2548600f9125382e89John Reck        // IFrames are composited on a layer, we do not need to repaint them
4049a8423b643a8ce99e5642f2548600f9125382e89John Reck        // when scrolling
4059a8423b643a8ce99e5642f2548600f9125382e89John Reck        if (frameView) {
4069a8423b643a8ce99e5642f2548600f9125382e89John Reck            RenderView* renderer = frameView->frame()->contentRenderer();
4079a8423b643a8ce99e5642f2548600f9125382e89John Reck            if (renderer) {
4089a8423b643a8ce99e5642f2548600f9125382e89John Reck                RenderLayer* layer = renderer->layer();
4099a8423b643a8ce99e5642f2548600f9125382e89John Reck                if (layer->backing()) {
4109a8423b643a8ce99e5642f2548600f9125382e89John Reck                    GraphicsLayerAndroid* backing = static_cast<GraphicsLayerAndroid*>(
4119a8423b643a8ce99e5642f2548600f9125382e89John Reck                        layer->backing()->graphicsLayer());
4129a8423b643a8ce99e5642f2548600f9125382e89John Reck                    backing->updateScrollOffset();
4139a8423b643a8ce99e5642f2548600f9125382e89John Reck                }
4149a8423b643a8ce99e5642f2548600f9125382e89John Reck            }
4159a8423b643a8ce99e5642f2548600f9125382e89John Reck            return;
4169a8423b643a8ce99e5642f2548600f9125382e89John Reck        }
4179a8423b643a8ce99e5642f2548600f9125382e89John Reck    }
4189a8423b643a8ce99e5642f2548600f9125382e89John Reck#endif
4199a8423b643a8ce99e5642f2548600f9125382e89John Reck
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (scrollbarsSuppressed())
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
423f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    repaintFixedElementsAfterScrolling();
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    scrollContents(scrollDelta);
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
427ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochint ScrollView::scrollPosition(Scrollbar* scrollbar) const
42868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
429ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (scrollbar->orientation() == HorizontalScrollbar)
430ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return scrollPosition().x() + m_scrollOrigin.x();
431ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (scrollbar->orientation() == VerticalScrollbar)
432ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return scrollPosition().y() + m_scrollOrigin.y();
433ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return 0;
43468513a70bcd92384395513322f1b801e7bf9c729Steve Block}
43568513a70bcd92384395513322f1b801e7bf9c729Steve Block
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::setScrollPosition(const IntPoint& scrollPoint)
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (prohibitsScrolling())
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (platformWidget()) {
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        platformSetScrollPosition(scrollPoint);
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#if ENABLE(TILED_BACKING_STORE)
44728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (delegatesScrolling()) {
4482bde8e466a4451c7319e3a072d118917957d6554Steve Block        hostWindow()->delegatedScrollRequested(scrollPoint);
4496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!m_actualVisibleContentRect.isEmpty())
4506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            m_actualVisibleContentRect.setLocation(scrollPoint);
45128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        return;
45228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    }
45328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#endif
45428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
4554a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    IntPoint newScrollPosition = adjustScrollPositionWithinRange(scrollPoint);
4566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (newScrollPosition == scrollPosition())
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    updateScrollbars(IntSize(newScrollPosition.x(), newScrollPosition.y()));
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ScrollView::scroll(ScrollDirection direction, ScrollGranularity granularity)
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (platformWidget())
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return platformScroll(direction, granularity);
467ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
468ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return ScrollableArea::scroll(direction, granularity);
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
471f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool ScrollView::logicalScroll(ScrollLogicalDirection direction, ScrollGranularity granularity)
472f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
473f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return scroll(logicalToPhysical(direction, isVerticalDocument(), isFlippedDocument()), granularity);
474f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
475f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
4762fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockIntSize ScrollView::overhangAmount() const
4772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    IntSize stretch;
4792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4802bde8e466a4451c7319e3a072d118917957d6554Steve Block    int physicalScrollY = scrollPosition().y() + m_scrollOrigin.y();
4812bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (physicalScrollY < 0)
4822bde8e466a4451c7319e3a072d118917957d6554Steve Block        stretch.setHeight(physicalScrollY);
4832bde8e466a4451c7319e3a072d118917957d6554Steve Block    else if (physicalScrollY > contentsHeight() - visibleContentRect().height())
4842bde8e466a4451c7319e3a072d118917957d6554Steve Block        stretch.setHeight(physicalScrollY - (contentsHeight() - visibleContentRect().height()));
4852bde8e466a4451c7319e3a072d118917957d6554Steve Block
4862bde8e466a4451c7319e3a072d118917957d6554Steve Block    int physicalScrollX = scrollPosition().x() + m_scrollOrigin.x();
4872bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (physicalScrollX < 0)
4882bde8e466a4451c7319e3a072d118917957d6554Steve Block        stretch.setWidth(physicalScrollX);
4892bde8e466a4451c7319e3a072d118917957d6554Steve Block    else if (physicalScrollX > contentsWidth() - visibleContentRect().width())
4902bde8e466a4451c7319e3a072d118917957d6554Steve Block        stretch.setWidth(physicalScrollX - (contentsWidth() - visibleContentRect().width()));
4912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return stretch;
4932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
495bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid ScrollView::windowResizerRectChanged()
496bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
497bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (platformWidget())
498bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return;
499bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
500bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    updateScrollbars(scrollOffset());
501bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
502bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
5035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic const unsigned cMaxUpdateScrollbarsPass = 2;
5045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::updateScrollbars(const IntSize& desiredOffset)
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (m_inUpdateScrollbars || prohibitsScrolling() || delegatesScrolling() || platformWidget())
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
510231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // If we came in here with the view already needing a layout, then go ahead and do that
511231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // first.  (This will be the common case, e.g., when the page changes due to window resizing for example).
512231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // This layout will not re-enter updateScrollbars and does not count towards our max layout pass total.
513231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!m_scrollbarsSuppressed) {
514231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_inUpdateScrollbars = true;
515231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        visibleContentsResized();
516231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_inUpdateScrollbars = false;
517231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
518231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasHorizontalScrollbar = m_horizontalScrollbar;
5205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    bool hasVerticalScrollbar = m_verticalScrollbar;
5215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
5225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    bool newHasHorizontalScrollbar = hasHorizontalScrollbar;
5235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    bool newHasVerticalScrollbar = hasVerticalScrollbar;
5245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScrollbarMode hScroll = m_horizontalScrollbarMode;
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScrollbarMode vScroll = m_verticalScrollbarMode;
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (hScroll != ScrollbarAuto)
5295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        newHasHorizontalScrollbar = (hScroll == ScrollbarAlwaysOn);
5305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (vScroll != ScrollbarAuto)
5315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        newHasVerticalScrollbar = (vScroll == ScrollbarAlwaysOn);
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (m_scrollbarsSuppressed || (hScroll != ScrollbarAuto && vScroll != ScrollbarAuto)) {
5345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (hasHorizontalScrollbar != newHasHorizontalScrollbar)
5355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            setHasHorizontalScrollbar(newHasHorizontalScrollbar);
5365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (hasVerticalScrollbar != newHasVerticalScrollbar)
5375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            setHasVerticalScrollbar(newHasVerticalScrollbar);
5385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    } else {
5395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        bool sendContentResizedNotification = false;
5405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
5415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        IntSize docSize = contentsSize();
54281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        IntSize frameSize = m_boundsSize;
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (hScroll == ScrollbarAuto) {
5455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            newHasHorizontalScrollbar = docSize.width() > visibleWidth();
5465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            if (newHasHorizontalScrollbar && !m_updateScrollbarsPass && docSize.width() <= frameSize.width() && docSize.height() <= frameSize.height())
5475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                newHasHorizontalScrollbar = false;
5485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
5495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (vScroll == ScrollbarAuto) {
5505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            newHasVerticalScrollbar = docSize.height() > visibleHeight();
5515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            if (newHasVerticalScrollbar && !m_updateScrollbarsPass && docSize.width() <= frameSize.width() && docSize.height() <= frameSize.height())
5525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                newHasVerticalScrollbar = false;
5535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        // If we ever turn one scrollbar off, always turn the other one off too.  Never ever
5565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        // try to both gain/lose a scrollbar in the same pass.
5575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (!newHasHorizontalScrollbar && hasHorizontalScrollbar && vScroll != ScrollbarAlwaysOn)
5585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            newHasVerticalScrollbar = false;
5595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (!newHasVerticalScrollbar && hasVerticalScrollbar && hScroll != ScrollbarAlwaysOn)
5605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            newHasHorizontalScrollbar = false;
5615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
5625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (hasHorizontalScrollbar != newHasHorizontalScrollbar) {
563f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            if (m_scrollOrigin.y() && !newHasHorizontalScrollbar)
564f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                m_scrollOrigin.setY(m_scrollOrigin.y() - m_horizontalScrollbar->height());
5655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            setHasHorizontalScrollbar(newHasHorizontalScrollbar);
5665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            sendContentResizedNotification = true;
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
5685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
5695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (hasVerticalScrollbar != newHasVerticalScrollbar) {
570f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            if (m_scrollOrigin.x() && !newHasVerticalScrollbar)
571f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                m_scrollOrigin.setX(m_scrollOrigin.x() - m_verticalScrollbar->width());
5725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            setHasVerticalScrollbar(newHasVerticalScrollbar);
5735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            sendContentResizedNotification = true;
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (sendContentResizedNotification && m_updateScrollbarsPass < cMaxUpdateScrollbarsPass) {
5775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            m_updateScrollbarsPass++;
5785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            contentsResized();
5795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            visibleContentsResized();
5805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            IntSize newDocSize = contentsSize();
5815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            if (newDocSize == docSize) {
5825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                // The layout with the new scroll state had no impact on
5835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                // the document's overall size, so updateScrollbars didn't get called.
5845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                // Recur manually.
5855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                updateScrollbars(desiredOffset);
5865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            }
5875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            m_updateScrollbarsPass--;
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // Set up the range (and page step/line step), but only do this if we're not in a nested call (to avoid
5925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // doing it multiple times).
5935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (m_updateScrollbarsPass)
5945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return;
5955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
5965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    m_inUpdateScrollbars = true;
5974a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch
5982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    IntPoint scrollPoint = adjustScrollPositionWithinRange(IntPoint(desiredOffset));
5994a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    IntSize scroll(scrollPoint.x(), scrollPoint.y());
6004a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch
6015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (m_horizontalScrollbar) {
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int clientWidth = visibleWidth();
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_horizontalScrollbar->setEnabled(contentsWidth() > clientWidth);
6048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        int pageStep = max(max<int>(clientWidth * Scrollbar::minFractionToStepWhenPaging(), clientWidth - Scrollbar::maxOverlapBetweenPages()), 1);
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        IntRect oldRect(m_horizontalScrollbar->frameRect());
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        IntRect hBarRect = IntRect(0,
60781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                                   m_boundsSize.height() - m_horizontalScrollbar->height(),
60881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                                   m_boundsSize.width() - (m_verticalScrollbar ? m_verticalScrollbar->width() : 0),
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                   m_horizontalScrollbar->height());
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_horizontalScrollbar->setFrameRect(hBarRect);
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_scrollbarsSuppressed && oldRect != m_horizontalScrollbar->frameRect())
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_horizontalScrollbar->invalidate();
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_scrollbarsSuppressed)
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_horizontalScrollbar->setSuppressInvalidation(true);
6168a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        m_horizontalScrollbar->setSteps(Scrollbar::pixelsPerLineStep(), pageStep);
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_horizontalScrollbar->setProportion(clientWidth, contentsWidth());
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_scrollbarsSuppressed)
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_horizontalScrollbar->setSuppressInvalidation(false);
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (m_verticalScrollbar) {
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int clientHeight = visibleHeight();
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_verticalScrollbar->setEnabled(contentsHeight() > clientHeight);
6258a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        int pageStep = max(max<int>(clientHeight * Scrollbar::minFractionToStepWhenPaging(), clientHeight - Scrollbar::maxOverlapBetweenPages()), 1);
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        IntRect oldRect(m_verticalScrollbar->frameRect());
62781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        IntRect vBarRect = IntRect(m_boundsSize.width() - m_verticalScrollbar->width(),
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                   0,
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                   m_verticalScrollbar->width(),
63081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                                   m_boundsSize.height() - (m_horizontalScrollbar ? m_horizontalScrollbar->height() : 0));
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_verticalScrollbar->setFrameRect(vBarRect);
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_scrollbarsSuppressed && oldRect != m_verticalScrollbar->frameRect())
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_verticalScrollbar->invalidate();
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_scrollbarsSuppressed)
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_verticalScrollbar->setSuppressInvalidation(true);
6378a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        m_verticalScrollbar->setSteps(Scrollbar::pixelsPerLineStep(), pageStep);
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_verticalScrollbar->setProportion(clientHeight, contentsHeight());
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_scrollbarsSuppressed)
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_verticalScrollbar->setSuppressInvalidation(false);
6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
643231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (hasHorizontalScrollbar != (m_horizontalScrollbar != 0) || hasVerticalScrollbar != (m_verticalScrollbar != 0)) {
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        frameRectsChanged();
645231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        updateScrollCorner();
646231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
648ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    ScrollableArea::scrollToOffsetWithoutAnimation(FloatPoint(scroll.width() + m_scrollOrigin.x(), scroll.height() + m_scrollOrigin.y()));
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Make sure the scrollbar offsets are up to date.
6512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_horizontalScrollbar)
6522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_horizontalScrollbar->offsetDidChange();
6532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_verticalScrollbar)
6542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_verticalScrollbar->offsetDidChange();
6552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_inUpdateScrollbars = false;
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
659231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockconst int panIconSizeLength = 16;
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::scrollContents(const IntSize& scrollDelta)
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (!hostWindow())
6648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
6658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Since scrolling is double buffered, we will be blitting the scroll view's intersection
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // with the clip rect every time to keep it smooth.
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect clipRect = windowClipRect();
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect scrollViewRect = convertToContainingWindow(IntRect(0, 0, visibleWidth(), visibleHeight()));
67081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (hasOverlayScrollbars()) {
6712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        int verticalScrollbarWidth = verticalScrollbar() ? verticalScrollbar()->width() : 0;
6722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        int horizontalScrollbarHeight = horizontalScrollbar() ? horizontalScrollbar()->height() : 0;
6732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        scrollViewRect.setWidth(scrollViewRect.width() - verticalScrollbarWidth);
6752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        scrollViewRect.setHeight(scrollViewRect.height() - horizontalScrollbarHeight);
6762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
6772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect updateRect = clipRect;
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    updateRect.intersect(scrollViewRect);
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Invalidate the window (not the backing store).
682dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hostWindow()->invalidateWindow(updateRect, false /*immediate*/);
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_drawPanScrollIcon) {
685e14391e94c850b8bd03680c23b38978db68687a8John Reck        // FIXME: the pan icon is broken when accelerated compositing is on, since it will draw under the compositing layers.
686e14391e94c850b8bd03680c23b38978db68687a8John Reck        // https://bugs.webkit.org/show_bug.cgi?id=47837
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int panIconDirtySquareSizeLength = 2 * (panIconSizeLength + max(abs(scrollDelta.width()), abs(scrollDelta.height()))); // We only want to repaint what's necessary
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        IntPoint panIconDirtySquareLocation = IntPoint(m_panScrollIconPoint.x() - (panIconDirtySquareSizeLength / 2), m_panScrollIconPoint.y() - (panIconDirtySquareSizeLength / 2));
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        IntRect panScrollIconDirtyRect = IntRect(panIconDirtySquareLocation , IntSize(panIconDirtySquareSizeLength, panIconDirtySquareSizeLength));
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        panScrollIconDirtyRect.intersect(clipRect);
691dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        hostWindow()->invalidateContentsAndWindow(panScrollIconDirtyRect, false /*immediate*/);
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
694d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (canBlitOnScroll()) { // The main frame can just blit the WebView window
695dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // FIXME: Find a way to scroll subframes with this faster path
69606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (!scrollContentsFastPath(-scrollDelta, scrollViewRect, clipRect))
697e14391e94c850b8bd03680c23b38978db68687a8John Reck            scrollContentsSlowPath(updateRect);
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project       // We need to go ahead and repaint the entire backing store.  Do it now before moving the
7005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian       // windowed plugins.
701e14391e94c850b8bd03680c23b38978db68687a8John Reck       scrollContentsSlowPath(updateRect);
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
70481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Invalidate the overhang areas if they are visible.
70581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    IntRect horizontalOverhangRect;
70681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    IntRect verticalOverhangRect;
70781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    calculateOverhangAreasForPainting(horizontalOverhangRect, verticalOverhangRect);
70881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!horizontalOverhangRect.isEmpty())
70981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        hostWindow()->invalidateContentsAndWindow(horizontalOverhangRect, false /*immediate*/);
71081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!verticalOverhangRect.isEmpty())
71181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        hostWindow()->invalidateContentsAndWindow(verticalOverhangRect, false /*immediate*/);
71281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This call will move children with native widgets (plugins) and invalidate them as well.
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    frameRectsChanged();
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
716dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Now blit the backingstore into the window which should be very fast.
717dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hostWindow()->invalidateWindow(IntRect(), true);
71806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
71906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
72006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenbool ScrollView::scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect)
72106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
72206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    hostWindow()->scroll(scrollDelta, rectToScroll, clipRect);
72306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return true;
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
726e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid ScrollView::scrollContentsSlowPath(const IntRect& updateRect)
727e14391e94c850b8bd03680c23b38978db68687a8John Reck{
728e14391e94c850b8bd03680c23b38978db68687a8John Reck    hostWindow()->invalidateContentsForSlowScroll(updateRect, false);
729e14391e94c850b8bd03680c23b38978db68687a8John Reck}
730e14391e94c850b8bd03680c23b38978db68687a8John Reck
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntPoint ScrollView::windowToContents(const IntPoint& windowPoint) const
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntPoint viewPoint = convertFromContainingWindow(windowPoint);
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return viewPoint + scrollOffset();
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntPoint ScrollView::contentsToWindow(const IntPoint& contentsPoint) const
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntPoint viewPoint = contentsPoint - scrollOffset();
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return convertToContainingWindow(viewPoint);
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect ScrollView::windowToContents(const IntRect& windowRect) const
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect viewRect = convertFromContainingWindow(windowRect);
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    viewRect.move(scrollOffset());
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return viewRect;
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect ScrollView::contentsToWindow(const IntRect& contentsRect) const
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect viewRect = contentsRect;
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    viewRect.move(-scrollOffset());
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return convertToContainingWindow(viewRect);
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect ScrollView::contentsToScreen(const IntRect& rect) const
7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (platformWidget())
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return platformContentsToScreen(rect);
7610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!hostWindow())
7620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return IntRect();
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return hostWindow()->windowToScreen(contentsToWindow(rect));
7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntPoint ScrollView::screenToContents(const IntPoint& point) const
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (platformWidget())
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return platformScreenToContents(point);
7700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!hostWindow())
7710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return IntPoint();
7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return windowToContents(hostWindow()->screenToWindow(point));
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ScrollView::containsScrollbarsAvoidingResizer() const
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return !m_scrollbarsAvoidingResizer;
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::adjustScrollbarsAvoidingResizerCount(int overlapDelta)
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int oldCount = m_scrollbarsAvoidingResizer;
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_scrollbarsAvoidingResizer += overlapDelta;
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (parent())
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        parent()->adjustScrollbarsAvoidingResizerCount(overlapDelta);
7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (!scrollbarsSuppressed()) {
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If we went from n to 0 or from 0 to n and we're the outermost view,
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // we need to invalidate the windowResizerRect(), since it will now need to paint
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // differently.
7908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if ((oldCount > 0 && m_scrollbarsAvoidingResizer == 0) ||
7918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            (oldCount == 0 && m_scrollbarsAvoidingResizer > 0))
7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            invalidateRect(windowResizerRect());
7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::setParent(ScrollView* parentView)
7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (parentView == parent())
7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_scrollbarsAvoidingResizer && parent())
8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        parent()->adjustScrollbarsAvoidingResizerCount(-m_scrollbarsAvoidingResizer);
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Widget::setParent(parentView);
8055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_scrollbarsAvoidingResizer && parent())
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        parent()->adjustScrollbarsAvoidingResizerCount(m_scrollbarsAvoidingResizer);
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::setScrollbarsSuppressed(bool suppressed, bool repaintOnUnsuppress)
8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (suppressed == m_scrollbarsSuppressed)
8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_scrollbarsSuppressed = suppressed;
8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (platformWidget())
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        platformSetScrollbarsSuppressed(repaintOnUnsuppress);
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (repaintOnUnsuppress && !suppressed) {
8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_horizontalScrollbar)
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_horizontalScrollbar->invalidate();
8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_verticalScrollbar)
8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_verticalScrollbar->invalidate();
8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Invalidate the scroll corner too on unsuppress.
826231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        invalidateRect(scrollCornerRect());
8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochScrollbar* ScrollView::scrollbarAtPoint(const IntPoint& windowPoint)
8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (platformWidget())
8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    IntPoint viewPoint = convertFromContainingWindow(windowPoint);
8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_horizontalScrollbar && m_horizontalScrollbar->frameRect().contains(viewPoint))
8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_horizontalScrollbar.get();
8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_verticalScrollbar && m_verticalScrollbar->frameRect().contains(viewPoint))
8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_verticalScrollbar.get();
8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::wheelEvent(PlatformWheelEvent& e)
8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We don't allow mouse wheeling to happen in a ScrollView that has had its scrollbars explicitly disabled.
8465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if PLATFORM(WX)
8475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!canHaveScrollbars()) {
8485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#else
8495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!canHaveScrollbars() || platformWidget()) {
8505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif
8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
8525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ScrollableArea::handleWheelEvent(e);
8552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
8565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
8572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(GESTURE_EVENTS)
8582fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid ScrollView::gestureEvent(const PlatformGestureEvent& gestureEvent)
8592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
8602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (platformWidget())
8612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
8622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ScrollableArea::handleGestureEvent(gestureEvent);
8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::setFrameRect(const IntRect& newRect)
8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect oldRect = frameRect();
8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (newRect == oldRect)
8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Widget::setFrameRect(newRect);
87581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
87681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
87781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid ScrollView::setBoundsSize(const IntSize& newSize)
87881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
87981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (newSize == m_boundsSize)
88081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
88181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
88281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    Widget::setBoundsSize(newSize);
88381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_boundsSize = newSize;
8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (platformWidget())
8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
88781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
88881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    updateScrollbars(m_scrollOffset);
88981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!m_useFixedLayout)
89081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        contentsResized();
8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    frameRectsChanged();
8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
89581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid ScrollView::setInitialBoundsSize(const IntSize& newSize)
89681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
89781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(m_boundsSize.isZero());
89881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_boundsSize = newSize;
89981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
90081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
901635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid ScrollView::frameRectsChanged()
9028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (platformWidget())
9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    HashSet<RefPtr<Widget> >::const_iterator end = m_children.end();
9070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    for (HashSet<RefPtr<Widget> >::const_iterator current = m_children.begin(); current != end; ++current)
9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (*current)->frameRectsChanged();
9092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    positionScrollbarLayers();
9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
9132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic void positionScrollbarLayer(GraphicsLayer* graphicsLayer, Scrollbar* scrollbar)
9142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
9152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!graphicsLayer || !scrollbar)
9162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
9172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    graphicsLayer->setDrawsContent(true);
9182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    IntRect scrollbarRect = scrollbar->frameRect();
9192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    graphicsLayer->setPosition(scrollbarRect.location());
9202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (scrollbarRect.size() != graphicsLayer->size())
9212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        graphicsLayer->setNeedsDisplay();
9222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    graphicsLayer->setSize(scrollbarRect.size());
9232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
9242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic void positionScrollCornerLayer(GraphicsLayer* graphicsLayer, const IntRect& cornerRect)
9262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
9272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!graphicsLayer)
9282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
9292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    graphicsLayer->setDrawsContent(!cornerRect.isEmpty());
9302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    graphicsLayer->setPosition(cornerRect.location());
9312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (cornerRect.size() != graphicsLayer->size())
9322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        graphicsLayer->setNeedsDisplay();
9332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    graphicsLayer->setSize(cornerRect.size());
9342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
9352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
9362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid ScrollView::positionScrollbarLayers()
9392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
9402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
9412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    positionScrollbarLayer(layerForHorizontalScrollbar(), horizontalScrollbar());
9422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    positionScrollbarLayer(layerForVerticalScrollbar(), verticalScrollbar());
9432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    positionScrollCornerLayer(layerForScrollCorner(), scrollCornerRect());
9442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
9452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
9462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::repaintContentRectangle(const IntRect& rect, bool now)
9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
950643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    IntRect paintRect = rect;
951cad810f21b803229eb11403f9209855525a25d57Steve Block    if (clipsRepaints() && !paintsEntireContents())
952643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        paintRect.intersect(visibleContentRect());
953aad6f24e036b3740071bb995b955b18b572067b2Steve Block#ifdef ANDROID_CAPTURE_OFFSCREEN_PAINTS
954aad6f24e036b3740071bb995b955b18b572067b2Steve Block    if (rect != paintRect)
955aad6f24e036b3740071bb995b955b18b572067b2Steve Block        platformOffscreenContentRectangle(visibleContentRect(), rect);
956aad6f24e036b3740071bb995b955b18b572067b2Steve Block#endif
957643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (paintRect.isEmpty())
9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (platformWidget()) {
960643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        platformRepaintContentRectangle(paintRect, now);
9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (hostWindow())
965dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        hostWindow()->invalidateContentsAndWindow(contentsToWindow(paintRect), now /*immediate*/);
966231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
967231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
968231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockIntRect ScrollView::scrollCornerRect() const
969231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
970231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    IntRect cornerRect;
971ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
97281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (hasOverlayScrollbars())
973ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return cornerRect;
974ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
97581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_horizontalScrollbar && m_boundsSize.width() - m_horizontalScrollbar->width() > 0) {
976231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        cornerRect.unite(IntRect(m_horizontalScrollbar->width(),
97781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                                 m_boundsSize.height() - m_horizontalScrollbar->height(),
97881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                                 m_boundsSize.width() - m_horizontalScrollbar->width(),
979231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                                 m_horizontalScrollbar->height()));
980231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
981231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
98281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_verticalScrollbar && m_boundsSize.height() - m_verticalScrollbar->height() > 0) {
98381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        cornerRect.unite(IntRect(m_boundsSize.width() - m_verticalScrollbar->width(),
984231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                                 m_verticalScrollbar->height(),
985231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                                 m_verticalScrollbar->width(),
98681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                                 m_boundsSize.height() - m_verticalScrollbar->height()));
987231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
988231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
989231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return cornerRect;
990231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
991231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
9922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool ScrollView::isScrollCornerVisible() const
9932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
9942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return !scrollCornerRect().isEmpty();
9952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
9962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
997231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid ScrollView::updateScrollCorner()
998231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
999231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1000231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1001231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid ScrollView::paintScrollCorner(GraphicsContext* context, const IntRect& cornerRect)
1002231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1003231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ScrollbarTheme::nativeTheme()->paintScrollCorner(this, context, cornerRect);
10048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid ScrollView::invalidateScrollCornerRect(const IntRect& rect)
10072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
10082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    invalidateRect(rect);
10092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
10102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1011cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid ScrollView::paintScrollbars(GraphicsContext* context, const IntRect& rect)
1012cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
10132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (m_horizontalScrollbar
10142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
10152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        && !layerForHorizontalScrollbar()
10162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
10172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                                      )
1018cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        m_horizontalScrollbar->paint(context, rect);
10192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (m_verticalScrollbar
10202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
10212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        && !layerForVerticalScrollbar()
10222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
10232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                                    )
1024cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        m_verticalScrollbar->paint(context, rect);
1025cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
10262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
10272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (layerForScrollCorner())
10282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
10292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
1030cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    paintScrollCorner(context, scrollCornerRect());
1031cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
1032cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1033cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid ScrollView::paintPanScrollIcon(GraphicsContext* context)
1034cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
10356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    static Image* panScrollIcon = Image::loadPlatformResource("panIcon").releaseRef();
1036a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    context->drawImage(panScrollIcon, ColorSpaceDeviceRGB, m_panScrollIconPoint);
1037cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
1038cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
10398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::paint(GraphicsContext* context, const IntRect& rect)
10408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (platformWidget()) {
10428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Widget::paint(context, rect);
10438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
10448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (context->paintingDisabled() && !context->updatingControlTints())
10478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
10488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10492bde8e466a4451c7319e3a072d118917957d6554Steve Block    notifyPageThatContentAreaWillPaint();
10502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // If we encounter any overlay scrollbars as we paint, this will be set to true.
10522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_containsScrollableAreaWithOverlayScrollbars = false;
10532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect documentDirtyRect = rect;
10558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    documentDirtyRect.intersect(frameRect());
10568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    context->save();
10588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    context->translate(x(), y());
10608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    documentDirtyRect.move(-x(), -y());
10618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!paintsEntireContents()) {
10636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        context->translate(-scrollX(), -scrollY());
10646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        documentDirtyRect.move(scrollX(), scrollY());
10658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        context->clip(visibleContentRect());
10676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
10688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    paintContents(context, documentDirtyRect);
10708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    context->restore();
10728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    IntRect horizontalOverhangRect;
10742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    IntRect verticalOverhangRect;
10752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    calculateOverhangAreasForPainting(horizontalOverhangRect, verticalOverhangRect);
10762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (rect.intersects(horizontalOverhangRect) || rect.intersects(verticalOverhangRect))
10782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        paintOverhangAreas(context, horizontalOverhangRect, verticalOverhangRect, rect);
10792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now paint the scrollbars.
10818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_scrollbarsSuppressed && (m_horizontalScrollbar || m_verticalScrollbar)) {
10828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        context->save();
10838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        IntRect scrollViewDirtyRect = rect;
10848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        scrollViewDirtyRect.intersect(frameRect());
10858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        context->translate(x(), y());
10868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        scrollViewDirtyRect.move(-x(), -y());
10878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1088cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        paintScrollbars(context, scrollViewDirtyRect);
1089cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
10908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        context->restore();
10918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Paint the panScroll Icon
1094cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (m_drawPanScrollIcon)
1095cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        paintPanScrollIcon(context);
10968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10982fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid ScrollView::calculateOverhangAreasForPainting(IntRect& horizontalOverhangRect, IntRect& verticalOverhangRect)
10992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
110081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    int verticalScrollbarWidth = (verticalScrollbar() && !verticalScrollbar()->isOverlayScrollbar())
110181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        ? verticalScrollbar()->width() : 0;
110281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    int horizontalScrollbarHeight = (horizontalScrollbar() && !horizontalScrollbar()->isOverlayScrollbar())
110381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        ? horizontalScrollbar()->height() : 0;
11042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11052bde8e466a4451c7319e3a072d118917957d6554Steve Block    int physicalScrollY = scrollPosition().y() + m_scrollOrigin.y();
11062bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (physicalScrollY < 0) {
11072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        horizontalOverhangRect = frameRect();
11082bde8e466a4451c7319e3a072d118917957d6554Steve Block        horizontalOverhangRect.setHeight(-physicalScrollY);
11092bde8e466a4451c7319e3a072d118917957d6554Steve Block    } else if (physicalScrollY > contentsHeight() - visibleContentRect().height()) {
11102bde8e466a4451c7319e3a072d118917957d6554Steve Block        int height = physicalScrollY - (contentsHeight() - visibleContentRect().height());
11112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        horizontalOverhangRect = frameRect();
11122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        horizontalOverhangRect.setY(frameRect().maxY() - height - horizontalScrollbarHeight);
11132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        horizontalOverhangRect.setHeight(height);
11142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
11152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11162bde8e466a4451c7319e3a072d118917957d6554Steve Block    int physicalScrollX = scrollPosition().x() + m_scrollOrigin.x();
11172bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (physicalScrollX < 0) {
11182bde8e466a4451c7319e3a072d118917957d6554Steve Block        verticalOverhangRect.setWidth(-physicalScrollX);
11192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        verticalOverhangRect.setHeight(frameRect().height() - horizontalOverhangRect.height());
11202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        verticalOverhangRect.setX(frameRect().x());
11212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (horizontalOverhangRect.y() == frameRect().y())
11222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            verticalOverhangRect.setY(frameRect().y() + horizontalOverhangRect.height());
11232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        else
11242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            verticalOverhangRect.setY(frameRect().y());
11252bde8e466a4451c7319e3a072d118917957d6554Steve Block    } else if (physicalScrollX > contentsWidth() - visibleContentRect().width()) {
11262bde8e466a4451c7319e3a072d118917957d6554Steve Block        int width = physicalScrollX - (contentsWidth() - visibleContentRect().width());
11272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        verticalOverhangRect.setWidth(width);
11282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        verticalOverhangRect.setHeight(frameRect().height() - horizontalOverhangRect.height());
11292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        verticalOverhangRect.setX(frameRect().maxX() - width - verticalScrollbarWidth);
11302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (horizontalOverhangRect.y() == frameRect().y())
11312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            verticalOverhangRect.setY(frameRect().y() + horizontalOverhangRect.height());
11322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        else
11332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            verticalOverhangRect.setY(frameRect().y());
11342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
11352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
11362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11372fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid ScrollView::paintOverhangAreas(GraphicsContext* context, const IntRect& horizontalOverhangRect, const IntRect& verticalOverhangRect, const IntRect&)
11382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
11392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // FIXME: This should be checking the dirty rect.
11402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    context->setFillColor(Color::white, ColorSpaceDeviceRGB);
11422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!horizontalOverhangRect.isEmpty())
11432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        context->fillRect(horizontalOverhangRect);
11442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    context->setFillColor(Color::white, ColorSpaceDeviceRGB);
11462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!verticalOverhangRect.isEmpty())
11472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        context->fillRect(verticalOverhangRect);
11482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
11492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool ScrollView::isPointInScrollbarCorner(const IntPoint& windowPoint)
11510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
11520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!scrollbarCornerPresent())
11530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
11540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    IntPoint viewPoint = convertFromContainingWindow(windowPoint);
11560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_horizontalScrollbar) {
11580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        int horizontalScrollbarYMin = m_horizontalScrollbar->frameRect().y();
11590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        int horizontalScrollbarYMax = m_horizontalScrollbar->frameRect().y() + m_horizontalScrollbar->frameRect().height();
11600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        int horizontalScrollbarXMin = m_horizontalScrollbar->frameRect().x() + m_horizontalScrollbar->frameRect().width();
11610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return viewPoint.y() > horizontalScrollbarYMin && viewPoint.y() < horizontalScrollbarYMax && viewPoint.x() > horizontalScrollbarXMin;
11630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
11640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    int verticalScrollbarXMin = m_verticalScrollbar->frameRect().x();
11660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    int verticalScrollbarXMax = m_verticalScrollbar->frameRect().x() + m_verticalScrollbar->frameRect().width();
11670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    int verticalScrollbarYMin = m_verticalScrollbar->frameRect().y() + m_verticalScrollbar->frameRect().height();
11680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return viewPoint.x() > verticalScrollbarXMin && viewPoint.x() < verticalScrollbarXMax && viewPoint.y() > verticalScrollbarYMin;
11700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
11710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ScrollView::scrollbarCornerPresent() const
11738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
117481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return (m_horizontalScrollbar && m_boundsSize.width() - m_horizontalScrollbar->width() > 0) ||
117581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch           (m_verticalScrollbar && m_boundsSize.height() - m_verticalScrollbar->height() > 0);
11768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochIntRect ScrollView::convertFromScrollbarToContainingView(const Scrollbar* scrollbar, const IntRect& localRect) const
11790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
11800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Scrollbars won't be transformed within us
11810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    IntRect newRect = localRect;
11820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    newRect.move(scrollbar->x(), scrollbar->y());
11830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return newRect;
11840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
11850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochIntRect ScrollView::convertFromContainingViewToScrollbar(const Scrollbar* scrollbar, const IntRect& parentRect) const
11870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
11880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    IntRect newRect = parentRect;
11890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Scrollbars won't be transformed within us
11900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    newRect.move(-scrollbar->x(), -scrollbar->y());
11910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return newRect;
11920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
11930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// FIXME: test these on windows
11950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochIntPoint ScrollView::convertFromScrollbarToContainingView(const Scrollbar* scrollbar, const IntPoint& localPoint) const
11960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
11970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Scrollbars won't be transformed within us
11980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    IntPoint newPoint = localPoint;
11990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    newPoint.move(scrollbar->x(), scrollbar->y());
12000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return newPoint;
12010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
12020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochIntPoint ScrollView::convertFromContainingViewToScrollbar(const Scrollbar* scrollbar, const IntPoint& parentPoint) const
12040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
12050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    IntPoint newPoint = parentPoint;
12060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Scrollbars won't be transformed within us
12070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    newPoint.move(-scrollbar->x(), -scrollbar->y());
12080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return newPoint;
12090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
12100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::setParentVisible(bool visible)
12128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isParentVisible() == visible)
12148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Widget::setParentVisible(visible);
12178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1218635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!isSelfVisible())
12198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    HashSet<RefPtr<Widget> >::iterator end = m_children.end();
12220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    for (HashSet<RefPtr<Widget> >::iterator it = m_children.begin(); it != end; ++it)
12238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (*it)->setParentVisible(visible);
12248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::show()
12278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!isSelfVisible()) {
12298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setSelfVisible(true);
12308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isParentVisible()) {
12310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HashSet<RefPtr<Widget> >::iterator end = m_children.end();
12320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            for (HashSet<RefPtr<Widget> >::iterator it = m_children.begin(); it != end; ++it)
12338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                (*it)->setParentVisible(true);
12348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
12358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Widget::show();
12388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::hide()
12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isSelfVisible()) {
12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isParentVisible()) {
12440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HashSet<RefPtr<Widget> >::iterator end = m_children.end();
12450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            for (HashSet<RefPtr<Widget> >::iterator it = m_children.begin(); it != end; ++it)
12468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                (*it)->setParentVisible(false);
12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
12488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setSelfVisible(false);
12498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Widget::hide();
12528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ScrollView::isOffscreen() const
12558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (platformWidget())
12578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return platformIsOffscreen();
12588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!isVisible())
12608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
12618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Add a HostWindow::isOffscreen method here.  Since only Mac implements this method
12638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // currently, we can add the method when the other platforms decide to implement this concept.
12648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
12658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::addPanScrollIcon(const IntPoint& iconPosition)
12698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!hostWindow())
12710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
12728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_drawPanScrollIcon = true;
12738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_panScrollIconPoint = IntPoint(iconPosition.x() - panIconSizeLength / 2 , iconPosition.y() - panIconSizeLength / 2) ;
1274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hostWindow()->invalidateContentsAndWindow(IntRect(m_panScrollIconPoint, IntSize(panIconSizeLength, panIconSizeLength)), true /*immediate*/);
12758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::removePanScrollIcon()
12788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!hostWindow())
12800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
12818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_drawPanScrollIcon = false;
1282dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hostWindow()->invalidateContentsAndWindow(IntRect(m_panScrollIconPoint, IntSize(panIconSizeLength, panIconSizeLength)), true /*immediate*/);
12838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12852fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid ScrollView::setScrollOrigin(const IntPoint& origin, bool updatePositionAtAll, bool updatePositionSynchronously)
12864a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch{
1287f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (m_scrollOrigin == origin)
1288f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
12894a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch
1290f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    m_scrollOrigin = origin;
12914a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch
1292f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (platformWidget()) {
12932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        platformSetScrollOrigin(origin, updatePositionAtAll, updatePositionSynchronously);
1294f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
1295f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
1296f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1297f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // Update if the scroll origin changes, since our position will be different if the content size did not change.
12982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (updatePositionAtAll && updatePositionSynchronously)
12994a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch        updateScrollbars(scrollOffset());
13004a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch}
13014a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch
13022bde8e466a4451c7319e3a072d118917957d6554Steve Block#if !PLATFORM(WX) && !USE(NATIVE_GTK_MAIN_FRAME_SCROLLBAR) && !PLATFORM(EFL)
13035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
13048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::platformInit()
13058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::platformDestroy()
13098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
13128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
13138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
131481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if !PLATFORM(WX) && !PLATFORM(QT) && !PLATFORM(MAC)
13155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
13168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::platformAddChild(Widget*)
13178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::platformRemoveChild(Widget*)
13218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
13248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
13258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1326d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !PLATFORM(MAC)
13275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1328d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid ScrollView::platformSetScrollbarsSuppressed(bool)
13298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
13322fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid ScrollView::platformSetScrollOrigin(const IntPoint&, bool updatePositionAtAll, bool updatePositionSynchronously)
13334a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch{
13344a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch}
13354a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch
13368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
13378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1338d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !PLATFORM(MAC) && !PLATFORM(WX)
13395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
134022804c073ffc06fd1fc520d1afbad71e353e488dGrace Kloba#if !PLATFORM(ANDROID)
13418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::platformSetScrollbarModes()
13428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::platformScrollbarModes(ScrollbarMode& horizontal, ScrollbarMode& vertical) const
13468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    horizontal = ScrollbarAuto;
13485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    vertical = ScrollbarAuto;
13498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1350635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
1351635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1352635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid ScrollView::platformSetCanBlitOnScroll(bool)
1353635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
1354635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
1355635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1356635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool ScrollView::platformCanBlitOnScroll() const
1357635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
1358635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return false;
1359635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
13608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1361635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if !PLATFORM(ANDROID)
13628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect ScrollView::platformVisibleContentRect(bool) const
13638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return IntRect();
13658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1366635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
13678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1368635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if !PLATFORM(ANDROID)
13698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntSize ScrollView::platformContentsSize() const
13708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return IntSize();
13728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
13748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::platformSetContentsSize()
13768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect ScrollView::platformContentsToScreen(const IntRect& rect) const
13808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return rect;
13828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntPoint ScrollView::platformScreenToContents(const IntPoint& point) const
13858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return point;
13878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !PLATFORM(ANDROID)
13908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::platformSetScrollPosition(const IntPoint&)
13918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
13948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ScrollView::platformScroll(ScrollDirection, ScrollGranularity)
13968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
13988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !PLATFORM(ANDROID)
1401643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ScrollView::platformRepaintContentRectangle(const IntRect&, bool /*now*/)
14028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
14038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_CAPTURE_OFFSCREEN_PAINTS
14068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::platformOffscreenContentRectangle(const IntRect& )
14078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
14088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
14108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ScrollView::platformIsOffscreen() const
14128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
14138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
14148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1417016ea440f1b61a966483fc809a078dd28b784e46Cary Clark#endif
14188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1420