Title: [145415] trunk/Source/WebKit/blackberry
Revision
145415
Author
commit-qu...@webkit.org
Date
2013-03-11 15:25:51 -0700 (Mon, 11 Mar 2013)

Log Message

[BlackBerry] Add a method to find the ScrollView for a text selection.
https://bugs.webkit.org/show_bug.cgi?id=112061

Patch by Genevieve Mak <g...@rim.com> on 2013-03-11
Reviewed by Rob Buis.

Internally reviewed by Mike Fenton and Jakob Petsovits.
PR #278490

Refactor the code in InRegionScroller so that we can add a method to find
the InRegionScrollableArea for a text selection.

* Api/InRegionScroller.cpp:
(BlackBerry::WebKit::InRegionScrollerPrivate::clipToRect):
    - Pull out recursive clipping code into its own function.
(WebKit):
(BlackBerry::WebKit::InRegionScrollerPrivate::calculateInRegionScrollableAreasForPoint):
(BlackBerry::WebKit::InRegionScrollerPrivate::firstScrollableInRegionForNode):
    - This new method allows us to get just the first scrollable region instead of looking
      for more nested ones. We may want to refactor in the future because some of the code is
      very similar to calculateInRegionScrollableAreasForPoint.
(BlackBerry::WebKit::InRegionScrollerPrivate::clipAndCreateInRegionScrollableArea):
    - Add a convenience method for the previous function
* Api/InRegionScroller.h:
(WebKit):
* Api/InRegionScroller_p.h:
(InRegionScrollerPrivate):

Modified Paths

Diff

Modified: trunk/Source/WebKit/blackberry/Api/InRegionScroller.cpp (145414 => 145415)


--- trunk/Source/WebKit/blackberry/Api/InRegionScroller.cpp	2013-03-11 22:22:33 UTC (rev 145414)
+++ trunk/Source/WebKit/blackberry/Api/InRegionScroller.cpp	2013-03-11 22:25:51 UTC (rev 145415)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011, 2012 Research In Motion Limited. All rights reserved.
+ * Copyright (C) 2011, 2012, 2013 Research In Motion Limited. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -203,6 +203,34 @@
     m_needsActiveScrollableAreaCalculation = false;
 }
 
+WebCore::IntRect InRegionScrollerPrivate::clipToRect(const WebCore::IntRect& clippingRect, InRegionScrollableArea* scrollable)
+{
+    RenderLayer* layer = scrollable->layer();
+    if (!layer)
+        return clippingRect;
+
+    if (layer->renderer()->isRenderView()) { // #document case
+        FrameView* view = toRenderView(layer->renderer())->frameView();
+        ASSERT(view);
+        ASSERT(canScrollInnerFrame(view->frame()));
+
+        WebCore::IntRect frameWindowRect = m_webPage->mapToTransformed(m_webPage->getRecursiveVisibleWindowRect(view));
+        frameWindowRect.intersect(clippingRect);
+        return frameWindowRect;
+    }
+
+    RenderBox* box = layer->renderBox();
+    ASSERT(box);
+    ASSERT(canScrollRenderBox(box));
+
+    // We want the window rect in pixel viewport coordinates clipped to the clipping rect.
+    WebCore::IntRect visibleWindowRect = enclosingIntRect(box->absoluteClippedOverflowRect());
+    visibleWindowRect = box->frame()->view()->contentsToWindow(visibleWindowRect);
+    visibleWindowRect = m_webPage->mapToTransformed(visibleWindowRect);
+    visibleWindowRect.intersect(clippingRect);
+    return visibleWindowRect;
+}
+
 void InRegionScrollerPrivate::calculateInRegionScrollableAreasForPoint(const WebCore::IntPoint& documentPoint)
 {
     ASSERT(m_activeInRegionScrollableAreas.empty());
@@ -216,10 +244,12 @@
     RenderLayer* layer = node->renderer()->enclosingLayer();
     if (!layer)
         return;
+
     do {
+
         RenderObject* renderer = layer->renderer();
 
-        if (renderer->isRenderView()) {
+        if (renderer && renderer->isRenderView()) {
             if (RenderView* renderView = toRenderView(renderer)) {
                 FrameView* view = renderView->frameView();
                 if (!view) {
@@ -258,41 +288,60 @@
     // we account for all and any clipping rects.
     WebCore::IntRect recursiveClippingRect(WebCore::IntPoint::zero(), m_webPage->transformedViewportSize());
 
-    std::vector<Platform::ScrollViewBase*>::reverse_iterator rend = m_activeInRegionScrollableAreas.rend();
-    for (std::vector<Platform::ScrollViewBase*>::reverse_iterator rit = m_activeInRegionScrollableAreas.rbegin(); rit != rend; ++rit) {
+    for (int i = m_activeInRegionScrollableAreas.size() - 1; i >= 0; --i) {
+        InRegionScrollableArea* scrollable = static_cast<InRegionScrollableArea*>(m_activeInRegionScrollableAreas[i]);
+        scrollable->setVisibleWindowRect(clipToRect(recursiveClippingRect, scrollable));
+        recursiveClippingRect = scrollable->visibleWindowRect();
+    }
+}
 
-        InRegionScrollableArea* curr = static_cast<InRegionScrollableArea*>(*rit);
-        RenderLayer* layer = curr->layer();
-        if (!layer)
-            continue;
+Platform::ScrollViewBase* InRegionScrollerPrivate::firstScrollableInRegionForNode(const Node* node)
+{
+    if (!node || !node->renderer())
+        return 0;
 
-        if (layer->renderer()->isRenderView()) { // #document case
-            FrameView* view = toRenderView(layer->renderer())->frameView();
-            ASSERT(view);
-            ASSERT(canScrollInnerFrame(view->frame()));
+    RenderLayer* layer = node->renderer()->enclosingLayer();
+    if (!layer)
+        return 0;
+    do {
+        RenderObject* renderer = layer->renderer();
 
-            WebCore::IntRect frameWindowRect = m_webPage->mapToTransformed(m_webPage->getRecursiveVisibleWindowRect(view));
-            frameWindowRect.intersect(recursiveClippingRect);
-            curr->setVisibleWindowRect(frameWindowRect);
-            recursiveClippingRect = frameWindowRect;
+        if (renderer->isRenderView()) {
+            if (RenderView* renderView = toRenderView(renderer)) {
+                FrameView* view = renderView->frameView();
+                if (!view) {
+                    reset();
+                    return 0;
+                }
 
-        } else { // RenderBox-based elements case (scrollable boxes (div's, p's, textarea's, etc)).
+                if (!renderView->compositor()->scrollLayer())
+                    continue;
 
-            RenderBox* box = layer->renderBox();
-            ASSERT(box);
-            ASSERT(canScrollRenderBox(box));
+                if (canScrollInnerFrame(view->frame()))
+                    return clipAndCreateInRegionScrollableArea(layer);
+            }
+        } else if (canScrollRenderBox(layer->renderBox()))
+            return clipAndCreateInRegionScrollableArea(layer);
 
-            WebCore::IntRect visibleWindowRect = enclosingIntRect(box->absoluteClippedOverflowRect());
-            visibleWindowRect = box->frame()->view()->contentsToWindow(visibleWindowRect);
-            visibleWindowRect = m_webPage->mapToTransformed(visibleWindowRect);
-            visibleWindowRect.intersect(recursiveClippingRect);
+        // If we run into a fix positioned layer, set the last scrollable in-region object
+        // as not able to propagate scroll to its parent scrollable.
+        if (isNonRenderViewFixedPositionedContainer(layer) && m_activeInRegionScrollableAreas.size()) {
+            Platform::ScrollViewBase* end = m_activeInRegionScrollableAreas.back();
+            end->setCanPropagateScrollingToEnclosingScrollable(false);
+        }
 
-            curr->setVisibleWindowRect(visibleWindowRect);
-            recursiveClippingRect = visibleWindowRect;
-        }
-    }
+    } while (layer = parentLayer(layer));
+    return 0;
 }
 
+Platform::ScrollViewBase* InRegionScrollerPrivate::clipAndCreateInRegionScrollableArea(RenderLayer* layer)
+{
+    WebCore::IntRect recursiveClippingRect(WebCore::IntPoint::zero(), m_webPage->transformedViewportSize());
+    InRegionScrollableArea* scrollable = new InRegionScrollableArea(m_webPage, layer);
+    scrollable->setVisibleWindowRect(clipToRect(recursiveClippingRect, scrollable));
+    return scrollable;
+}
+
 const std::vector<Platform::ScrollViewBase*>& InRegionScrollerPrivate::activeInRegionScrollableAreas() const
 {
     return m_activeInRegionScrollableAreas;

Modified: trunk/Source/WebKit/blackberry/Api/InRegionScroller.h (145414 => 145415)


--- trunk/Source/WebKit/blackberry/Api/InRegionScroller.h	2013-03-11 22:22:33 UTC (rev 145414)
+++ trunk/Source/WebKit/blackberry/Api/InRegionScroller.h	2013-03-11 22:25:51 UTC (rev 145415)
@@ -31,6 +31,7 @@
 class InRegionScrollerPrivate;
 class TouchEventHandler;
 class WebPagePrivate;
+class SelectionHandler;
 
 class BLACKBERRY_EXPORT InRegionScroller {
 public:
@@ -44,6 +45,7 @@
 private:
     friend class WebPagePrivate;
     friend class TouchEventHandler;
+    friend class SelectionHandler;
     InRegionScrollerPrivate *d;
     DISABLE_COPY(InRegionScroller)
 };

Modified: trunk/Source/WebKit/blackberry/Api/InRegionScroller_p.h (145414 => 145415)


--- trunk/Source/WebKit/blackberry/Api/InRegionScroller_p.h	2013-03-11 22:22:33 UTC (rev 145414)
+++ trunk/Source/WebKit/blackberry/Api/InRegionScroller_p.h	2013-03-11 22:25:51 UTC (rev 145415)
@@ -53,6 +53,7 @@
 
     void calculateInRegionScrollableAreasForPoint(const WebCore::IntPoint&);
     const std::vector<Platform::ScrollViewBase*>& activeInRegionScrollableAreas() const;
+    Platform::ScrollViewBase* firstScrollableInRegionForNode(const WebCore::Node*);
 
     void clearDocumentData(const WebCore::Document*);
 
@@ -69,9 +70,11 @@
     void pushBackInRegionScrollable(InRegionScrollableArea*);
 
     void adjustScrollDelta(const WebCore::IntPoint& maxOffset, const WebCore::IntPoint& currentOffset, WebCore::IntSize& delta) const;
+    Platform::ScrollViewBase* clipAndCreateInRegionScrollableArea(WebCore::RenderLayer*);
 
     bool isValidScrollableLayerWebKitThread(WebCore::LayerWebKitThread*) const;
     bool isValidScrollableNode(WebCore::Node*) const;
+    WebCore::IntRect clipToRect(const WebCore::IntRect&, InRegionScrollableArea*);
     std::vector<Platform::ScrollViewBase*> m_activeInRegionScrollableAreas;
 };
 

Modified: trunk/Source/WebKit/blackberry/ChangeLog (145414 => 145415)


--- trunk/Source/WebKit/blackberry/ChangeLog	2013-03-11 22:22:33 UTC (rev 145414)
+++ trunk/Source/WebKit/blackberry/ChangeLog	2013-03-11 22:25:51 UTC (rev 145415)
@@ -1,5 +1,34 @@
 2013-03-11  Genevieve Mak  <g...@rim.com>
 
+        [BlackBerry] Add a method to find the ScrollView for a text selection.
+        https://bugs.webkit.org/show_bug.cgi?id=112061
+
+        Reviewed by Rob Buis.
+
+        Internally reviewed by Mike Fenton and Jakob Petsovits.
+        PR #278490
+
+        Refactor the code in InRegionScroller so that we can add a method to find
+        the InRegionScrollableArea for a text selection.
+
+        * Api/InRegionScroller.cpp:
+        (BlackBerry::WebKit::InRegionScrollerPrivate::clipToRect):
+            - Pull out recursive clipping code into its own function.
+        (WebKit):
+        (BlackBerry::WebKit::InRegionScrollerPrivate::calculateInRegionScrollableAreasForPoint):
+        (BlackBerry::WebKit::InRegionScrollerPrivate::firstScrollableInRegionForNode):
+            - This new method allows us to get just the first scrollable region instead of looking
+              for more nested ones. We may want to refactor in the future because some of the code is
+              very similar to calculateInRegionScrollableAreasForPoint.
+        (BlackBerry::WebKit::InRegionScrollerPrivate::clipAndCreateInRegionScrollableArea):
+            - Add a convenience method for the previous function
+        * Api/InRegionScroller.h:
+        (WebKit):
+        * Api/InRegionScroller_p.h:
+        (InRegionScrollerPrivate):
+
+2013-03-11  Genevieve Mak  <g...@rim.com>
+
         [BlackBerry] Set the documentViewportRect and viewport size.
         https://bugs.webkit.org/show_bug.cgi?id=112056
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to