requestAnimationFrame causes bad location of position:fixed inside overflow:auto...
authorajuma@chromium.org <ajuma@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 2 Nov 2018 22:07:18 +0000 (22:07 +0000)
committerajuma@chromium.org <ajuma@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 2 Nov 2018 22:07:18 +0000 (22:07 +0000)
https://bugs.webkit.org/show_bug.cgi?id=176243

Reviewed by Simon Fraser.

When a new layer tree is committed to the UIProcess, the positions of layers for fixed
or sticky nodes in the newly-committed tree can be stale, because of scrolling that has
happened in the UIProcess since the tree was updated in the WebProcess. To handle this,
RemoteLayerTreeDrawingAreaProxy::commitLayerTree updates the positions of these layers
by calling RemoteScrollingCoordinatorProxy::viewportChangedViaDelegatedScrolling, which
leads to a recursive traversal of the ScrollingTree to update each such layer. However,
since ScrollingTreeFrameScrollingNodeIOS didn't implement updateLayersAfterAncestorChange,
this traversal never descended into scrolling nodes within an iframe, so the layers for
these nodes were left with stale positions.

Implement ScrollingTreeFrameScrollingNodeIOS::updateLayersAfterAncestorChange so that
fixed and sticky layers within an iframe do get their positions updated when a new layer
tree is committed.

* page/scrolling/ios/ScrollingTreeFrameScrollingNodeIOS.h:
* page/scrolling/ios/ScrollingTreeFrameScrollingNodeIOS.mm:
(WebCore::ScrollingTreeFrameScrollingNodeIOS::updateLayersAfterAncestorChange):

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

Source/WebCore/ChangeLog
Source/WebCore/page/scrolling/ios/ScrollingTreeFrameScrollingNodeIOS.h
Source/WebCore/page/scrolling/ios/ScrollingTreeFrameScrollingNodeIOS.mm

index 8a03c02..1278d46 100644 (file)
@@ -1,3 +1,28 @@
+2018-11-02  Ali Juma  <ajuma@chromium.org>
+
+        requestAnimationFrame causes bad location of position:fixed inside overflow:auto and iframe
+        https://bugs.webkit.org/show_bug.cgi?id=176243
+
+        Reviewed by Simon Fraser.
+
+        When a new layer tree is committed to the UIProcess, the positions of layers for fixed
+        or sticky nodes in the newly-committed tree can be stale, because of scrolling that has
+        happened in the UIProcess since the tree was updated in the WebProcess. To handle this,
+        RemoteLayerTreeDrawingAreaProxy::commitLayerTree updates the positions of these layers
+        by calling RemoteScrollingCoordinatorProxy::viewportChangedViaDelegatedScrolling, which
+        leads to a recursive traversal of the ScrollingTree to update each such layer. However,
+        since ScrollingTreeFrameScrollingNodeIOS didn't implement updateLayersAfterAncestorChange,
+        this traversal never descended into scrolling nodes within an iframe, so the layers for
+        these nodes were left with stale positions.
+
+        Implement ScrollingTreeFrameScrollingNodeIOS::updateLayersAfterAncestorChange so that
+        fixed and sticky layers within an iframe do get their positions updated when a new layer
+        tree is committed.
+
+        * page/scrolling/ios/ScrollingTreeFrameScrollingNodeIOS.h:
+        * page/scrolling/ios/ScrollingTreeFrameScrollingNodeIOS.mm:
+        (WebCore::ScrollingTreeFrameScrollingNodeIOS::updateLayersAfterAncestorChange):
+
 2018-11-02  Wenson Hsieh  <wenson_hsieh@apple.com>
 
         [iOS] Changing view scale sometimes does not zoom the page to the new initial scale, when the page is at initial scale
index e75baf4..a40886a 100644 (file)
@@ -53,6 +53,7 @@ protected:
 
     void updateLayersAfterViewportChange(const FloatRect& fixedPositionRect, double scale) override;
     void updateLayersAfterDelegatedScroll(const FloatPoint&) override;
+    void updateLayersAfterAncestorChange(const ScrollingTreeNode& changedNode, const FloatRect& fixedPositionRect, const FloatSize& cumulativeDelta) override;
 
     void setScrollLayerPosition(const FloatPoint&, const FloatRect& layoutViewport) override;
 
index f9905a7..55d53e5 100644 (file)
@@ -136,6 +136,16 @@ void ScrollingTreeFrameScrollingNodeIOS::updateLayersAfterViewportChange(const F
         child->updateLayersAfterAncestorChange(*this, fixedPositionRect, FloatSize());
 }
 
+void ScrollingTreeFrameScrollingNodeIOS::updateLayersAfterAncestorChange(const ScrollingTreeNode& changedNode, const FloatRect&, const FloatSize&)
+{
+    if (!m_children)
+        return;
+
+    FloatRect fixedPositionRect(scrollPosition(), scrollableAreaSize());
+    for (auto& child : *m_children)
+        child->updateLayersAfterAncestorChange(changedNode, fixedPositionRect, FloatSize());
+}
+
 void ScrollingTreeFrameScrollingNodeIOS::updateLayersAfterDelegatedScroll(const FloatPoint& scrollPosition)
 {
     updateChildNodesAfterScroll(scrollPosition);