Change RenderLayer::scrollTo() to take a ScrollPosition
authorsimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 1 Jan 2016 07:53:30 +0000 (07:53 +0000)
committersimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 1 Jan 2016 07:53:30 +0000 (07:53 +0000)
https://bugs.webkit.org/show_bug.cgi?id=152633

Reviewed by Zalan Bujtas.

RenderLayer::scrollTo() took x and y offsets. Change this to take a position,
like ScrollView::scrollTo() and fix the one caller.

Preserve the dubious behavior of the adjustForIOSCaretWhenScrolling() code by converting
to and from offsets, even though testing suggests that this code can just be removed,
even with an extra wide caret for testing.

* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::scrollTo):
(WebCore::RenderLayer::setScrollOffset):
* rendering/RenderLayer.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@194478 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/rendering/RenderLayer.cpp
Source/WebCore/rendering/RenderLayer.h

index 0860edd..f808233 100644 (file)
@@ -1,5 +1,24 @@
 2015-12-31  Simon Fraser  <simon.fraser@apple.com>
 
+        Change RenderLayer::scrollTo() to take a ScrollPosition
+        https://bugs.webkit.org/show_bug.cgi?id=152633
+
+        Reviewed by Zalan Bujtas.
+        
+        RenderLayer::scrollTo() took x and y offsets. Change this to take a position,
+        like ScrollView::scrollTo() and fix the one caller.
+        
+        Preserve the dubious behavior of the adjustForIOSCaretWhenScrolling() code by converting
+        to and from offsets, even though testing suggests that this code can just be removed,
+        even with an extra wide caret for testing.
+
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::scrollTo):
+        (WebCore::RenderLayer::setScrollOffset):
+        * rendering/RenderLayer.h:
+
+2015-12-31  Simon Fraser  <simon.fraser@apple.com>
+
         Rename documentScrollOffsetRelativeTo* functions
         https://bugs.webkit.org/show_bug.cgi?id=152632
 
index 4e46236..dd52ac6 100644 (file)
@@ -2326,38 +2326,37 @@ void RenderLayer::scrollToOffset(const ScrollOffset& scrollOffset, ScrollOffsetC
         scrollToOffsetWithoutAnimation(newScrollOffset);
 }
 
-// x and y are scroll offset values
-// FIXME: use a ScrollOffset, or change this to take a ScrollPosition.
-void RenderLayer::scrollTo(int x, int y)
+void RenderLayer::scrollTo(const ScrollPosition& position)
 {
     RenderBox* box = renderBox();
     if (!box)
         return;
 
+    ScrollPosition newPosition = position;
     if (box->style().overflowX() != OMARQUEE) {
         // Ensure that the dimensions will be computed if they need to be (for overflow:hidden blocks).
         if (m_scrollDimensionsDirty)
             computeScrollDimensions();
 #if PLATFORM(IOS)
         if (adjustForIOSCaretWhenScrolling()) {
-            int maxX = scrollWidth() - box->clientWidth();
-            if (x > maxX - caretWidth) {
-                x += caretWidth;
-                if (x <= caretWidth)
-                    x = 0;
-            } else if (x < m_scrollPosition.x() - caretWidth)
-                x -= caretWidth;
+            // FIXME: It's not clear what this code is trying to do. Behavior seems reasonable with it removed.
+            int maxOffset = scrollWidth() - box->clientWidth();
+            ScrollOffset newOffset = scrollOffsetFromPosition(newPosition);
+            int scrollXOffset = newOffset.x();
+            if (scrollXOffset > maxOffset - caretWidth) {
+                scrollXOffset += caretWidth;
+                if (scrollXOffset <= caretWidth)
+                    scrollXOffset = 0;
+            } else if (scrollXOffset < m_scrollPosition.x() - caretWidth)
+                scrollXOffset -= caretWidth;
+
+            newOffset.setX(scrollXOffset);
+            newPosition = scrollPositionFromOffset(newOffset);
         }
 #endif
     }
     
-    // FIXME: Eventually, we will want to perform a blit.  For now never
-    // blit, since the check for blitting is going to be very
-    // complicated (since it will involve testing whether our layer
-    // is either occluded by another layer or clipped by an enclosing
-    // layer or contains fixed backgrounds, etc.).
-    ScrollPosition newScrollPosition = scrollPositionFromOffset(ScrollOffset(x, y));
-    if (m_scrollPosition == newScrollPosition) {
+    if (m_scrollPosition == newPosition) {
 #if PLATFORM(IOS)
         if (m_requiresScrollBoundsOriginUpdate)
             updateCompositingLayersAfterScroll();
@@ -2366,7 +2365,7 @@ void RenderLayer::scrollTo(int x, int y)
     }
     
     ScrollPosition oldPosition = IntPoint(m_scrollPosition);
-    m_scrollPosition = newScrollPosition;
+    m_scrollPosition = newPosition;
 
     RenderView& view = renderer().view();
 
@@ -2417,7 +2416,7 @@ void RenderLayer::scrollTo(int x, int y)
     // Schedule the scroll and scroll-related DOM events.
     if (Element* element = renderer().element()) {
         element->document().eventQueue().enqueueOrDispatchScrollEvent(*element);
-        element->document().sendWillRevealEdgeEventsIfNeeded(oldPosition, newScrollPosition, visibleContentRect(), contentsSize(), element);
+        element->document().sendWillRevealEdgeEventsIfNeeded(oldPosition, newPosition, visibleContentRect(), contentsSize(), element);
     }
 
     if (scrollsOverflow())
@@ -2719,9 +2718,9 @@ int RenderLayer::scrollSize(ScrollbarOrientation orientation) const
     return scrollbar ? (scrollbar->totalSize() - scrollbar->visibleSize()) : 0;
 }
 
-void RenderLayer::setScrollOffset(const IntPoint& offset)
+void RenderLayer::setScrollOffset(const ScrollOffset& offset)
 {
-    scrollTo(offset.x(), offset.y());
+    scrollTo(scrollPositionFromOffset(offset));
 }
 
 int RenderLayer::scrollPosition(Scrollbar* scrollbar) const
index dd6d899..cc45692 100644 (file)
@@ -863,7 +863,7 @@ private:
     virtual IntPoint convertFromScrollbarToContainingView(const Scrollbar*, const IntPoint&) const override;
     virtual IntPoint convertFromContainingViewToScrollbar(const Scrollbar*, const IntPoint&) const override;
     virtual int scrollSize(ScrollbarOrientation) const override;
-    virtual void setScrollOffset(const IntPoint&) override;
+    virtual void setScrollOffset(const ScrollOffset&) override;
 
     virtual ScrollPosition scrollPosition() const override { return m_scrollPosition; }
     virtual ScrollPosition maximumScrollPosition() const override;
@@ -892,7 +892,7 @@ private:
     LayoutRect scrollCornerAndResizerRect() const;
 
     // NOTE: This should only be called by the overriden setScrollOffset from ScrollableArea.
-    void scrollTo(int, int);
+    void scrollTo(const ScrollPosition&);
     void updateCompositingLayersAfterScroll();
 
     IntSize scrollbarOffset(const Scrollbar*) const;