// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "cobalt/web_animations/animation_set.h"

#include "cobalt/web_animations/keyframe_effect_read_only.h"

namespace cobalt {
namespace web_animations {

AnimationSet::AnimationSet() {}

void AnimationSet::AddAnimation(Animation* animation) {
  animations_.insert(animation);
}

void AnimationSet::RemoveAnimation(Animation* animation) {
  animations_.erase(animation);
}

bool AnimationSet::IsPropertyAnimated(cssom::PropertyKey property_name) const {
  for (InternalSet::const_iterator iter = animations_.begin();
       iter != animations_.end(); ++iter) {
    const KeyframeEffectReadOnly* keyframe_effect =
        base::polymorphic_downcast<const KeyframeEffectReadOnly*>(
            (*iter)->effect().get());
    if (keyframe_effect->data().IsPropertyAnimated(property_name)) {
      return true;
    }
  }

  return false;
}

}  // namespace web_animations
}  // namespace cobalt
