[BlackBerry] Tie up the scrolling machinery to the graphics tree when applicable...
[WebKit-https.git] / Source / WebKit / blackberry / WebKitSupport / InRegionScrollableArea.cpp
1 /*
2  * Copyright (C) 2011, 2012 Research In Motion Limited. All rights reserved.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18
19 #include "config.h"
20 #include "InRegionScrollableArea.h"
21
22 #include "Frame.h"
23 #include "LayerCompositingThread.h"
24 #include "LayerWebKitThread.h"
25 #include "RenderBox.h"
26 #include "RenderLayer.h"
27 #include "RenderLayerBacking.h"
28 #include "RenderObject.h"
29 #include "RenderView.h"
30 #include "WebPage_p.h"
31
32 using namespace WebCore;
33
34 namespace BlackBerry {
35 namespace WebKit {
36
37 InRegionScrollableArea::InRegionScrollableArea()
38     : m_webPage(0)
39     , m_layer(0)
40     , m_hasWindowVisibleRectCalculated(false)
41 {
42 }
43
44 InRegionScrollableArea::InRegionScrollableArea(WebPagePrivate* webPage, RenderLayer* layer)
45     : m_webPage(webPage)
46     , m_layer(layer)
47     , m_hasWindowVisibleRectCalculated(false)
48 {
49     ASSERT(webPage);
50     ASSERT(layer);
51     m_isNull = false;
52
53     // FIXME: Add an ASSERT here as the 'layer' must be scrollable.
54
55     RenderObject* layerRenderer = layer->renderer();
56     ASSERT(layerRenderer);
57
58     if (layerRenderer->isRenderView()) { // #document case
59
60         FrameView* view = toRenderView(layerRenderer)->frameView();
61         ASSERT(view);
62
63         Frame* frame = view->frame();
64         ASSERT_UNUSED(frame, frame);
65
66         m_scrollPosition = m_webPage->mapToTransformed(view->scrollPosition());
67         m_contentsSize = m_webPage->mapToTransformed(view->contentsSize());
68         m_viewportSize = m_webPage->mapToTransformed(view->visibleContentRect(false /*includeScrollbars*/)).size();
69
70         m_scrollsHorizontally = view->contentsWidth() > view->visibleWidth();
71         m_scrollsVertically = view->contentsHeight() > view->visibleHeight();
72
73         m_overscrollLimitFactor = 0.0; // FIXME eventually support overscroll
74         m_cachedCompositedScrollableLayer = 0; // FIXME: Needs composited layer for inner frames.
75
76     } else { // RenderBox-based elements case (scrollable boxes (div's, p's, textarea's, etc)).
77
78         RenderBox* box = m_layer->renderBox();
79         ASSERT(box);
80         ASSERT(box->canBeScrolledAndHasScrollableArea());
81
82         ScrollableArea* scrollableArea = static_cast<ScrollableArea*>(m_layer);
83         m_scrollPosition = m_webPage->mapToTransformed(scrollableArea->scrollPosition());
84         m_contentsSize = m_webPage->mapToTransformed(scrollableArea->contentsSize());
85         m_viewportSize = m_webPage->mapToTransformed(scrollableArea->visibleContentRect(false /*includeScrollbars*/)).size();
86
87         m_scrollsHorizontally = box->scrollWidth() != box->clientWidth() && box->scrollsOverflowX();
88         m_scrollsVertically = box->scrollHeight() != box->clientHeight() && box->scrollsOverflowY();
89
90         if (m_layer->usesCompositedScrolling()) {
91             m_supportsCompositedScrolling = true;
92             ASSERT(m_layer->backing()->hasScrollingLayer());
93             m_cachedCompositedScrollableLayer = reinterpret_cast<unsigned>(m_layer->backing()->scrollingLayer()->platformLayer()->layerCompositingThread());
94         }
95
96         m_overscrollLimitFactor = 0.0;
97     }
98 }
99
100 void InRegionScrollableArea::setVisibleWindowRect(const WebCore::IntRect& rect)
101 {
102     m_hasWindowVisibleRectCalculated = true;
103     m_visibleWindowRect = rect;
104 }
105
106 Platform::IntRect InRegionScrollableArea::visibleWindowRect() const
107 {
108     ASSERT(m_hasWindowVisibleRectCalculated);
109     return m_visibleWindowRect;
110 }
111
112 RenderLayer* InRegionScrollableArea::layer() const
113 {
114     ASSERT(!m_isNull);
115     return m_layer;
116 }
117
118 }
119 }