15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 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) * 1.  Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
26f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebPluginScrollbarImpl.h"
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "platform/KeyboardCodes.h"
29f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "platform/graphics/GraphicsContext.h"
30a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/ScrollAnimator.h"
31f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "platform/scroll/ScrollTypes.h"
32a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/Scrollbar.h"
33a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/ScrollbarTheme.h"
345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebCanvas.h"
355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebRect.h"
365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebVector.h"
37f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebInputEvent.h"
38f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPluginScrollbarClient.h"
39f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ScrollbarGroup.h"
40f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebInputEventConversion.h"
41f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebPluginContainerImpl.h"
42f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebViewImpl.h"
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WebCore;
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebPluginScrollbar* WebPluginScrollbar::createForPlugin(Orientation orientation,
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                        WebPluginContainer* pluginContainer,
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                        WebPluginScrollbarClient* client)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    WebPluginContainerImpl* plugin = toWebPluginContainerImpl(pluginContainer);
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return new WebPluginScrollbarImpl(orientation, plugin->scrollbarGroup(), client);
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int WebPluginScrollbar::defaultThickness()
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ScrollbarTheme::theme()->scrollbarThickness();
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebPluginScrollbarImpl::WebPluginScrollbarImpl(Orientation orientation,
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                   ScrollbarGroup* group,
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                   WebPluginScrollbarClient* client)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_group(group)
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_client(client)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_scrollOffset(0)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
688abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    m_scrollbar = Scrollbar::create(
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        static_cast<ScrollableArea*>(m_group),
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        static_cast<WebCore::ScrollbarOrientation>(orientation),
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebCore::RegularScrollbar);
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_group->scrollbarCreated(this);
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebPluginScrollbarImpl::~WebPluginScrollbarImpl()
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_group->scrollbarDestroyed(this);
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginScrollbarImpl::setScrollOffset(int scrollOffset)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_scrollOffset = scrollOffset;
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_client->valueChanged(this);
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginScrollbarImpl::invalidateScrollbarRect(const IntRect& rect)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebRect webrect(rect);
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    webrect.x += m_scrollbar->x();
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    webrect.y += m_scrollbar->y();
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_client->invalidateScrollbarRect(this, webrect);
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginScrollbarImpl::getTickmarks(Vector<IntRect>& tickmarks) const
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebVector<WebRect> ticks;
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_client->getTickmarks(const_cast<WebPluginScrollbarImpl*>(this), &ticks);
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    tickmarks.resize(ticks.size());
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < ticks.size(); ++i)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        tickmarks[i] = ticks[i];
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint WebPluginScrollbarImpl::convertFromContainingViewToScrollbar(const IntPoint& parentPoint) const
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint offset(parentPoint.x() - m_scrollbar->x(), parentPoint.y() - m_scrollbar->y());
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_scrollbar->Widget::convertFromContainingView(offset);
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginScrollbarImpl::scrollbarStyleChanged()
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_client->overlayChanged(this);
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginScrollbarImpl::isOverlay() const
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_scrollbar->isOverlayScrollbar();
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int WebPluginScrollbarImpl::value() const
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_scrollOffset;
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebPoint WebPluginScrollbarImpl::location() const
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_scrollbar->frameRect().location();
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebSize WebPluginScrollbarImpl::size() const
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_scrollbar->frameRect().size();
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginScrollbarImpl::enabled() const
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_scrollbar->enabled();
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int WebPluginScrollbarImpl::maximum() const
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_scrollbar->maximum();
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int WebPluginScrollbarImpl::totalSize() const
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_scrollbar->totalSize();
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginScrollbarImpl::isScrollViewScrollbar() const
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_scrollbar->isScrollViewScrollbar();
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginScrollbarImpl::isScrollableAreaActive() const
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_scrollbar->isScrollableAreaActive();
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginScrollbarImpl::getTickmarks(WebVector<WebRect>& tickmarks) const
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_client->getTickmarks(const_cast<WebPluginScrollbarImpl*>(this), &tickmarks);
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebScrollbar::ScrollbarControlSize WebPluginScrollbarImpl::controlSize() const
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<WebScrollbar::ScrollbarControlSize>(m_scrollbar->controlSize());
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebScrollbar::ScrollbarPart WebPluginScrollbarImpl::pressedPart() const
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<WebScrollbar::ScrollbarPart>(m_scrollbar->pressedPart());
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebScrollbar::ScrollbarPart WebPluginScrollbarImpl::hoveredPart() const
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<WebScrollbar::ScrollbarPart>(m_scrollbar->hoveredPart());
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebScrollbar::ScrollbarOverlayStyle WebPluginScrollbarImpl::scrollbarOverlayStyle() const
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<WebScrollbar::ScrollbarOverlayStyle>(m_scrollbar->scrollbarOverlayStyle());
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebScrollbar::Orientation WebPluginScrollbarImpl::orientation() const
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_scrollbar->orientation() == WebCore::HorizontalScrollbar)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebScrollbar::Horizontal;
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebScrollbar::Vertical;
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1918abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)bool WebPluginScrollbarImpl::isLeftSideVerticalScrollbar() const
192c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
193c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return false;
194c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
195c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginScrollbarImpl::isCustomScrollbar() const
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_scrollbar->isCustomScrollbar();
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginScrollbarImpl::setLocation(const WebRect& rect)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect oldRect = m_scrollbar->frameRect();
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_scrollbar->setFrameRect(rect);
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (WebRect(oldRect) != rect)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      m_scrollbar->invalidate();
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int length = m_scrollbar->orientation() == HorizontalScrollbar ? m_scrollbar->width() : m_scrollbar->height();
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_scrollbar->setEnabled(m_scrollbar->totalSize() > length);
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_scrollbar->setProportion(length, m_scrollbar->totalSize());
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginScrollbarImpl::setValue(int position)
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_group->scrollToOffsetWithoutAnimation(m_scrollbar->orientation(), static_cast<float>(position));
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginScrollbarImpl::setDocumentSize(int size)
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int length = m_scrollbar->orientation() == HorizontalScrollbar ? m_scrollbar->width() : m_scrollbar->height();
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_scrollbar->setEnabled(size > length);
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_scrollbar->setProportion(length, size);
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginScrollbarImpl::scroll(ScrollDirection direction, ScrollGranularity granularity, float multiplier)
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebCore::ScrollDirection dir;
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool horizontal = m_scrollbar->orientation() == HorizontalScrollbar;
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (direction == ScrollForward)
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dir = horizontal ? ScrollRight : ScrollDown;
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dir = horizontal ? ScrollLeft : ScrollUp;
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_group->scroll(dir, static_cast<WebCore::ScrollGranularity>(granularity), multiplier);
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginScrollbarImpl::paint(WebCanvas* canvas, const WebRect& rect)
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
23953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext context(canvas);
24053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_scrollbar->paint(&context, rect);
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginScrollbarImpl::handleInputEvent(const WebInputEvent& event)
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (event.type) {
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebInputEvent::MouseDown:
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return onMouseDown(event);
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebInputEvent::MouseUp:
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return onMouseUp(event);
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebInputEvent::MouseMove:
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return onMouseMove(event);
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebInputEvent::MouseLeave:
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return onMouseLeave(event);
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebInputEvent::MouseWheel:
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return onMouseWheel(event);
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebInputEvent::KeyDown:
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return onKeyDown(event);
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebInputEvent::Undefined:
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebInputEvent::MouseEnter:
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebInputEvent::RawKeyDown:
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebInputEvent::KeyUp:
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebInputEvent::Char:
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebInputEvent::TouchStart:
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebInputEvent::TouchMove:
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebInputEvent::TouchEnd:
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebInputEvent::TouchCancel:
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         break;
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginScrollbarImpl::isAlphaLocked() const
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_scrollbar->isAlphaLocked();
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginScrollbarImpl::setIsAlphaLocked(bool flag)
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_scrollbar->setIsAlphaLocked(flag);
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginScrollbarImpl::onMouseDown(const WebInputEvent& event)
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebMouseEvent mousedown = *static_cast<const WebMouseEvent*>(&event);
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_scrollbar->frameRect().contains(mousedown.x, mousedown.y))
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mousedown.x -= m_scrollbar->x();
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mousedown.y -= m_scrollbar->y();
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_scrollbar->mouseDown(PlatformMouseEventBuilder(m_scrollbar.get(), mousedown));
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginScrollbarImpl::onMouseUp(const WebInputEvent& event)
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebMouseEvent mouseup = *static_cast<const WebMouseEvent*>(&event);
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_scrollbar->pressedPart() == WebCore::NoPart)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_scrollbar->mouseUp(PlatformMouseEventBuilder(m_scrollbar.get(), mouseup));
30253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginScrollbarImpl::onMouseMove(const WebInputEvent& event)
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebMouseEvent mousemove = *static_cast<const WebMouseEvent*>(&event);
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_scrollbar->frameRect().contains(mousemove.x, mousemove.y)
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || m_scrollbar->pressedPart() != WebCore::NoPart) {
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        mousemove.x -= m_scrollbar->x();
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        mousemove.y -= m_scrollbar->y();
31253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        m_scrollbar->mouseMoved(PlatformMouseEventBuilder(m_scrollbar.get(), mousemove));
31353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return true;
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_scrollbar->hoveredPart() != WebCore::NoPart && !m_scrollbar->isOverlayScrollbar())
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollbar->mouseExited();
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginScrollbarImpl::onMouseLeave(const WebInputEvent& event)
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_scrollbar->hoveredPart() != WebCore::NoPart)
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_scrollbar->mouseExited();
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginScrollbarImpl::onMouseWheel(const WebInputEvent& event)
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebMouseWheelEvent mousewheel = *static_cast<const WebMouseWheelEvent*>(&event);
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PlatformWheelEventBuilder platformEvent(m_scrollbar.get(), mousewheel);
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_group->handleWheelEvent(platformEvent);
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginScrollbarImpl::onKeyDown(const WebInputEvent& event)
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebKeyboardEvent keyboard = *static_cast<const WebKeyboardEvent*>(&event);
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int keyCode;
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We have to duplicate this logic from WebViewImpl because there it uses
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Char and RawKeyDown events, which don't exist at this point.
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (keyboard.windowsKeyCode == VKEY_SPACE)
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        keyCode = ((keyboard.modifiers & WebInputEvent::ShiftKey) ? VKEY_PRIOR : VKEY_NEXT);
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else {
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (keyboard.modifiers == WebInputEvent::ControlKey) {
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Match FF behavior in the sense that Ctrl+home/end are the only Ctrl
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // key combinations which affect scrolling. Safari is buggy in the
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // sense that it scrolls the page for all Ctrl+scrolling key
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // combinations. For e.g. Ctrl+pgup/pgdn/up/down, etc.
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            switch (keyboard.windowsKeyCode) {
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case VKEY_HOME:
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case VKEY_END:
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            default:
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return false;
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (keyboard.isSystemKey || (keyboard.modifiers & WebInputEvent::ShiftKey))
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        keyCode = keyboard.windowsKeyCode;
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebCore::ScrollDirection scrollDirection;
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebCore::ScrollGranularity scrollGranularity;
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (WebViewImpl::mapKeyCodeForScroll(keyCode, &scrollDirection, &scrollGranularity)) {
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Will return false if scroll direction wasn't compatible with this scrollbar.
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_group->scroll(scrollDirection, scrollGranularity);
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink
374