Title: [129916] trunk/Source/WebKit/blackberry
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;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to