- Revision
- 129916
- Author
- toniki...@webkit.org
- Date
- 2012-09-28 10:22:13 -0700 (Fri, 28 Sep 2012)
Log Message
[BlackBerry] Extend composited in-region scrolling to iframes/frames
https://bugs.webkit.org/show_bug.cgi?id=97922
PR #197093
Reviewed by Yong Li.
Patch by Antonio Gomes <ago...@rim.com>
Internaly reviewed by Arvid Nilsson.
Add support for composited scrolling in a inner frame level:
1) When creating an InRegionScrollableArea, for a inner scrollable frame,
cache and camouflag the appropriated scroll layer (i.e. RenderLayerCompositor::scrollLayer);
2) Differentiate what type of scroll target we are at: BlockElement or
InnerFrame;
3) Change the signature of the public methods to support and newly passed
in ScrollTarget parameter;
As a side note, this parameter is needed in order to know what class to static_cast
the GraphicsLayer::client to: in the case of a composited scrollable inner frame, the client
is a RenderLayerCompositor; in case of a composited scrollable block element, the client
is a RenderLayerBacking.
* Api/InRegionScroller.cpp:
(BlackBerry::WebKit::InRegionScroller::setScrollPositionWebKitThread):
(BlackBerry::WebKit::InRegionScrollerPrivate::setScrollPositionWebKitThread):
* Api/InRegionScroller.h:
* Api/InRegionScroller_p.h:
(InRegionScrollerPrivate):
* WebCoreSupport/ChromeClientBlackBerry.h:
(WebCore::ChromeClientBlackBerry::allowedCompositingTriggers):
* WebKitSupport/InRegionScrollableArea.cpp:
(BlackBerry::WebKit::InRegionScrollableArea::InRegionScrollableArea):
Modified Paths
Diff
Modified: trunk/Source/WebKit/blackberry/Api/InRegionScroller.cpp (129915 => 129916)
--- trunk/Source/WebKit/blackberry/Api/InRegionScroller.cpp 2012-09-28 17:16:02 UTC (rev 129915)
+++ trunk/Source/WebKit/blackberry/Api/InRegionScroller.cpp 2012-09-28 17:22:13 UTC (rev 129916)
@@ -31,6 +31,7 @@
#include "RenderBox.h"
#include "RenderLayer.h"
#include "RenderLayerBacking.h"
+#include "RenderLayerCompositor.h"
#include "RenderObject.h"
#include "RenderView.h"
#include "SelectionHandler.h"
@@ -64,12 +65,13 @@
return d->setScrollPositionCompositingThread(camouflagedLayer, d->m_webPage->mapFromTransformed(scrollPosition));
}
-bool InRegionScroller::setScrollPositionWebKitThread(unsigned camouflagedLayer, const Platform::IntPoint& scrollPosition, bool supportsAcceleratedScrolling)
+bool InRegionScroller::setScrollPositionWebKitThread(unsigned camouflagedLayer, const Platform::IntPoint& scrollPosition,
+ bool supportsAcceleratedScrolling, Platform::ScrollViewBase::ScrollTarget scrollTarget)
{
ASSERT(Platform::webKitThreadMessageClient()->isCurrentThread());
// FIXME: Negative values won't work with map{To,From}Transform methods.
- return d->setScrollPositionWebKitThread(camouflagedLayer, d->m_webPage->mapFromTransformed(scrollPosition), supportsAcceleratedScrolling);
+ return d->setScrollPositionWebKitThread(camouflagedLayer, d->m_webPage->mapFromTransformed(scrollPosition), supportsAcceleratedScrolling, scrollTarget);
}
InRegionScrollerPrivate::InRegionScrollerPrivate(WebPagePrivate* webPagePrivate)
@@ -132,7 +134,8 @@
return true;
}
-bool InRegionScrollerPrivate::setScrollPositionWebKitThread(unsigned camouflagedLayer, const WebCore::IntPoint& scrollPosition, bool supportsAcceleratedScrolling)
+bool InRegionScrollerPrivate::setScrollPositionWebKitThread(unsigned camouflagedLayer, const WebCore::IntPoint& scrollPosition,
+ bool supportsAcceleratedScrolling, Platform::ScrollViewBase::ScrollTarget scrollTarget)
{
RenderLayer* layer = 0;
@@ -141,8 +144,14 @@
ASSERT(layerWebKitThread);
if (layerWebKitThread->owner()) {
GraphicsLayer* graphicsLayer = layerWebKitThread->owner();
- RenderLayerBacking* backing = static_cast<RenderLayerBacking*>(graphicsLayer->client());
- layer = backing->owningLayer();
+
+ if (scrollTarget == Platform::ScrollViewBase::BlockElement) {
+ RenderLayerBacking* backing = static_cast<RenderLayerBacking*>(graphicsLayer->client());
+ layer = backing->owningLayer();
+ } else {
+ RenderLayerCompositor* compositor = static_cast<RenderLayerCompositor*>(graphicsLayer->client());
+ layer = compositor->rootRenderLayer();
+ }
}
} else {
Node* node = reinterpret_cast<Node*>(camouflagedLayer);
Modified: trunk/Source/WebKit/blackberry/Api/InRegionScroller.h (129915 => 129916)
--- trunk/Source/WebKit/blackberry/Api/InRegionScroller.h 2012-09-28 17:16:02 UTC (rev 129915)
+++ trunk/Source/WebKit/blackberry/Api/InRegionScroller.h 2012-09-28 17:22:13 UTC (rev 129916)
@@ -22,6 +22,7 @@
#include "BlackBerryGlobal.h"
#include <BlackBerryPlatformPrimitives.h>
+#include <interaction/ScrollViewBase.h>
namespace BlackBerry {
namespace WebKit {
@@ -36,7 +37,8 @@
~InRegionScroller();
bool setScrollPositionCompositingThread(unsigned camouflagedLayer, const Platform::IntPoint& /*scrollPosition*/);
- bool setScrollPositionWebKitThread(unsigned camouflagedLayer, const Platform::IntPoint& /*scrollPosition*/, bool acceleratedScrolling);
+ bool setScrollPositionWebKitThread(unsigned camouflagedLayer, const Platform::IntPoint& /*scrollPosition*/,
+ bool /*acceleratedScrolling*/, Platform::ScrollViewBase::ScrollTarget);
private:
friend class WebPagePrivate;
Modified: trunk/Source/WebKit/blackberry/Api/InRegionScroller_p.h (129915 => 129916)
--- trunk/Source/WebKit/blackberry/Api/InRegionScroller_p.h 2012-09-28 17:16:02 UTC (rev 129915)
+++ trunk/Source/WebKit/blackberry/Api/InRegionScroller_p.h 2012-09-28 17:22:13 UTC (rev 129916)
@@ -47,7 +47,8 @@
bool isActive() const;
bool setScrollPositionCompositingThread(unsigned camouflagedLayer, const WebCore::IntPoint& scrollPosition);
- bool setScrollPositionWebKitThread(unsigned camouflagedLayer, const WebCore::IntPoint& scrollPosition, bool supportsAcceleratedScrolling);
+ bool setScrollPositionWebKitThread(unsigned camouflagedLayer, const WebCore::IntPoint& scrollPosition,
+ bool /*acceleratedScrolling*/, Platform::ScrollViewBase::ScrollTarget);
void calculateInRegionScrollableAreasForPoint(const WebCore::IntPoint&);
const std::vector<Platform::ScrollViewBase*>& activeInRegionScrollableAreas() const;
Modified: trunk/Source/WebKit/blackberry/ChangeLog (129915 => 129916)
--- trunk/Source/WebKit/blackberry/ChangeLog 2012-09-28 17:16:02 UTC (rev 129915)
+++ trunk/Source/WebKit/blackberry/ChangeLog 2012-09-28 17:22:13 UTC (rev 129916)
@@ -1,5 +1,40 @@
2012-09-28 Antonio Gomes <ago...@rim.com>
+ [BlackBerry] Extend composited in-region scrolling to iframes/frames
+ https://bugs.webkit.org/show_bug.cgi?id=97922
+ PR #197093
+
+ Reviewed by Yong Li.
+ Internaly reviewed by Arvid Nilsson.
+
+ Add support for composited scrolling in a inner frame level:
+
+ 1) When creating an InRegionScrollableArea, for a inner scrollable frame,
+ cache and camouflag the appropriated scroll layer (i.e. RenderLayerCompositor::scrollLayer);
+
+ 2) Differentiate what type of scroll target we are at: BlockElement or
+ InnerFrame;
+
+ 3) Change the signature of the public methods to support and newly passed
+ in ScrollTarget parameter;
+ As a side note, this parameter is needed in order to know what class to static_cast
+ the GraphicsLayer::client to: in the case of a composited scrollable inner frame, the client
+ is a RenderLayerCompositor; in case of a composited scrollable block element, the client
+ is a RenderLayerBacking.
+
+ * Api/InRegionScroller.cpp:
+ (BlackBerry::WebKit::InRegionScroller::setScrollPositionWebKitThread):
+ (BlackBerry::WebKit::InRegionScrollerPrivate::setScrollPositionWebKitThread):
+ * Api/InRegionScroller.h:
+ * Api/InRegionScroller_p.h:
+ (InRegionScrollerPrivate):
+ * WebCoreSupport/ChromeClientBlackBerry.h:
+ (WebCore::ChromeClientBlackBerry::allowedCompositingTriggers):
+ * WebKitSupport/InRegionScrollableArea.cpp:
+ (BlackBerry::WebKit::InRegionScrollableArea::InRegionScrollableArea):
+
+2012-09-28 Antonio Gomes <ago...@rim.com>
+
[BlackBerry] Exiting fullscreen does not set the correct scroll position
https://bugs.webkit.org/show_bug.cgi?id=97917
PR #212920
Modified: trunk/Source/WebKit/blackberry/WebKitSupport/InRegionScrollableArea.cpp (129915 => 129916)
--- trunk/Source/WebKit/blackberry/WebKitSupport/InRegionScrollableArea.cpp 2012-09-28 17:16:02 UTC (rev 129915)
+++ trunk/Source/WebKit/blackberry/WebKitSupport/InRegionScrollableArea.cpp 2012-09-28 17:22:13 UTC (rev 129916)
@@ -25,6 +25,7 @@
#include "RenderBox.h"
#include "RenderLayer.h"
#include "RenderLayerBacking.h"
+#include "RenderLayerCompositor.h"
#include "RenderObject.h"
#include "RenderView.h"
#include "WebPage_p.h"
@@ -63,6 +64,9 @@
if (layerRenderer->isRenderView()) { // #document case
+ RenderView* renderView = toRenderView(layerRenderer);
+ ASSERT(renderView);
+
FrameView* view = toRenderView(layerRenderer)->frameView();
ASSERT(view);
@@ -76,9 +80,15 @@
m_scrollsHorizontally = view->contentsWidth() > view->visibleWidth();
m_scrollsVertically = view->contentsHeight() > view->visibleHeight();
- m_camouflagedCompositedScrollableLayer = reinterpret_cast<unsigned>(m_layer->enclosingElement()); // FIXME: Needs composited layer for inner frames.
- m_cachedNonCompositedScrollableNode = m_layer->enclosingElement();
+ m_supportsCompositedScrolling = true;
+ m_scrollTarget = InnerFrame;
+
+ ASSERT(!m_cachedNonCompositedScrollableNode);
+
+ m_camouflagedCompositedScrollableLayer = reinterpret_cast<unsigned>(renderView->compositor()->scrollLayer()->platformLayer());
+ m_cachedCompositedScrollableLayer = renderView->compositor()->scrollLayer()->platformLayer();
+
} else { // RenderBox-based elements case (scrollable boxes (div's, p's, textarea's, etc)).
RenderBox* box = m_layer->renderBox();
@@ -93,6 +103,8 @@
m_scrollsHorizontally = box->scrollWidth() != box->clientWidth() && box->scrollsOverflowX();
m_scrollsVertically = box->scrollHeight() != box->clientHeight() && box->scrollsOverflowY();
+ m_scrollTarget = BlockElement;
+
// Both caches below are self-exclusive.
if (m_layer->usesCompositedScrolling()) {
m_forceContentToBeVerticallyScrollable = true;