15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
27f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ScrollbarGroup.h"
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/FrameView.h"
30a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/Scrollbar.h"
31a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/ScrollbarTheme.h"
325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebRect.h"
33f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebPluginScrollbarImpl.h"
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ScrollbarGroup::ScrollbarGroup(FrameView* frameView, const IntRect& frameRect)
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_frameView(frameView)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_frameRect(frameRect)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_horizontalScrollbar(0)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_verticalScrollbar(0)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ScrollbarGroup::~ScrollbarGroup()
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_horizontalScrollbar);
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_verticalScrollbar);
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ScrollbarGroup::scrollbarCreated(WebPluginScrollbarImpl* scrollbar)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hadScrollbars = m_horizontalScrollbar || m_verticalScrollbar;
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (scrollbar->scrollbar()->orientation() == HorizontalScrollbar) {
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!m_horizontalScrollbar);
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_horizontalScrollbar = scrollbar;
5751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        didAddScrollbar(scrollbar->scrollbar(), HorizontalScrollbar);
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!m_verticalScrollbar);
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_verticalScrollbar = scrollbar;
6151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        didAddScrollbar(scrollbar->scrollbar(), VerticalScrollbar);
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!hadScrollbars) {
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_frameView->addScrollableArea(this);
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_frameView->setNeedsLayout();
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ScrollbarGroup::scrollbarDestroyed(WebPluginScrollbarImpl* scrollbar)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (scrollbar == m_horizontalScrollbar) {
7351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        willRemoveScrollbar(scrollbar->scrollbar(), HorizontalScrollbar);
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_horizontalScrollbar = 0;
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(scrollbar == m_verticalScrollbar);
7751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        willRemoveScrollbar(scrollbar->scrollbar(), VerticalScrollbar);
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_verticalScrollbar = 0;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_horizontalScrollbar && !m_verticalScrollbar) {
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_frameView->removeScrollableArea(this);
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_frameView->setNeedsLayout();
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ScrollbarGroup::setLastMousePosition(const IntPoint& point)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastMousePosition = point;
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
92e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)int ScrollbarGroup::scrollSize(ScrollbarOrientation orientation) const
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebPluginScrollbarImpl* webScrollbar = orientation == HorizontalScrollbar ? m_horizontalScrollbar : m_verticalScrollbar;
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!webScrollbar)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Scrollbar* scrollbar = webScrollbar->scrollbar();
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return scrollbar->totalSize() - scrollbar->visibleSize();
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ScrollbarGroup::setScrollOffset(const IntPoint& offset)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_horizontalScrollbar && m_horizontalScrollbar->scrollOffset() != offset.x())
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_horizontalScrollbar->setScrollOffset(offset.x());
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (m_verticalScrollbar && m_verticalScrollbar->scrollOffset() != offset.y())
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_verticalScrollbar->setScrollOffset(offset.y());
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ScrollbarGroup::invalidateScrollbarRect(Scrollbar* scrollbar, const IntRect& rect)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_horizontalScrollbar && scrollbar == m_horizontalScrollbar->scrollbar())
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_horizontalScrollbar->invalidateScrollbarRect(rect);
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (m_verticalScrollbar && scrollbar == m_verticalScrollbar->scrollbar())
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_verticalScrollbar->invalidateScrollbarRect(rect);
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ScrollbarGroup::invalidateScrollCornerRect(const IntRect&)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ScrollbarGroup::isActive() const
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ScrollbarGroup::setFrameRect(const IntRect& frameRect)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frameRect = frameRect;
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect ScrollbarGroup::scrollableAreaBoundingBox() const
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_frameRect;
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ScrollbarGroup::isScrollCornerVisible() const
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ScrollbarGroup::getTickmarks(Vector<IntRect>& tickmarks) const
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_verticalScrollbar)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_verticalScrollbar->getTickmarks(tickmarks);
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint ScrollbarGroup::convertFromContainingViewToScrollbar(const Scrollbar* scrollbar, const IntPoint& parentPoint) const
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_horizontalScrollbar && scrollbar == m_horizontalScrollbar->scrollbar())
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_horizontalScrollbar->convertFromContainingViewToScrollbar(parentPoint);
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_verticalScrollbar && scrollbar == m_verticalScrollbar->scrollbar())
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_verticalScrollbar->convertFromContainingViewToScrollbar(parentPoint);
1531e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    BLINK_ASSERT_NOT_REACHED();
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return IntPoint();
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Scrollbar* ScrollbarGroup::horizontalScrollbar() const
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_horizontalScrollbar ? m_horizontalScrollbar->scrollbar() : 0;
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Scrollbar* ScrollbarGroup::verticalScrollbar() const
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_verticalScrollbar ? m_verticalScrollbar->scrollbar() : 0;
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint ScrollbarGroup::scrollPosition() const
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int x = m_horizontalScrollbar ? m_horizontalScrollbar->scrollOffset() : 0;
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int y = m_verticalScrollbar ? m_verticalScrollbar->scrollOffset() : 0;
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return IntPoint(x, y);
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint ScrollbarGroup::minimumScrollPosition() const
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return IntPoint();
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint ScrollbarGroup::maximumScrollPosition() const
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return IntPoint(contentsSize().width() - visibleWidth(), contentsSize().height() - visibleHeight());
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int ScrollbarGroup::visibleHeight() const
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_verticalScrollbar)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_verticalScrollbar->scrollbar()->height();
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_horizontalScrollbar)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_horizontalScrollbar->scrollbar()->height();
1901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    BLINK_ASSERT_NOT_REACHED();
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int ScrollbarGroup::visibleWidth() const
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_horizontalScrollbar)
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_horizontalScrollbar->scrollbar()->width();
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_verticalScrollbar)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_verticalScrollbar->scrollbar()->width();
2001e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    BLINK_ASSERT_NOT_REACHED();
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntSize ScrollbarGroup::contentsSize() const
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntSize size;
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_horizontalScrollbar)
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        size.setWidth(m_horizontalScrollbar->scrollbar()->totalSize());
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (m_verticalScrollbar) {
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        size.setWidth(m_verticalScrollbar->scrollbar()->x());
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_verticalScrollbar->scrollbar()->isOverlayScrollbar())
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            size.expand(WebPluginScrollbar::defaultThickness(), 0);
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_verticalScrollbar)
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        size.setHeight(m_verticalScrollbar->scrollbar()->totalSize());
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (m_horizontalScrollbar) {
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        size.setHeight(m_horizontalScrollbar->scrollbar()->y());
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_horizontalScrollbar->scrollbar()->isOverlayScrollbar())
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            size.expand(0, WebPluginScrollbar::defaultThickness());
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return size;
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntSize ScrollbarGroup::overhangAmount() const
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return IntSize();
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)IntPoint ScrollbarGroup::lastKnownMousePosition() const
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_lastMousePosition;
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ScrollbarGroup::shouldSuspendScrollAnimations() const
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid ScrollbarGroup::scrollbarStyleChanged()
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_horizontalScrollbar)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_horizontalScrollbar->scrollbarStyleChanged();
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_verticalScrollbar)
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_verticalScrollbar->scrollbarStyleChanged();
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ScrollbarGroup::scrollbarsCanBeActive() const
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
252f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)bool ScrollbarGroup::userInputScrollable(ScrollbarOrientation orientation) const
253f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles){
254f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    return orientation == HorizontalScrollbar ? horizontalScrollbar() : verticalScrollbar();
255f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)}
256f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
2578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)bool ScrollbarGroup::shouldPlaceVerticalScrollbarOnLeft() const
2588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
2598abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return false;
2608abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
2618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
262f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)int ScrollbarGroup::pageStep(ScrollbarOrientation orientation) const
263f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles){
264f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    int length;
265f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (orientation == VerticalScrollbar) {
266f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        if (!m_verticalScrollbar)
267f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            return 0;
268f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
269f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        length = m_verticalScrollbar->scrollbar()->height();
270f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    } else {
271f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        if (!m_horizontalScrollbar)
272f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            return 0;
273f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
274f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        length = m_horizontalScrollbar->scrollbar()->width();
275f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    }
276f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
277f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    int pageStep = std::max(
278f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        static_cast<int>(static_cast<float>(length) * ScrollableArea::minFractionToStepWhenPaging()),
279f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        length - ScrollableArea::maxOverlapBetweenPages());
280f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
281f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    return std::max(pageStep, 1);
282f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)}
283f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
28451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink
285