// 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/cssom/css_keyframe_rule.h"

#include "cobalt/cssom/css_rule_visitor.h"

namespace cobalt {
namespace cssom {

CSSKeyframeRule::CSSKeyframeRule(
    const std::vector<float>& offsets,
    const scoped_refptr<CSSRuleStyleDeclaration>& style)
    : offsets_(offsets), style_(style) {}

std::string CSSKeyframeRule::css_text(
    script::ExceptionState* /*exception_state*/) const {
  NOTIMPLEMENTED();
  return "";
}

void CSSKeyframeRule::set_css_text(
    const std::string& /*css_text*/,
    script::ExceptionState* /*exception_state*/) {
  NOTIMPLEMENTED();
}

std::string CSSKeyframeRule::key_text() const {
  NOTIMPLEMENTED();
  return "";
}

void CSSKeyframeRule::Accept(CSSRuleVisitor* visitor) {
  visitor->VisitCSSKeyframeRule(this);
}

void CSSKeyframeRule::AttachToCSSStyleSheet(CSSStyleSheet* style_sheet) {
  set_parent_style_sheet(style_sheet);
}

CSSKeyframeRule::~CSSKeyframeRule() {}

}  // namespace cssom
}  // namespace cobalt
