1ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch/*
2ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * Copyright (c) 2010, Google Inc. All rights reserved.
3ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * Copyright (C) 2008, 2011 Apple Inc. All Rights Reserved.
4ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch *
5ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * Redistribution and use in source and binary forms, with or without
6ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * modification, are permitted provided that the following conditions are
7ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * met:
8ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch *
9ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch *     * Redistributions of source code must retain the above copyright
10ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * notice, this list of conditions and the following disclaimer.
11ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch *     * Redistributions in binary form must reproduce the above
12ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * copyright notice, this list of conditions and the following disclaimer
13ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * in the documentation and/or other materials provided with the
14ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * distribution.
15ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch *     * Neither the name of Google Inc. nor the names of its
16ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * contributors may be used to endorse or promote products derived from
17ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * this software without specific prior written permission.
18ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch *
19ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch */
31ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
32ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "config.h"
33ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "ScrollableArea.h"
34ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "GraphicsContext.h"
362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "GraphicsLayer.h"
37ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "FloatPoint.h"
38ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "PlatformWheelEvent.h"
39ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "ScrollAnimator.h"
402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "ScrollbarTheme.h"
41ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include <wtf/PassOwnPtr.h>
42ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
43ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochnamespace WebCore {
44ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
45ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochScrollableArea::ScrollableArea()
46ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    : m_scrollAnimator(ScrollAnimator::create(this))
472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_constrainsScrollingToContentEdge(true)
482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_inLiveResize(false)
492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_verticalScrollElasticity(ScrollElasticityNone)
502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_horizontalScrollElasticity(ScrollElasticityNone)
51ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
52ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
53ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
54ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochScrollableArea::~ScrollableArea()
55ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
56ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
57ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
58ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochbool ScrollableArea::scroll(ScrollDirection direction, ScrollGranularity granularity, float multiplier)
59ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
60ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    ScrollbarOrientation orientation;
61ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    Scrollbar* scrollbar;
62ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (direction == ScrollUp || direction == ScrollDown) {
63ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        orientation = VerticalScrollbar;
64ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        scrollbar = verticalScrollbar();
65ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    } else {
66ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        orientation = HorizontalScrollbar;
67ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        scrollbar = horizontalScrollbar();
68ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
69ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
70ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!scrollbar)
71ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return false;
72ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
73ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    float step = 0;
74ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    switch (granularity) {
75ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    case ScrollByLine:
76ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        step = scrollbar->lineStep();
77ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        break;
78ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    case ScrollByPage:
79ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        step = scrollbar->pageStep();
80ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        break;
81ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    case ScrollByDocument:
82ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        step = scrollbar->totalSize();
83ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        break;
84ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    case ScrollByPixel:
85ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        step = scrollbar->pixelStep();
86ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        break;
87ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
88ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
89ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (direction == ScrollUp || direction == ScrollLeft)
90ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        multiplier = -multiplier;
91ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
92ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return m_scrollAnimator->scroll(orientation, granularity, step, multiplier);
93ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
94ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
95ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid ScrollableArea::scrollToOffsetWithoutAnimation(const FloatPoint& offset)
96ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
97ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    m_scrollAnimator->scrollToOffsetWithoutAnimation(offset);
98ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
99ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
100ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid ScrollableArea::scrollToOffsetWithoutAnimation(ScrollbarOrientation orientation, float offset)
101ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
102ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (orientation == HorizontalScrollbar)
103ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        scrollToXOffsetWithoutAnimation(offset);
104ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    else
105ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        scrollToYOffsetWithoutAnimation(offset);
106ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
107ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
108ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid ScrollableArea::scrollToXOffsetWithoutAnimation(float x)
109ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
110ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    scrollToOffsetWithoutAnimation(FloatPoint(x, m_scrollAnimator->currentPosition().y()));
111ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
112ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
113ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid ScrollableArea::scrollToYOffsetWithoutAnimation(float y)
114ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
115ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    scrollToOffsetWithoutAnimation(FloatPoint(m_scrollAnimator->currentPosition().x(), y));
116ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
117ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1182fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid ScrollableArea::handleWheelEvent(PlatformWheelEvent& wheelEvent)
1192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_scrollAnimator->handleWheelEvent(wheelEvent);
1212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(GESTURE_EVENTS)
1242fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid ScrollableArea::handleGestureEvent(const PlatformGestureEvent& gestureEvent)
1252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_scrollAnimator->handleGestureEvent(gestureEvent);
1272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
1292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
130ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid ScrollableArea::setScrollOffsetFromAnimation(const IntPoint& offset)
131ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
132ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Tell the derived class to scroll its contents.
133ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    setScrollOffset(offset);
134ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
13581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    Scrollbar* verticalScrollbar = this->verticalScrollbar();
1362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
137ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Tell the scrollbars to update their thumb postions.
1382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (Scrollbar* horizontalScrollbar = this->horizontalScrollbar()) {
139ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        horizontalScrollbar->offsetDidChange();
14081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (horizontalScrollbar->isOverlayScrollbar()) {
14181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!verticalScrollbar)
14281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                horizontalScrollbar->invalidate();
14381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            else {
14481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                // If there is both a horizontalScrollbar and a verticalScrollbar,
14581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                // then we must also invalidate the corner between them.
14681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                IntRect boundsAndCorner = horizontalScrollbar->boundsRect();
14781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                boundsAndCorner.setWidth(boundsAndCorner.width() + verticalScrollbar->width());
14881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                horizontalScrollbar->invalidateRect(boundsAndCorner);
14981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
15081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
1512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
15281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (verticalScrollbar) {
153ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        verticalScrollbar->offsetDidChange();
15481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (verticalScrollbar->isOverlayScrollbar())
1552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            verticalScrollbar->invalidate();
1562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
1572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1592fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid ScrollableArea::willStartLiveResize()
1602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_inLiveResize)
1622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
1632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_inLiveResize = true;
1642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    scrollAnimator()->willStartLiveResize();
1652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1672fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid ScrollableArea::willEndLiveResize()
1682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_inLiveResize)
1702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
1712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_inLiveResize = false;
1722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    scrollAnimator()->willEndLiveResize();
1732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1752fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid ScrollableArea::didAddVerticalScrollbar(Scrollbar* scrollbar)
1762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    scrollAnimator()->didAddVerticalScrollbar(scrollbar);
1782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1802fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid ScrollableArea::willRemoveVerticalScrollbar(Scrollbar* scrollbar)
1812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    scrollAnimator()->willRemoveVerticalScrollbar(scrollbar);
1832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1852fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid ScrollableArea::didAddHorizontalScrollbar(Scrollbar* scrollbar)
1862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    scrollAnimator()->didAddHorizontalScrollbar(scrollbar);
1882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1902fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid ScrollableArea::willRemoveHorizontalScrollbar(Scrollbar* scrollbar)
1912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    scrollAnimator()->willRemoveHorizontalScrollbar(scrollbar);
193ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
194ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
19581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochbool ScrollableArea::hasOverlayScrollbars() const
19681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
19781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return (verticalScrollbar() && verticalScrollbar()->isOverlayScrollbar())
19881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        || (horizontalScrollbar() && horizontalScrollbar()->isOverlayScrollbar());
19981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
20081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
2012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid ScrollableArea::invalidateScrollbar(Scrollbar* scrollbar, const IntRect& rect)
2022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
2042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (scrollbar == horizontalScrollbar()) {
2052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (GraphicsLayer* graphicsLayer = layerForHorizontalScrollbar()) {
2062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            graphicsLayer->setNeedsDisplay();
2072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
2082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
2092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    } else if (scrollbar == verticalScrollbar()) {
2102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (GraphicsLayer* graphicsLayer = layerForVerticalScrollbar()) {
2112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            graphicsLayer->setNeedsDisplay();
2122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
2132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
2142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
2152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
2162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    invalidateScrollbarRect(scrollbar, rect);
2172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid ScrollableArea::invalidateScrollCorner()
2202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
2222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (GraphicsLayer* graphicsLayer = layerForScrollCorner()) {
2232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        graphicsLayer->setNeedsDisplay();
2242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
2252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
2262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
2272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    invalidateScrollCornerRect(scrollCornerRect());
2282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
230ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} // namespace WebCore
231