Index: third_party/WebKit/Source/core/svg/SVGDocumentExtensions.cpp |
diff --git a/third_party/WebKit/Source/core/svg/SVGDocumentExtensions.cpp b/third_party/WebKit/Source/core/svg/SVGDocumentExtensions.cpp |
index e3a6fb5560101aaf7b26b4fc20d123c8d68ccb68..027a89bd1bdf6037ab2e7be7cbe88d42a6ad153e 100644 |
--- a/third_party/WebKit/Source/core/svg/SVGDocumentExtensions.cpp |
+++ b/third_party/WebKit/Source/core/svg/SVGDocumentExtensions.cpp |
@@ -22,6 +22,11 @@ |
#include "config.h" |
#include "core/svg/SVGDocumentExtensions.h" |
+#include "core/animation/AnimationStack.h" |
+#include "core/animation/ElementAnimations.h" |
+#include "core/animation/InterpolationEnvironment.h" |
+#include "core/animation/InvalidatableInterpolation.h" |
+#include "core/animation/SVGInterpolation.h" |
#include "core/dom/Document.h" |
#include "core/inspector/ConsoleMessage.h" |
#include "core/layout/svg/SVGResourcesCache.h" |
@@ -54,6 +59,11 @@ void SVGDocumentExtensions::removeTimeContainer(SVGSVGElement* element) |
m_timeContainers.remove(element); |
} |
+void SVGDocumentExtensions::addPendingWebAnimatedSVGElement(SVGElement& element) |
+{ |
+ m_webAnimatedSVGElements.add(&element); |
dstockwell
2015/10/28 03:39:38
ASSERT runtime enabled feature?
alancutter (OOO until 2018)
2015/10/29 04:56:51
Done.
|
+} |
+ |
void SVGDocumentExtensions::addResource(const AtomicString& id, LayoutSVGResourceContainer* resource) |
{ |
ASSERT(resource); |
@@ -83,17 +93,44 @@ LayoutSVGResourceContainer* SVGDocumentExtensions::resourceById(const AtomicStri |
void SVGDocumentExtensions::serviceOnAnimationFrame(Document& document, double monotonicAnimationStartTime) |
{ |
- if (!document.svgExtensions() || !RuntimeEnabledFeatures::smilEnabled()) |
+ if (!document.svgExtensions()) |
return; |
document.accessSVGExtensions().serviceAnimations(monotonicAnimationStartTime); |
} |
void SVGDocumentExtensions::serviceAnimations(double monotonicAnimationStartTime) |
{ |
- WillBeHeapVector<RefPtrWillBeMember<SVGSVGElement>> timeContainers; |
- copyToVector(m_timeContainers, timeContainers); |
- for (const auto& container : timeContainers) |
- container->timeContainer()->serviceAnimations(monotonicAnimationStartTime); |
+ if (RuntimeEnabledFeatures::smilEnabled()) { |
+ WillBeHeapVector<RefPtrWillBeMember<SVGSVGElement>> timeContainers; |
+ copyToVector(m_timeContainers, timeContainers); |
+ for (const auto& container : timeContainers) |
+ container->timeContainer()->serviceAnimations(monotonicAnimationStartTime); |
+ } |
+ |
+ SVGElementSet webAnimatedSVGElements; |
+ webAnimatedSVGElements.swap(m_webAnimatedSVGElements); |
+ |
+ // TODO(alancutter): Make SVG animation effect application a separate document lifecycle phase from servicing animations to be responsive to Javascript manipulation of exposed animation objects. |
+ for (auto& svgElement : webAnimatedSVGElements) { |
+ ActiveInterpolationsMap activeInterpolationsMap = AnimationStack::activeInterpolations( |
+ &svgElement->elementAnimations()->animationStack(), nullptr, nullptr, KeyframeEffect::DefaultPriority); |
+ for (auto& entry : activeInterpolationsMap) { |
+ if (!entry.key.isSVGAttribute()) |
+ continue; |
+ const QualifiedName& attribute = entry.key.svgAttribute(); |
+ const Interpolation& interpolation = *entry.value.first(); |
+ if (interpolation.isInvalidatableInterpolation()) { |
+ RefPtrWillBeRawPtr<SVGAnimatedPropertyBase> propertyBase = svgElement->propertyFromAttribute(attribute); |
+ InterpolationEnvironment environment(*svgElement, *propertyBase); |
+ InvalidatableInterpolation::applyStack(entry.value, environment); |
+ } else { |
+ // TODO(alancutter): Remove this old code path once animations have completely migrated to InterpolationTypes. |
+ toSVGInterpolation(interpolation).apply(*svgElement); |
+ } |
+ } |
+ } |
+ |
+ ASSERT(m_webAnimatedSVGElements.isEmpty()); |
} |
void SVGDocumentExtensions::startAnimations() |