ScrollingCoordinator::updateSynchronousScrollingReasons should consider non-main...
authorfred.wang@free.fr <fred.wang@free.fr@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 1 Jun 2017 18:04:29 +0000 (18:04 +0000)
committerfred.wang@free.fr <fred.wang@free.fr@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 1 Jun 2017 18:04:29 +0000 (18:04 +0000)
https://bugs.webkit.org/show_bug.cgi?id=172806

Patch by Frederic Wang <fwang@igalia.com> on 2017-06-01
Reviewed by Simon Fraser.

Currently, the scrolling coordinator does not manage scrolling of frames other than the main
one (bugs 171667 and 149264) and so ScrollingCoordinator::updateSynchronousScrollingReasons
is only relevant for the main frame. This commit refactors a bit ScrollingCoordinator so that
updateSynchronousScrollingReasons is considered for all the frames whose scrolling is
coordinated by the ScrollingCoordinator so non-main frames will be considered in the future.

No new tests, behavior is unchanged for now.

* page/scrolling/ScrollingCoordinator.cpp:
(WebCore::ScrollingCoordinator::updateSynchronousScrollingReasons): Add an ASSERT to ensure
that this function is only called for frame whose scrolling is coordinated by this class.
(WebCore::ScrollingCoordinator::updateSynchronousScrollingReasonsForAllFrames): Introduce a
new function to update synchronous scrolling for subframes whose scrolling is coordinated by
this class.
(WebCore::ScrollingCoordinator::setForceSynchronousScrollLayerPositionUpdates): Update
synchronous scrolling reason for non-main frames too.
(WebCore::ScrollingCoordinator::replaySessionStateDidChange): Update synchronous scrolling
reason for non-main frames too.
* page/scrolling/ScrollingCoordinator.h: Define updateSynchronousScrollingReasonsForAllFrames

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

Source/WebCore/ChangeLog
Source/WebCore/page/scrolling/ScrollingCoordinator.cpp
Source/WebCore/page/scrolling/ScrollingCoordinator.h

index e0f7f90..2dbc7f8 100644 (file)
@@ -1,3 +1,30 @@
+2017-06-01  Frederic Wang  <fwang@igalia.com>
+
+        ScrollingCoordinator::updateSynchronousScrollingReasons should consider non-main frames
+        https://bugs.webkit.org/show_bug.cgi?id=172806
+
+        Reviewed by Simon Fraser.
+
+        Currently, the scrolling coordinator does not manage scrolling of frames other than the main
+        one (bugs 171667 and 149264) and so ScrollingCoordinator::updateSynchronousScrollingReasons
+        is only relevant for the main frame. This commit refactors a bit ScrollingCoordinator so that
+        updateSynchronousScrollingReasons is considered for all the frames whose scrolling is
+        coordinated by the ScrollingCoordinator so non-main frames will be considered in the future.
+
+        No new tests, behavior is unchanged for now.
+
+        * page/scrolling/ScrollingCoordinator.cpp:
+        (WebCore::ScrollingCoordinator::updateSynchronousScrollingReasons): Add an ASSERT to ensure
+        that this function is only called for frame whose scrolling is coordinated by this class.
+        (WebCore::ScrollingCoordinator::updateSynchronousScrollingReasonsForAllFrames): Introduce a
+        new function to update synchronous scrolling for subframes whose scrolling is coordinated by
+        this class.
+        (WebCore::ScrollingCoordinator::setForceSynchronousScrollLayerPositionUpdates): Update
+        synchronous scrolling reason for non-main frames too.
+        (WebCore::ScrollingCoordinator::replaySessionStateDidChange): Update synchronous scrolling
+        reason for non-main frames too.
+        * page/scrolling/ScrollingCoordinator.h: Define updateSynchronousScrollingReasonsForAllFrames
+
 2017-06-01  Andy Estes  <aestes@apple.com>
 
         [Cocoa] Upstream support for JCB as a supported payment network
index 6dbd3a8..d82c828 100644 (file)
@@ -345,22 +345,27 @@ SynchronousScrollingReasons ScrollingCoordinator::synchronousScrollingReasons(co
 
 void ScrollingCoordinator::updateSynchronousScrollingReasons(FrameView& frameView)
 {
-    // FIXME: Once we support async scrolling of iframes, we'll have to track the synchronous scrolling
-    // reasons per frame (maybe on scrolling tree nodes).
-    if (!frameView.frame().isMainFrame())
-        return;
-
+    ASSERT(coordinatesScrollingForFrameView(frameView));
     setSynchronousScrollingReasons(frameView, synchronousScrollingReasons(frameView));
 }
 
+void ScrollingCoordinator::updateSynchronousScrollingReasonsForAllFrames()
+{
+    for (Frame* frame = &m_page->mainFrame(); frame; frame = frame->tree().traverseNext()) {
+        if (FrameView* frameView = frame->view()) {
+            if (coordinatesScrollingForFrameView(*frameView))
+                updateSynchronousScrollingReasons(*frameView);
+        }
+    }
+}
+
 void ScrollingCoordinator::setForceSynchronousScrollLayerPositionUpdates(bool forceSynchronousScrollLayerPositionUpdates)
 {
     if (m_forceSynchronousScrollLayerPositionUpdates == forceSynchronousScrollLayerPositionUpdates)
         return;
 
     m_forceSynchronousScrollLayerPositionUpdates = forceSynchronousScrollLayerPositionUpdates;
-    if (FrameView* frameView = m_page->mainFrame().view())
-        updateSynchronousScrollingReasons(*frameView);
+    updateSynchronousScrollingReasonsForAllFrames();
 }
 
 bool ScrollingCoordinator::shouldUpdateScrollLayerPositionSynchronously(const FrameView& frameView) const
@@ -374,9 +379,7 @@ bool ScrollingCoordinator::shouldUpdateScrollLayerPositionSynchronously(const Fr
 #if ENABLE(WEB_REPLAY)
 void ScrollingCoordinator::replaySessionStateDidChange()
 {
-    // FIXME: Once we support async scrolling of iframes, this should go through all subframes.
-    if (FrameView* frameView = m_page->mainFrame().view())
-        updateSynchronousScrollingReasons(*frameView);
+    updateSynchronousScrollingReasonsForAllFrames();
 }
 #endif
 
index 56b0993..34a6b37 100644 (file)
@@ -238,6 +238,7 @@ private:
 
     virtual bool hasVisibleSlowRepaintViewportConstrainedObjects(const FrameView&) const;
     void updateSynchronousScrollingReasons(FrameView&);
+    void updateSynchronousScrollingReasonsForAllFrames();
 
     EventTrackingRegions absoluteEventTrackingRegionsForFrame(const Frame&) const;