Modified: releases/WebKitGTK/webkit-2.6/Source/WebCore/ChangeLog (174970 => 174971)
--- releases/WebKitGTK/webkit-2.6/Source/WebCore/ChangeLog 2014-10-21 16:06:35 UTC (rev 174970)
+++ releases/WebKitGTK/webkit-2.6/Source/WebCore/ChangeLog 2014-10-21 16:23:44 UTC (rev 174971)
@@ -1,3 +1,37 @@
+2014-10-14 Chris Dumez <cdu...@apple.com>
+
+ Introduce an isCSSAnimated flag on RenderElement for performance
+ https://bugs.webkit.org/show_bug.cgi?id=137583
+
+ Reviewed by Simon Fraser.
+
+ I noticed when profiling the ebay.com page load that isRunningAnimationOnRenderer()
+ and isRunningAcceleratedAnimationOnRenderer() were called frequently, causing
+ ~4.7 millions m_compositeAnimations HashMap lookups.
+
+ This patch introduces an isCSSAnimated flag on RenderElement to return early if
+ there is no animation on the renderer, thus avoiding HashMap lookups. This reduces
+ the number of HashMap lookups from ~4.7 millions to ~68k. On my machine, I see
+ the following performance improvements:
+ - isRunning*AnimationOnRenderer() / computeCompositingRequirements()
+ - before: ~45ms / ~90ms
+ - after: ~4ms / ~30ms
+
+ No new tests, no behavior change.
+
+ * page/animation/AnimationController.cpp:
+ (WebCore::AnimationControllerPrivate::ensureCompositeAnimation):
+ (WebCore::AnimationControllerPrivate::clear):
+ (WebCore::AnimationControllerPrivate::isRunningAnimationOnRenderer):
+ (WebCore::AnimationControllerPrivate::isRunningAcceleratedAnimationOnRenderer):
+ (WebCore::AnimationController::isRunningAnimationOnRenderer):
+ (WebCore::AnimationController::isRunningAcceleratedAnimationOnRenderer):
+ * rendering/RenderElement.cpp:
+ (WebCore::RenderElement::RenderElement):
+ * rendering/RenderElement.h:
+ (WebCore::RenderElement::isCSSAnimating):
+ (WebCore::RenderElement::setIsCSSAnimating):
+
2014-10-14 Youenn Fablet <youe...@gmail.com>
[XHR] Abort method execution when m_loader->cancel() in internalAbort() caused reentry
Modified: releases/WebKitGTK/webkit-2.6/Source/WebCore/page/animation/AnimationController.cpp (174970 => 174971)
--- releases/WebKitGTK/webkit-2.6/Source/WebCore/page/animation/AnimationController.cpp 2014-10-21 16:06:35 UTC (rev 174970)
+++ releases/WebKitGTK/webkit-2.6/Source/WebCore/page/animation/AnimationController.cpp 2014-10-21 16:23:44 UTC (rev 174971)
@@ -70,8 +70,10 @@
CompositeAnimation& AnimationControllerPrivate::ensureCompositeAnimation(RenderElement* renderer)
{
auto result = m_compositeAnimations.add(renderer, nullptr);
- if (result.isNewEntry)
+ if (result.isNewEntry) {
result.iterator->value = CompositeAnimation::create(this);
+ renderer->setIsCSSAnimating(true);
+ }
return *result.iterator->value;
}
@@ -82,6 +84,7 @@
RefPtr<CompositeAnimation> animation = m_compositeAnimations.take(renderer);
if (!animation)
return false;
+ renderer->setIsCSSAnimating(false);
animation->clearRenderer();
return animation->isSuspended();
}
@@ -238,14 +241,18 @@
bool AnimationControllerPrivate::isRunningAnimationOnRenderer(RenderElement* renderer, CSSPropertyID property, AnimationBase::RunningState runningState) const
{
- const CompositeAnimation* animation = m_compositeAnimations.get(renderer);
- return animation && animation->isAnimatingProperty(property, false, runningState);
+ ASSERT(renderer->isCSSAnimating());
+ ASSERT(m_compositeAnimations.contains(renderer));
+ const CompositeAnimation& animation = *m_compositeAnimations.get(renderer);
+ return animation.isAnimatingProperty(property, false, runningState);
}
bool AnimationControllerPrivate::isRunningAcceleratedAnimationOnRenderer(RenderElement* renderer, CSSPropertyID property, AnimationBase::RunningState runningState) const
{
- const CompositeAnimation* animation = m_compositeAnimations.get(renderer);
- return animation && animation->isAnimatingProperty(property, true, runningState);
+ ASSERT(renderer->isCSSAnimating());
+ ASSERT(m_compositeAnimations.contains(renderer));
+ const CompositeAnimation& animation = *m_compositeAnimations.get(renderer);
+ return animation.isAnimatingProperty(property, true, runningState);
}
void AnimationControllerPrivate::suspendAnimations()
@@ -557,12 +564,12 @@
bool AnimationController::isRunningAnimationOnRenderer(RenderElement* renderer, CSSPropertyID property, AnimationBase::RunningState runningState) const
{
- return m_data->isRunningAnimationOnRenderer(renderer, property, runningState);
+ return renderer->isCSSAnimating() && m_data->isRunningAnimationOnRenderer(renderer, property, runningState);
}
bool AnimationController::isRunningAcceleratedAnimationOnRenderer(RenderElement* renderer, CSSPropertyID property, AnimationBase::RunningState runningState) const
{
- return m_data->isRunningAcceleratedAnimationOnRenderer(renderer, property, runningState);
+ return renderer->isCSSAnimating() && m_data->isRunningAcceleratedAnimationOnRenderer(renderer, property, runningState);
}
bool AnimationController::isSuspended() const
Modified: releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderElement.cpp (174970 => 174971)
--- releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderElement.cpp 2014-10-21 16:06:35 UTC (rev 174970)
+++ releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderElement.cpp 2014-10-21 16:23:44 UTC (rev 174971)
@@ -86,6 +86,7 @@
, m_renderBoxNeedsLazyRepaint(false)
, m_hasPausedImageAnimations(false)
, m_hasCounterNodeMap(false)
+ , m_isCSSAnimating(false)
, m_firstChild(nullptr)
, m_lastChild(nullptr)
, m_style(WTF::move(style))
Modified: releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderElement.h (174970 => 174971)
--- releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderElement.h 2014-10-21 16:06:35 UTC (rev 174970)
+++ releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderElement.h 2014-10-21 16:23:44 UTC (rev 174971)
@@ -158,6 +158,9 @@
bool hasCounterNodeMap() const { return m_hasCounterNodeMap; }
void setHasCounterNodeMap(bool f) { m_hasCounterNodeMap = f; }
+ bool isCSSAnimating() const { return m_isCSSAnimating; }
+ void setIsCSSAnimating(bool b) { m_isCSSAnimating = b; }
+
protected:
enum BaseTypeFlags {
RenderLayerModelObjectFlag = 1 << 0,
@@ -224,13 +227,14 @@
virtual void newImageAnimationFrameAvailable(CachedImage&) final override;
unsigned m_baseTypeFlags : 6;
- bool m_ancestorLineBoxDirty : 1;
- bool m_hasInitializedStyle : 1;
+ unsigned m_ancestorLineBoxDirty : 1;
+ unsigned m_hasInitializedStyle : 1;
- bool m_renderInlineAlwaysCreatesLineBoxes : 1;
- bool m_renderBoxNeedsLazyRepaint : 1;
- bool m_hasPausedImageAnimations : 1;
- bool m_hasCounterNodeMap : 1;
+ unsigned m_renderInlineAlwaysCreatesLineBoxes : 1;
+ unsigned m_renderBoxNeedsLazyRepaint : 1;
+ unsigned m_hasPausedImageAnimations : 1;
+ unsigned m_hasCounterNodeMap : 1;
+ unsigned m_isCSSAnimating : 1;
RenderObject* m_firstChild;
RenderObject* m_lastChild;