Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(269)

Unified Diff: Source/core/animation/Animation.cpp

Issue 182063005: Web Animations API: Refactor IDL input conversion out of Animation (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Review changes Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/animation/Animation.cpp
diff --git a/Source/core/animation/Animation.cpp b/Source/core/animation/Animation.cpp
index fe663328a6d2dac2ec9665e662db0b18d2a80d0d..f43bbb2644007abfc66f591b765189c21e3dd156 100644
--- a/Source/core/animation/Animation.cpp
+++ b/Source/core/animation/Animation.cpp
@@ -38,11 +38,8 @@
#include "core/animation/DocumentTimeline.h"
#include "core/animation/KeyframeEffectModel.h"
#include "core/animation/Player.h"
-#include "core/css/parser/BisonCSSParser.h"
-#include "core/css/resolver/StyleResolver.h"
#include "core/dom/Element.h"
#include "core/rendering/RenderLayer.h"
-#include "wtf/text/StringBuilder.h"
namespace WebCore {
@@ -51,270 +48,35 @@ PassRefPtr<Animation> Animation::create(PassRefPtr<Element> target, PassRefPtrWi
return adoptRef(new Animation(target, effect, timing, priority, eventDelegate));
}
-static bool checkDocumentAndRenderer(Element* element)
-{
- if (!element->inActiveDocument())
- return false;
- element->document().updateStyleIfNeeded();
- if (!element->renderer())
- return false;
- return true;
-}
-
-PassRefPtr<Animation> Animation::create(Element* element, Vector<Dictionary> keyframeDictionaryVector, Dictionary timingInput)
+PassRefPtr<Animation> Animation::create(Element* element, PassRefPtrWillBeRawPtr<AnimationEffect> effect, const Dictionary& timingInputDictionary)
{
ASSERT(RuntimeEnabledFeatures::webAnimationsAPIEnabled());
-
- // FIXME: This test will not be neccessary once resolution of keyframe values occurs at
- // animation application time.
- if (!checkDocumentAndRenderer(element))
- return nullptr;
-
- return createUnsafe(element, keyframeDictionaryVector, timingInput);
+ return create(element, effect, TimingInput::convert(timingInputDictionary));
}
-
-PassRefPtr<Animation> Animation::create(Element* element, Vector<Dictionary> keyframeDictionaryVector, double timingInput)
+PassRefPtr<Animation> Animation::create(Element* element, PassRefPtrWillBeRawPtr<AnimationEffect> effect, double duration)
{
ASSERT(RuntimeEnabledFeatures::webAnimationsAPIEnabled());
-
- // FIXME: This test will not be neccessary once resolution of keyframe values occurs at
- // animation application time.
- if (!checkDocumentAndRenderer(element))
- return nullptr;
-
- return createUnsafe(element, keyframeDictionaryVector, timingInput);
+ return create(element, effect, TimingInput::convert(duration));
}
-
-PassRefPtr<Animation> Animation::create(Element* element, Vector<Dictionary> keyframeDictionaryVector)
+PassRefPtr<Animation> Animation::create(Element* element, PassRefPtrWillBeRawPtr<AnimationEffect> effect)
{
ASSERT(RuntimeEnabledFeatures::webAnimationsAPIEnabled());
-
- // FIXME: This test will not be neccessary once resolution of keyframe values occurs at
- // animation application time.
- if (!checkDocumentAndRenderer(element))
- return nullptr;
-
- return createUnsafe(element, keyframeDictionaryVector);
-}
-
-void Animation::setStartDelay(Timing& timing, double startDelay)
-{
- if (std::isfinite(startDelay))
- timing.startDelay = startDelay;
- else
- timing.startDelay = Timing::defaults().startDelay;
-}
-
-void Animation::setEndDelay(Timing& timing, double endDelay)
-{
- if (std::isfinite(endDelay))
- timing.endDelay = endDelay;
- else
- timing.endDelay = Timing::defaults().endDelay;
-}
-
-void Animation::setFillMode(Timing& timing, String fillMode)
-{
- if (fillMode == "none") {
- timing.fillMode = Timing::FillModeNone;
- } else if (fillMode == "backwards") {
- timing.fillMode = Timing::FillModeBackwards;
- } else if (fillMode == "both") {
- timing.fillMode = Timing::FillModeBoth;
- } else if (fillMode == "forwards") {
- timing.fillMode = Timing::FillModeForwards;
- } else {
- timing.fillMode = Timing::defaults().fillMode;
- }
-}
-
-void Animation::setIterationStart(Timing& timing, double iterationStart)
-{
- if (!std::isnan(iterationStart) && !std::isinf(iterationStart))
- timing.iterationStart = std::max<double>(iterationStart, 0);
- else
- timing.iterationStart = Timing::defaults().iterationStart;
-}
-
-void Animation::setIterationCount(Timing& timing, double iterationCount)
-{
- if (!std::isnan(iterationCount))
- timing.iterationCount = std::max<double>(iterationCount, 0);
- else
- timing.iterationCount = Timing::defaults().iterationCount;
-}
-
-void Animation::setIterationDuration(Timing& timing, double iterationDuration)
-{
- if (!std::isnan(iterationDuration) && iterationDuration >= 0)
- timing.iterationDuration = iterationDuration;
- else
- timing.iterationDuration = Timing::defaults().iterationDuration;
-}
-
-void Animation::setPlaybackRate(Timing& timing, double playbackRate)
-{
- if (!std::isnan(playbackRate) && !std::isinf(playbackRate))
- timing.playbackRate = playbackRate;
- else
- timing.playbackRate = Timing::defaults().playbackRate;
-}
-
-void Animation::setPlaybackDirection(Timing& timing, String direction)
-{
- if (direction == "reverse") {
- timing.direction = Timing::PlaybackDirectionReverse;
- } else if (direction == "alternate") {
- timing.direction = Timing::PlaybackDirectionAlternate;
- } else if (direction == "alternate-reverse") {
- timing.direction = Timing::PlaybackDirectionAlternateReverse;
- } else {
- timing.direction = Timing::defaults().direction;
- }
-}
-
-void Animation::setTimingFunction(Timing& timing, String timingFunctionString)
-{
- RefPtrWillBeRawPtr<CSSValue> timingFunctionValue = BisonCSSParser::parseAnimationTimingFunctionValue(timingFunctionString);
- if (timingFunctionValue) {
- RefPtr<TimingFunction> timingFunction = CSSToStyleMap::animationTimingFunction(timingFunctionValue.get(), false);
- if (timingFunction) {
- timing.timingFunction = timingFunction;
- return;
- }
- }
- timing.timingFunction = Timing::defaults().timingFunction;
-}
-
-void Animation::populateTiming(Timing& timing, Dictionary timingInputDictionary)
-{
- // FIXME: This method needs to be refactored to handle invalid
- // null, NaN, Infinity values better.
- // See: http://www.w3.org/TR/WebIDL/#es-double
- double startDelay = 0;
- timingInputDictionary.get("delay", startDelay);
- setStartDelay(timing, startDelay);
-
- double endDelay = 0;
- timingInputDictionary.get("endDelay", endDelay);
- setEndDelay(timing, endDelay);
-
- String fillMode;
- timingInputDictionary.get("fill", fillMode);
- setFillMode(timing, fillMode);
-
- double iterationStart = 0;
- timingInputDictionary.get("iterationStart", iterationStart);
- setIterationStart(timing, iterationStart);
-
- double iterationCount = 1;
- timingInputDictionary.get("iterations", iterationCount);
- setIterationCount(timing, iterationCount);
-
- v8::Local<v8::Value> iterationDurationValue;
- if (timingInputDictionary.get("duration", iterationDurationValue)) {
- double iterationDuration = iterationDurationValue->NumberValue();
- setIterationDuration(timing, iterationDuration);
- }
-
- double playbackRate = 1;
- timingInputDictionary.get("playbackRate", playbackRate);
- setPlaybackRate(timing, playbackRate);
-
- String direction;
- timingInputDictionary.get("direction", direction);
- setPlaybackDirection(timing, direction);
-
- String timingFunctionString;
- timingInputDictionary.get("easing", timingFunctionString);
- setTimingFunction(timing, timingFunctionString);
-
- timing.assertValid();
+ return create(element, effect, Timing());
}
-
-static PassRefPtrWillBeRawPtr<KeyframeEffectModel> createKeyframeEffectModel(Element* element, Vector<Dictionary> keyframeDictionaryVector)
+PassRefPtr<Animation> Animation::create(Element* element, const Vector<Dictionary>& keyframeDictionaryVector, const Dictionary& timingInputDictionary)
{
- KeyframeEffectModel::KeyframeVector keyframes;
- Vector<RefPtr<MutableStylePropertySet> > propertySetVector;
-
- for (size_t i = 0; i < keyframeDictionaryVector.size(); ++i) {
- RefPtr<MutableStylePropertySet> propertySet = MutableStylePropertySet::create();
- propertySetVector.append(propertySet);
-
- RefPtrWillBeRawPtr<Keyframe> keyframe = Keyframe::create();
- keyframes.append(keyframe);
-
- double offset;
- if (keyframeDictionaryVector[i].get("offset", offset)) {
- keyframe->setOffset(offset);
- }
-
- String compositeString;
- keyframeDictionaryVector[i].get("composite", compositeString);
- if (compositeString == "add")
- keyframe->setComposite(AnimationEffect::CompositeAdd);
-
- String timingFunctionString;
- if (keyframeDictionaryVector[i].get("easing", timingFunctionString)) {
- RefPtrWillBeRawPtr<CSSValue> timingFunctionValue = BisonCSSParser::parseAnimationTimingFunctionValue(timingFunctionString);
- if (timingFunctionValue) {
- keyframe->setEasing(CSSToStyleMap::animationTimingFunction(timingFunctionValue.get(), false));
- }
- }
-
- Vector<String> keyframeProperties;
- keyframeDictionaryVector[i].getOwnPropertyNames(keyframeProperties);
-
- for (size_t j = 0; j < keyframeProperties.size(); ++j) {
- String property = keyframeProperties[j];
- CSSPropertyID id = camelCaseCSSPropertyNameToID(property);
-
- // FIXME: There is no way to store invalid properties or invalid values
- // in a Keyframe object, so for now I just skip over them. Eventually we
- // will need to support getFrames(), which should return exactly the
- // keyframes that were input through the API. We will add a layer to wrap
- // KeyframeEffectModel, store input keyframes and implement getFrames.
- if (id == CSSPropertyInvalid || !CSSAnimations::isAnimatableProperty(id))
- continue;
-
- String value;
- keyframeDictionaryVector[i].get(property, value);
- propertySet->setProperty(id, value);
- }
- }
-
- // FIXME: Replace this with code that just parses, when that code is available.
- RefPtrWillBeRawPtr<KeyframeEffectModel> effect = StyleResolver::createKeyframeEffectModel(*element, propertySetVector, keyframes);
- return effect;
-}
-
-PassRefPtr<Animation> Animation::createUnsafe(Element* element, Vector<Dictionary> keyframeDictionaryVector, Dictionary timingInput)
-{
- RefPtrWillBeRawPtr<KeyframeEffectModel> effect = createKeyframeEffectModel(element, keyframeDictionaryVector);
-
- Timing timing;
- populateTiming(timing, timingInput);
-
- return create(element, effect, timing);
+ ASSERT(RuntimeEnabledFeatures::webAnimationsAPIEnabled());
+ return create(element, EffectInput::convert(element, keyframeDictionaryVector), TimingInput::convert(timingInputDictionary));
}
-
-PassRefPtr<Animation> Animation::createUnsafe(Element* element, Vector<Dictionary> keyframeDictionaryVector, double timingInput)
+PassRefPtr<Animation> Animation::create(Element* element, const Vector<Dictionary>& keyframeDictionaryVector, double duration)
{
- RefPtrWillBeRawPtr<KeyframeEffectModel> effect = createKeyframeEffectModel(element, keyframeDictionaryVector);
-
- Timing timing;
- if (!std::isnan(timingInput))
- timing.iterationDuration = std::max<double>(timingInput, 0);
-
- return create(element, effect, timing);
+ ASSERT(RuntimeEnabledFeatures::webAnimationsAPIEnabled());
+ return create(element, EffectInput::convert(element, keyframeDictionaryVector), TimingInput::convert(duration));
}
-
-PassRefPtr<Animation> Animation::createUnsafe(Element* element, Vector<Dictionary> keyframeDictionaryVector)
+PassRefPtr<Animation> Animation::create(Element* element, const Vector<Dictionary>& keyframeDictionaryVector)
{
- RefPtrWillBeRawPtr<KeyframeEffectModel> effect = createKeyframeEffectModel(element, keyframeDictionaryVector);
- Timing timing;
-
- return create(element, effect, timing);
+ ASSERT(RuntimeEnabledFeatures::webAnimationsAPIEnabled());
+ return create(element, EffectInput::convert(element, keyframeDictionaryVector), Timing());
}
Animation::Animation(PassRefPtr<Element> target, PassRefPtrWillBeRawPtr<AnimationEffect> effect, const Timing& timing, Priority priority, PassOwnPtr<EventDelegate> eventDelegate)

Powered by Google App Engine
This is Rietveld 408576698