Title: [186712] trunk/Source
Revision
186712
Author
[email protected]
Date
2015-07-11 11:19:46 -0700 (Sat, 11 Jul 2015)

Log Message

[iOS WK2] Scrolling issues on horizontally scrollable RTL pages
https://bugs.webkit.org/show_bug.cgi?id=146872
rdar://problem/7569416

Reviewed by Sam Weinig.

Horizontally scrollable RTL pages in WebKit2 had a variety of issues: they had
a gap down the right edge, and unreachable content on the left side, focussing
form fields scrolled to the wrong location, and programmatic scrolls scrolled
to the wrong place.

Fix by plumbing the WebCore notion of scrollOrigin through to the UI process,
and using it in various places. There are three main aspects to the patch:

1. scroll origin is included in RemoteLayerTreeTransaction, and plumbed through
   to -[WKWebView _scrollToContentOffset:] for correct programmatic scrolling,
Source/WebCore:

   including zooming to focussed form elements.
2. WebPageProxy::computeCustomFixedPositionRect() uses the actual documentRect()
   rather than just conjuring up a rect with a zero origin, which makes position:fixed
   work correctly.
3. _interactionViewsContainerView (which hosts tap highlights) is positioned to
   coincide with the origin of the documentRect (i.e. at the scroll origin, which
   may not be top-left). This allows tap highlights to show in the correct location.
4. ScrollView::unobscuredContentRect() is fixed to take scroll origin into account;
   if the returned rect is wrong, RenderLayer::hitTest() incorrectly clips the hit
   testing area.

* platform/ios/ScrollViewIOS.mm:
(WebCore::ScrollView::unobscuredContentRect):

Source/WebKit2:

   including zooming to focused form elements. The WKContentView's boundsOrigin
   is set to the scroll origin so that the view coordinates match document coordinates.
2. WebPageProxy::computeCustomFixedPositionRect() uses the actual documentRect()
   rather than just conjuring up a rect with a zero origin, which makes position:fixed
   work correctly.
3. _interactionViewsContainerView (which hosts tap highlights) is positioned to
   coincide with the origin of the documentRect (i.e. at the scroll origin, which
   may not be top-left). This allows tap highlights to show in the correct location.
4. ScrollView::unobscuredContentRect() is fixed to take scroll origin into account;
   if the returned rect is wrong, RenderLayer::hitTest() incorrectly clips the hit
   testing area.

* Shared/mac/RemoteLayerTreeTransaction.h:
(WebKit::RemoteLayerTreeTransaction::scrollOrigin):
(WebKit::RemoteLayerTreeTransaction::setScrollOrigin):
* Shared/mac/RemoteLayerTreeTransaction.mm:
(WebKit::RemoteLayerTreeTransaction::encode):
(WebKit::RemoteLayerTreeTransaction::decode):
(WebKit::RemoteLayerTreeTransaction::description): Dump some more info.
* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _scrollToContentOffset:scrollOrigin:]):
(-[WKWebView _scrollToContentOffset:]): Deleted.
* UIProcess/API/Cocoa/WKWebViewInternal.h:
* UIProcess/API/gtk/PageClientImpl.cpp:
(WebKit::PageClientImpl::requestScroll):
* UIProcess/API/gtk/PageClientImpl.h:
* UIProcess/CoordinatedGraphics/WebView.cpp:
(WebKit::WebView::requestScroll):
* UIProcess/CoordinatedGraphics/WebView.h:
* UIProcess/PageClient.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::requestScroll):
* UIProcess/WebPageProxy.h:
* UIProcess/ios/PageClientImplIOS.h:
* UIProcess/ios/PageClientImplIOS.mm:
(WebKit::PageClientImpl::requestScroll):
(WebKit::PageClientImpl::documentRect):
(WebKit::PageClientImpl::contentsSize): Deleted.
* UIProcess/ios/WKContentView.mm:
(-[WKContentView _didCommitLayerTree:]):
* UIProcess/ios/WebPageProxyIOS.mm:
(WebKit::WebPageProxy::computeCustomFixedPositionRect):
* UIProcess/mac/PageClientImpl.h:
* UIProcess/mac/PageClientImpl.mm:
(WebKit::PageClientImpl::requestScroll):
* UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm:
(WebKit::RemoteLayerTreeDrawingAreaProxy::commitLayerTree):
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::willCommitLayerTree):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (186711 => 186712)


--- trunk/Source/WebCore/ChangeLog	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebCore/ChangeLog	2015-07-11 18:19:46 UTC (rev 186712)
@@ -1,3 +1,35 @@
+2015-07-10  Simon Fraser  <[email protected]>
+
+        [iOS WK2] Scrolling issues on horizontally scrollable RTL pages
+        https://bugs.webkit.org/show_bug.cgi?id=146872
+        rdar://problem/7569416
+
+        Reviewed by Sam Weinig.
+
+        Horizontally scrollable RTL pages in WebKit2 had a variety of issues: they had
+        a gap down the right edge, and unreachable content on the left side, focussing
+        form fields scrolled to the wrong location, and programmatic scrolls scrolled
+        to the wrong place.
+        
+        Fix by plumbing the WebCore notion of scrollOrigin through to the UI process,
+        and using it in various places. There are three main aspects to the patch:
+        
+        1. scroll origin is included in RemoteLayerTreeTransaction, and plumbed through
+           to -[WKWebView _scrollToContentOffset:] for correct programmatic scrolling,
+           including zooming to focussed form elements.
+        2. WebPageProxy::computeCustomFixedPositionRect() uses the actual documentRect()
+           rather than just conjuring up a rect with a zero origin, which makes position:fixed
+           work correctly.
+        3. _interactionViewsContainerView (which hosts tap highlights) is positioned to 
+           coincide with the origin of the documentRect (i.e. at the scroll origin, which
+           may not be top-left). This allows tap highlights to show in the correct location.
+        4. ScrollView::unobscuredContentRect() is fixed to take scroll origin into account;
+           if the returned rect is wrong, RenderLayer::hitTest() incorrectly clips the hit
+           testing area.
+
+        * platform/ios/ScrollViewIOS.mm:
+        (WebCore::ScrollView::unobscuredContentRect):
+
 2015-07-10  Chris Dumez  <[email protected]>
 
         [WK2] Diagnostic logging messages are causing too much IPC

Modified: trunk/Source/WebCore/platform/ios/ScrollViewIOS.mm (186711 => 186712)


--- trunk/Source/WebCore/platform/ios/ScrollViewIOS.mm	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebCore/platform/ios/ScrollViewIOS.mm	2015-07-11 18:19:46 UTC (rev 186712)
@@ -108,7 +108,7 @@
     }
 
     if (!m_unobscuredContentSize.isEmpty())
-        return IntRect(IntPoint(m_scrollOffset), roundedIntSize(m_unobscuredContentSize));
+        return IntRect(scrollOrigin() + m_scrollOffset, roundedIntSize(m_unobscuredContentSize));
 
     return unobscuredContentRectInternal();
 }

Modified: trunk/Source/WebKit2/ChangeLog (186711 => 186712)


--- trunk/Source/WebKit2/ChangeLog	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebKit2/ChangeLog	2015-07-11 18:19:46 UTC (rev 186712)
@@ -1,3 +1,71 @@
+2015-07-10  Simon Fraser  <[email protected]>
+
+        [iOS WK2] Scrolling issues on horizontally scrollable RTL pages
+        https://bugs.webkit.org/show_bug.cgi?id=146872
+        rdar://problem/7569416
+
+        Reviewed by Sam Weinig.
+
+        Horizontally scrollable RTL pages in WebKit2 had a variety of issues: they had
+        a gap down the right edge, and unreachable content on the left side, focussing
+        form fields scrolled to the wrong location, and programmatic scrolls scrolled
+        to the wrong place.
+        
+        Fix by plumbing the WebCore notion of scrollOrigin through to the UI process,
+        and using it in various places. There are three main aspects to the patch:
+        
+        1. scroll origin is included in RemoteLayerTreeTransaction, and plumbed through
+           to -[WKWebView _scrollToContentOffset:] for correct programmatic scrolling,
+           including zooming to focused form elements. The WKContentView's boundsOrigin
+           is set to the scroll origin so that the view coordinates match document coordinates.
+        2. WebPageProxy::computeCustomFixedPositionRect() uses the actual documentRect()
+           rather than just conjuring up a rect with a zero origin, which makes position:fixed
+           work correctly.
+        3. _interactionViewsContainerView (which hosts tap highlights) is positioned to 
+           coincide with the origin of the documentRect (i.e. at the scroll origin, which
+           may not be top-left). This allows tap highlights to show in the correct location.
+        4. ScrollView::unobscuredContentRect() is fixed to take scroll origin into account;
+           if the returned rect is wrong, RenderLayer::hitTest() incorrectly clips the hit
+           testing area.
+
+        * Shared/mac/RemoteLayerTreeTransaction.h:
+        (WebKit::RemoteLayerTreeTransaction::scrollOrigin):
+        (WebKit::RemoteLayerTreeTransaction::setScrollOrigin):
+        * Shared/mac/RemoteLayerTreeTransaction.mm:
+        (WebKit::RemoteLayerTreeTransaction::encode):
+        (WebKit::RemoteLayerTreeTransaction::decode):
+        (WebKit::RemoteLayerTreeTransaction::description): Dump some more info.
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView _scrollToContentOffset:scrollOrigin:]):
+        (-[WKWebView _scrollToContentOffset:]): Deleted.
+        * UIProcess/API/Cocoa/WKWebViewInternal.h:
+        * UIProcess/API/gtk/PageClientImpl.cpp:
+        (WebKit::PageClientImpl::requestScroll):
+        * UIProcess/API/gtk/PageClientImpl.h:
+        * UIProcess/CoordinatedGraphics/WebView.cpp:
+        (WebKit::WebView::requestScroll):
+        * UIProcess/CoordinatedGraphics/WebView.h:
+        * UIProcess/PageClient.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::requestScroll):
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/ios/PageClientImplIOS.h:
+        * UIProcess/ios/PageClientImplIOS.mm:
+        (WebKit::PageClientImpl::requestScroll):
+        (WebKit::PageClientImpl::documentRect):
+        (WebKit::PageClientImpl::contentsSize): Deleted.
+        * UIProcess/ios/WKContentView.mm:
+        (-[WKContentView _didCommitLayerTree:]):
+        * UIProcess/ios/WebPageProxyIOS.mm:
+        (WebKit::WebPageProxy::computeCustomFixedPositionRect):
+        * UIProcess/mac/PageClientImpl.h:
+        * UIProcess/mac/PageClientImpl.mm:
+        (WebKit::PageClientImpl::requestScroll):
+        * UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm:
+        (WebKit::RemoteLayerTreeDrawingAreaProxy::commitLayerTree):
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::willCommitLayerTree):
+
 2015-07-10  Chris Dumez  <[email protected]>
 
         [WK2] Diagnostic logging messages are causing too much IPC

Modified: trunk/Source/WebKit2/Shared/mac/RemoteLayerTreeTransaction.h (186711 => 186712)


--- trunk/Source/WebKit2/Shared/mac/RemoteLayerTreeTransaction.h	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebKit2/Shared/mac/RemoteLayerTreeTransaction.h	2015-07-11 18:19:46 UTC (rev 186712)
@@ -195,6 +195,9 @@
 
     WebCore::IntSize contentsSize() const { return m_contentsSize; }
     void setContentsSize(const WebCore::IntSize& size) { m_contentsSize = size; };
+
+    WebCore::IntPoint scrollOrigin() const { return m_scrollOrigin; }
+    void setScrollOrigin(const WebCore::IntPoint& origin) { m_scrollOrigin = origin; };
     
     WebCore::Color pageExtendedBackgroundColor() const { return m_pageExtendedBackgroundColor; }
     void setPageExtendedBackgroundColor(WebCore::Color color) { m_pageExtendedBackgroundColor = color; }
@@ -242,6 +245,7 @@
     Vector<TransactionCallbackID> m_callbackIDs;
 
     WebCore::IntSize m_contentsSize;
+    WebCore::IntPoint m_scrollOrigin;
 #if PLATFORM(MAC)
     WebCore::IntPoint m_scrollPosition;
 #endif

Modified: trunk/Source/WebKit2/Shared/mac/RemoteLayerTreeTransaction.mm (186711 => 186712)


--- trunk/Source/WebKit2/Shared/mac/RemoteLayerTreeTransaction.mm	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebKit2/Shared/mac/RemoteLayerTreeTransaction.mm	2015-07-11 18:19:46 UTC (rev 186712)
@@ -516,6 +516,7 @@
     encoder << m_layerIDsWithNewlyUnreachableBackingStore;
 
     encoder << m_contentsSize;
+    encoder << m_scrollOrigin;
 #if PLATFORM(MAC)
     encoder << m_scrollPosition;
 #endif
@@ -581,6 +582,9 @@
     if (!decoder.decode(result.m_contentsSize))
         return false;
 
+    if (!decoder.decode(result.m_scrollOrigin))
+        return false;
+
 #if PLATFORM(MAC)
     if (!decoder.decode(result.m_scrollPosition))
         return false;
@@ -1242,6 +1246,15 @@
 {
     RemoteLayerTreeTextStream ts;
 
+    ts << "(";
+    dumpProperty(ts, "transactionID", m_transactionID);
+    dumpProperty(ts, "contentsSize", m_contentsSize);
+    if (m_scrollOrigin != IntPoint::zero())
+        dumpProperty(ts, "scrollOrigin", m_scrollOrigin);
+
+    if (m_pageScaleFactor != 1)
+        dumpProperty(ts, "pageScaleFactor", m_pageScaleFactor);
+
     ts << "(\n";
     ts.increaseIndent();
     ts.writeIndent();

Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (186711 => 186712)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm	2015-07-11 18:19:46 UTC (rev 186712)
@@ -1145,12 +1145,14 @@
     return contentOffset;
 }
 
-- (void)_scrollToContentOffset:(WebCore::FloatPoint)contentOffsetInPageCoordinates
+- (void)_scrollToContentOffset:(WebCore::FloatPoint)contentOffsetInPageCoordinates scrollOrigin:(WebCore::IntPoint)scrollOrigin
 {
     if (_dynamicViewportUpdateMode != DynamicViewportUpdateMode::NotResizing)
         return;
 
-    WebCore::FloatPoint scaledOffset = contentOffsetInPageCoordinates;
+    WebCore::FloatPoint contentOffsetRespectingOrigin = scrollOrigin + toFloatSize(contentOffsetInPageCoordinates);
+
+    WebCore::FloatPoint scaledOffset = contentOffsetRespectingOrigin;
     CGFloat zoomScale = contentZoomScale(self);
     scaledOffset.scale(zoomScale, zoomScale);
 

Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewInternal.h (186711 => 186712)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewInternal.h	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewInternal.h	2015-07-11 18:19:46 UTC (rev 186712)
@@ -81,7 +81,7 @@
 
 - (PassRefPtr<WebKit::ViewSnapshot>)_takeViewSnapshot;
 
-- (void)_scrollToContentOffset:(WebCore::FloatPoint)contentOffset;
+- (void)_scrollToContentOffset:(WebCore::FloatPoint)contentOffset scrollOrigin:(WebCore::IntPoint)scrollOrigin;
 - (BOOL)_scrollToRect:(WebCore::FloatRect)targetRect origin:(WebCore::FloatPoint)origin minimumScrollDistance:(float)minimumScrollDistance;
 - (void)_scrollByOffset:(WebCore::FloatPoint)offset;
 - (void)_zoomToFocusRect:(WebCore::FloatRect)focusedElementRect selectionRect:(WebCore::FloatRect)selectionRectInDocumentCoordinates fontSize:(float)fontSize minimumScale:(double)minimumScale maximumScale:(double)maximumScale allowScaling:(BOOL)allowScaling forceScroll:(BOOL)forceScroll;

Modified: trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp (186711 => 186712)


--- trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp	2015-07-11 18:19:46 UTC (rev 186712)
@@ -77,7 +77,7 @@
     setViewNeedsDisplay(scrollRect);
 }
 
-void PageClientImpl::requestScroll(const WebCore::FloatPoint&, bool)
+void PageClientImpl::requestScroll(const WebCore::FloatPoint&, const WebCore::IntPoint&, bool)
 {
     notImplemented();
 }

Modified: trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.h (186711 => 186712)


--- trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.h	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.h	2015-07-11 18:19:46 UTC (rev 186712)
@@ -58,7 +58,7 @@
     virtual void displayView() override;
     virtual bool canScrollView() override { return false; }
     virtual void scrollView(const WebCore::IntRect& scrollRect, const WebCore::IntSize& scrollOffset) override;
-    virtual void requestScroll(const WebCore::FloatPoint& scrollPosition, bool isProgrammaticScroll) override;
+    virtual void requestScroll(const WebCore::FloatPoint& scrollPosition, const WebCore::IntPoint& scrollOrigin, bool isProgrammaticScroll) override;
     virtual WebCore::IntSize viewSize() override;
     virtual bool isViewWindowActive() override;
     virtual bool isViewFocused() override;

Modified: trunk/Source/WebKit2/UIProcess/CoordinatedGraphics/WebView.cpp (186711 => 186712)


--- trunk/Source/WebKit2/UIProcess/CoordinatedGraphics/WebView.cpp	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebKit2/UIProcess/CoordinatedGraphics/WebView.cpp	2015-07-11 18:19:46 UTC (rev 186712)
@@ -304,7 +304,7 @@
     setViewNeedsDisplay(scrollRect);
 }
 
-void WebView::requestScroll(const WebCore::FloatPoint&, bool)
+void WebView::requestScroll(const WebCore::FloatPoint&, const WebCore::IntPoint&, bool)
 {
     notImplemented();
 }

Modified: trunk/Source/WebKit2/UIProcess/CoordinatedGraphics/WebView.h (186711 => 186712)


--- trunk/Source/WebKit2/UIProcess/CoordinatedGraphics/WebView.h	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebKit2/UIProcess/CoordinatedGraphics/WebView.h	2015-07-11 18:19:46 UTC (rev 186712)
@@ -128,7 +128,7 @@
 
     virtual bool canScrollView() override { return false; }
     virtual void scrollView(const WebCore::IntRect&, const WebCore::IntSize&) override;
-    virtual void requestScroll(const WebCore::FloatPoint&, bool) override;
+    virtual void requestScroll(const WebCore::FloatPoint&, const WebCore::IntPoint&, bool) override;
 
     virtual WebCore::IntSize viewSize() override;
 

Modified: trunk/Source/WebKit2/UIProcess/PageClient.h (186711 => 186712)


--- trunk/Source/WebKit2/UIProcess/PageClient.h	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebKit2/UIProcess/PageClient.h	2015-07-11 18:19:46 UTC (rev 186712)
@@ -97,7 +97,7 @@
     // Tell the view to scroll scrollRect by scrollOffset.
     virtual void scrollView(const WebCore::IntRect& scrollRect, const WebCore::IntSize& scrollOffset) = 0;
     // Tell the view to scroll to the given position, and whether this was a programmatic scroll.
-    virtual void requestScroll(const WebCore::FloatPoint& scrollPosition, bool isProgrammaticScroll) = 0;
+    virtual void requestScroll(const WebCore::FloatPoint& scrollPosition, const WebCore::IntPoint& scrollOrigin, bool isProgrammaticScroll) = 0;
 
     // Return the size of the view the page is associated with.
     virtual WebCore::IntSize viewSize() = 0;
@@ -279,7 +279,7 @@
     virtual void zoomToRect(WebCore::FloatRect, double minimumScale, double maximumScale) = 0;
     virtual void didChangeViewportMetaTagWidth(float) = 0;
     virtual double minimumZoomScale() const = 0;
-    virtual WebCore::FloatSize contentsSize() const = 0;
+    virtual WebCore::FloatRect documentRect() const = 0;
     virtual void overflowScrollViewWillStartPanGesture() = 0;
     virtual void overflowScrollViewDidScroll() = 0;
     virtual void overflowScrollWillStartScroll() = 0;

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (186711 => 186712)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp	2015-07-11 18:19:46 UTC (rev 186712)
@@ -1275,9 +1275,9 @@
     m_pageClient.scrollView(scrollRect, scrollOffset);
 }
 
-void WebPageProxy::requestScroll(const FloatPoint& scrollPosition, bool isProgrammaticScroll)
+void WebPageProxy::requestScroll(const FloatPoint& scrollPosition, const IntPoint& scrollOrigin, bool isProgrammaticScroll)
 {
-    m_pageClient.requestScroll(scrollPosition, isProgrammaticScroll);
+    m_pageClient.requestScroll(scrollPosition, scrollOrigin, isProgrammaticScroll);
 }
 
 void WebPageProxy::setSuppressVisibilityUpdates(bool flag)

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (186711 => 186712)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h	2015-07-11 18:19:46 UTC (rev 186712)
@@ -418,7 +418,7 @@
     void displayView();
     bool canScrollView();
     void scrollView(const WebCore::IntRect& scrollRect, const WebCore::IntSize& scrollOffset); // FIXME: CoordinatedGraphics should use requestScroll().
-    void requestScroll(const WebCore::FloatPoint& scrollPosition, bool isProgrammaticScroll);
+    void requestScroll(const WebCore::FloatPoint& scrollPosition, const WebCore::IntPoint& scrollOrigin, bool isProgrammaticScroll);
     
     void setDelegatesScrolling(bool delegatesScrolling) { m_delegatesScrolling = delegatesScrolling; }
     bool delegatesScrolling() const { return m_delegatesScrolling; }

Modified: trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.h (186711 => 186712)


--- trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.h	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.h	2015-07-11 18:19:46 UTC (rev 186712)
@@ -56,7 +56,7 @@
     virtual void displayView() override;
     virtual bool canScrollView() override;
     virtual void scrollView(const WebCore::IntRect& scrollRect, const WebCore::IntSize& scrollOffset) override;
-    virtual void requestScroll(const WebCore::FloatPoint& scrollPosition, bool isProgrammaticScroll) override;
+    virtual void requestScroll(const WebCore::FloatPoint& scrollPosition, const WebCore::IntPoint& scrollOrigin, bool isProgrammaticScroll) override;
     virtual WebCore::IntSize viewSize() override;
     virtual bool isViewWindowActive() override;
     virtual bool isViewFocused() override;
@@ -135,7 +135,7 @@
     virtual bool handleRunOpenPanel(WebPageProxy*, WebFrameProxy*, WebOpenPanelParameters*, WebOpenPanelResultListenerProxy*) override;
     virtual void didChangeViewportMetaTagWidth(float) override;
     virtual double minimumZoomScale() const override;
-    virtual WebCore::FloatSize contentsSize() const override;
+    virtual WebCore::FloatRect documentRect() const override;
 
     virtual void showInspectorHighlight(const WebCore::Highlight&) override;
     virtual void hideInspectorHighlight() override;

Modified: trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm (186711 => 186712)


--- trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm	2015-07-11 18:19:46 UTC (rev 186712)
@@ -154,10 +154,10 @@
     ASSERT_NOT_REACHED();
 }
 
-void PageClientImpl::requestScroll(const FloatPoint& scrollPosition, bool isProgrammaticScroll)
+void PageClientImpl::requestScroll(const FloatPoint& scrollPosition, const IntPoint& scrollOrigin, bool isProgrammaticScroll)
 {
     UNUSED_PARAM(isProgrammaticScroll);
-    [m_webView _scrollToContentOffset:scrollPosition];
+    [m_webView _scrollToContentOffset:scrollPosition scrollOrigin:scrollOrigin];
 }
 
 IntSize PageClientImpl::viewSize()
@@ -278,9 +278,9 @@
     return 1;
 }
 
-WebCore::FloatSize PageClientImpl::contentsSize() const
+WebCore::FloatRect PageClientImpl::documentRect() const
 {
-    return FloatSize([m_contentView bounds].size);
+    return [m_contentView bounds];
 }
 
 void PageClientImpl::setCursor(const Cursor&)

Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm (186711 => 186712)


--- trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm	2015-07-11 18:19:46 UTC (rev 186712)
@@ -494,14 +494,21 @@
 - (void)_didCommitLayerTree:(const WebKit::RemoteLayerTreeTransaction&)layerTreeTransaction
 {
     CGSize contentsSize = layerTreeTransaction.contentsSize();
-    CGRect contentBounds = { CGPointZero, contentsSize };
-    CGRect oldBounds = [self bounds];
+    CGPoint scrollOrigin = -layerTreeTransaction.scrollOrigin();
+    CGRect contentBounds = { scrollOrigin, contentsSize };
 
-    BOOL boundsChanged = !CGRectEqualToRect(oldBounds, contentBounds);
+    BOOL boundsChanged = !CGRectEqualToRect([self bounds], contentBounds);
     if (boundsChanged)
         [self setBounds:contentBounds];
 
     [_webView _didCommitLayerTree:layerTreeTransaction];
+
+    if (_interactionViewsContainerView) {
+        FloatPoint scaledOrigin = layerTreeTransaction.scrollOrigin();
+        float scale = [[_webView scrollView] zoomScale];
+        scaledOrigin.scale(scale, scale);
+        [_interactionViewsContainerView setFrame:CGRectMake(scaledOrigin.x(), scaledOrigin.y(), 0, 0)];
+    }
     
     if (boundsChanged) {
         FloatRect fixedPositionRect = _page->computeCustomFixedPositionRect(_page->unobscuredContentRect(), [[_webView scrollView] zoomScale]);

Modified: trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm (186711 => 186712)


--- trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm	2015-07-11 18:19:46 UTC (rev 186712)
@@ -217,8 +217,7 @@
 WebCore::FloatRect WebPageProxy::computeCustomFixedPositionRect(const FloatRect& unobscuredContentRect, double displayedContentScale, UnobscuredRectConstraint constraint) const
 {
     FloatRect constrainedUnobscuredRect = unobscuredContentRect;
-    FloatSize contentsSize = m_pageClient.contentsSize();
-    FloatRect documentRect = FloatRect(FloatPoint(), contentsSize);
+    FloatRect documentRect = m_pageClient.documentRect();
 
     if (m_pageClient.isAssistingNode())
         return documentRect;
@@ -238,7 +237,7 @@
         constrainedUnobscuredRect.setHeight(adjustedUnexposedMaxEdge(documentRect.maxY(), constrainedUnobscuredRect.maxY(), factor) - constrainedUnobscuredRect.y());
     }
     
-    return FrameView::rectForViewportConstrainedObjects(enclosingLayoutRect(constrainedUnobscuredRect), LayoutSize(contentsSize), displayedContentScale, false, StickToViewportBounds);
+    return FrameView::rectForViewportConstrainedObjects(enclosingLayoutRect(constrainedUnobscuredRect), LayoutSize(documentRect.size()), displayedContentScale, false, StickToViewportBounds);
 }
 
 void WebPageProxy::overflowScrollViewWillStartPanGesture()

Modified: trunk/Source/WebKit2/UIProcess/mac/PageClientImpl.h (186711 => 186712)


--- trunk/Source/WebKit2/UIProcess/mac/PageClientImpl.h	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebKit2/UIProcess/mac/PageClientImpl.h	2015-07-11 18:19:46 UTC (rev 186712)
@@ -61,7 +61,7 @@
     virtual void displayView() override;
     virtual bool canScrollView() override;
     virtual void scrollView(const WebCore::IntRect& scrollRect, const WebCore::IntSize& scrollOffset) override;
-    virtual void requestScroll(const WebCore::FloatPoint& scrollPosition, bool isProgrammaticScroll) override;
+    virtual void requestScroll(const WebCore::FloatPoint& scrollPosition, const WebCore::IntPoint& scrollOrigin, bool isProgrammaticScroll) override;
 
     virtual WebCore::IntSize viewSize() override;
     virtual bool isViewWindowActive() override;

Modified: trunk/Source/WebKit2/UIProcess/mac/PageClientImpl.mm (186711 => 186712)


--- trunk/Source/WebKit2/UIProcess/mac/PageClientImpl.mm	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebKit2/UIProcess/mac/PageClientImpl.mm	2015-07-11 18:19:46 UTC (rev 186712)
@@ -181,7 +181,7 @@
     ASSERT_NOT_REACHED();
 }
 
-void PageClientImpl::requestScroll(const FloatPoint& scrollPosition, bool isProgrammaticScroll)
+void PageClientImpl::requestScroll(const FloatPoint& scrollPosition, const IntPoint& scrollOrigin, bool isProgrammaticScroll)
 {
     ASSERT_NOT_REACHED();
 }

Modified: trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm (186711 => 186712)


--- trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm	2015-07-11 18:19:46 UTC (rev 186712)
@@ -219,7 +219,7 @@
     // Handle requested scroll position updates from the scrolling tree transaction after didCommitLayerTree()
     // has updated the view size based on the content size.
     if (requestedScrollInfo.requestsScrollPositionUpdate)
-        m_webPageProxy.requestScroll(requestedScrollInfo.requestedScrollPosition, requestedScrollInfo.requestIsProgrammaticScroll);
+        m_webPageProxy.requestScroll(requestedScrollInfo.requestedScrollPosition, layerTreeTransaction.scrollOrigin(), requestedScrollInfo.requestIsProgrammaticScroll);
 #endif // ENABLE(ASYNC_SCROLLING)
 
     if (m_debugIndicatorLayerTreeHost) {

Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (186711 => 186712)


--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp	2015-07-11 15:44:13 UTC (rev 186711)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp	2015-07-11 18:19:46 UTC (rev 186712)
@@ -2948,6 +2948,7 @@
 void WebPage::willCommitLayerTree(RemoteLayerTreeTransaction& layerTransaction)
 {
     layerTransaction.setContentsSize(corePage()->mainFrame().view()->contentsSize());
+    layerTransaction.setScrollOrigin(corePage()->mainFrame().view()->scrollOrigin());
     layerTransaction.setPageScaleFactor(corePage()->pageScaleFactor());
     layerTransaction.setRenderTreeSize(corePage()->renderTreeSize());
     layerTransaction.setPageExtendedBackgroundColor(corePage()->pageExtendedBackgroundColor());
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to