Title: [182787] releases/WebKitGTK/webkit-2.8/Source/WebCore
Revision
182787
Author
carlo...@webkit.org
Date
2015-04-14 02:01:50 -0700 (Tue, 14 Apr 2015)

Log Message

Merge r182773 - Regression: Scrolling on popsci.com spends too much time in FrameView::viewportsContentsChanged()
https://bugs.webkit.org/show_bug.cgi?id=143675

Reviewed by Simon Fraser.

Optimize resumeVisibleImageAnimationsIncludingSubframes() so that the FrameViews'
windowClipRect gets computed less often:
- Cache the FrameView's windowClipRect before resuming image animations in subframes
  as calling windowClipRect() on those subframes' view is going to call windowClipRect()
  on their ancestors. This avoids a lot of unnecessary windowClipRect recomputations
  in deep frame trees.
- Stop traversing the Frame tree if the current frame does not have a content
  renderer, as this means the subframes won't have one either.
- Stop traversing the Frame tree if the current frame's view has an empty
  windowClipRect() as this means the windowClipRect will be empty for those
  subframes as well.

On popsci.com, this cuts down the number of uncached windowClipRect() calls by
approximately half. I see viewportsContentsChanged() at ~0.4% when scrolling
on popsci.com after this change.

* page/FrameView.cpp:
(WebCore::FrameView::resumeVisibleImageAnimationsIncludingSubframes):
(WebCore::FrameView::windowClipRect):
* page/FrameView.h:
* rendering/RenderView.cpp:
(WebCore::RenderView::resumePausedImageAnimationsIfNeeded):
* rendering/RenderView.h:

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/ChangeLog (182786 => 182787)


--- releases/WebKitGTK/webkit-2.8/Source/WebCore/ChangeLog	2015-04-14 08:40:07 UTC (rev 182786)
+++ releases/WebKitGTK/webkit-2.8/Source/WebCore/ChangeLog	2015-04-14 09:01:50 UTC (rev 182787)
@@ -1,3 +1,34 @@
+2015-04-13  Chris Dumez  <cdu...@apple.com>
+
+        Regression: Scrolling on popsci.com spends too much time in FrameView::viewportsContentsChanged()
+        https://bugs.webkit.org/show_bug.cgi?id=143675
+
+        Reviewed by Simon Fraser.
+
+        Optimize resumeVisibleImageAnimationsIncludingSubframes() so that the FrameViews'
+        windowClipRect gets computed less often:
+        - Cache the FrameView's windowClipRect before resuming image animations in subframes
+          as calling windowClipRect() on those subframes' view is going to call windowClipRect()
+          on their ancestors. This avoids a lot of unnecessary windowClipRect recomputations
+          in deep frame trees.
+        - Stop traversing the Frame tree if the current frame does not have a content
+          renderer, as this means the subframes won't have one either.
+        - Stop traversing the Frame tree if the current frame's view has an empty
+          windowClipRect() as this means the windowClipRect will be empty for those
+          subframes as well.
+
+        On popsci.com, this cuts down the number of uncached windowClipRect() calls by
+        approximately half. I see viewportsContentsChanged() at ~0.4% when scrolling
+        on popsci.com after this change.
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::resumeVisibleImageAnimationsIncludingSubframes):
+        (WebCore::FrameView::windowClipRect):
+        * page/FrameView.h:
+        * rendering/RenderView.cpp:
+        (WebCore::RenderView::resumePausedImageAnimationsIfNeeded):
+        * rendering/RenderView.h:
+
 2015-04-13  Said Abou-Hallawa  <sabouhall...@apple.com>
 
         Canvas drawImage() has a security hole when the image isn't yet fully loaded.

Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/page/FrameView.cpp (182786 => 182787)


--- releases/WebKitGTK/webkit-2.8/Source/WebCore/page/FrameView.cpp	2015-04-14 08:40:07 UTC (rev 182786)
+++ releases/WebKitGTK/webkit-2.8/Source/WebCore/page/FrameView.cpp	2015-04-14 09:01:50 UTC (rev 182787)
@@ -2140,10 +2140,23 @@
 
 void FrameView::resumeVisibleImageAnimationsIncludingSubframes()
 {
-    // A change in scroll position may affect image visibility in subframes.
-    for (auto* frame = m_frame.get(); frame; frame = frame->tree().traverseNext(m_frame.get())) {
-        if (auto* renderView = frame->contentRenderer())
-            renderView->resumePausedImageAnimationsIfNeeded();
+    auto* renderView = frame().contentRenderer();
+    if (!renderView)
+        return;
+
+    IntRect windowClipRect = this->windowClipRect();
+    auto visibleRect = windowToContents(windowClipRect);
+    if (visibleRect.isEmpty())
+        return;
+
+    // Resume paused image animations in this frame.
+    renderView->resumePausedImageAnimationsIfNeeded(visibleRect);
+
+    // Recursive call for subframes. We cache the current FrameView's windowClipRect to avoid recomputing it for every subframe.
+    TemporaryChange<IntRect*> windowClipRectCache(m_cachedWindowClipRect, &windowClipRect);
+    for (Frame* childFrame = frame().tree().firstChild(); childFrame; childFrame = childFrame->tree().nextSibling()) {
+        if (auto* childView = childFrame->view())
+            childView->resumeVisibleImageAnimationsIncludingSubframes();
     }
 }
 
@@ -3266,6 +3279,9 @@
 {
     ASSERT(frame().view() == this);
 
+    if (m_cachedWindowClipRect)
+        return *m_cachedWindowClipRect;
+
     if (paintsEntireContents())
         return contentsToWindow(IntRect(IntPoint(), totalContentsSize()));
 

Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/page/FrameView.h (182786 => 182787)


--- releases/WebKitGTK/webkit-2.8/Source/WebCore/page/FrameView.h	2015-04-14 08:40:07 UTC (rev 182786)
+++ releases/WebKitGTK/webkit-2.8/Source/WebCore/page/FrameView.h	2015-04-14 09:01:50 UTC (rev 182787)
@@ -782,6 +782,8 @@
     bool m_visualUpdatesAllowedByClient;
     
     ScrollPinningBehavior m_scrollPinningBehavior;
+
+    IntRect* m_cachedWindowClipRect { nullptr };
 };
 
 inline void FrameView::incrementVisuallyNonEmptyCharacterCount(unsigned count)

Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderView.cpp (182786 => 182787)


--- releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderView.cpp	2015-04-14 08:40:07 UTC (rev 182786)
+++ releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderView.cpp	2015-04-14 09:01:50 UTC (rev 182787)
@@ -1356,9 +1356,8 @@
     m_renderersWithPausedImageAnimation.remove(&renderer);
 }
 
-void RenderView::resumePausedImageAnimationsIfNeeded()
+void RenderView::resumePausedImageAnimationsIfNeeded(IntRect visibleRect)
 {
-    auto visibleRect = frameView().windowToContents(frameView().windowClipRect());
     Vector<RenderElement*, 10> toRemove;
     for (auto* renderer : m_renderersWithPausedImageAnimation) {
         if (renderer->repaintForPausedImageAnimationsIfNeeded(visibleRect))

Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderView.h (182786 => 182787)


--- releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderView.h	2015-04-14 08:40:07 UTC (rev 182786)
+++ releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderView.h	2015-04-14 09:01:50 UTC (rev 182787)
@@ -224,7 +224,7 @@
     void didCreateRenderer() { ++m_rendererCount; }
     void didDestroyRenderer() { --m_rendererCount; }
 
-    void resumePausedImageAnimationsIfNeeded();
+    void resumePausedImageAnimationsIfNeeded(IntRect visibleRect);
     void addRendererWithPausedImageAnimations(RenderElement&);
     void removeRendererWithPausedImageAnimations(RenderElement&);
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to