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