/*
 * Copyright 2014 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_style_rule.h"

#include "cobalt/cssom/css_rule_style_declaration.h"
#include "cobalt/cssom/css_rule_visitor.h"
#include "cobalt/cssom/css_style_sheet.h"

namespace cobalt {
namespace cssom {

CSSStyleRule::CSSStyleRule() : added_to_selector_tree_(false) {}

CSSStyleRule::CSSStyleRule(Selectors selectors,
                           const scoped_refptr<CSSRuleStyleDeclaration>& style)
    : selectors_(selectors.Pass()),
      style_(style),
      added_to_selector_tree_(false) {
  if (style_) {
    style_->set_parent_rule(this);
  }
}

const scoped_refptr<CSSStyleDeclaration> CSSStyleRule::style() const {
  return style_;
}

std::string CSSStyleRule::css_text(
    script::ExceptionState* exception_state) const {
  return style_ ? style_->css_text(exception_state) : "";
}

void CSSStyleRule::set_css_text(const std::string& css_text,
                                script::ExceptionState* exception_state) {
  if (!style_) {
    DCHECK(parent_style_sheet());
    style_ = new CSSRuleStyleDeclaration(parent_style_sheet()->css_parser());
  }
  style_->set_css_text(css_text, exception_state);
  style_->set_parent_rule(this);
}

void CSSStyleRule::Accept(CSSRuleVisitor* visitor) {
  visitor->VisitCSSStyleRule(this);
}

void CSSStyleRule::AttachToCSSStyleSheet(CSSStyleSheet* style_sheet) {
  set_parent_style_sheet(style_sheet);
  if (style_) {
    style_->set_mutation_observer(style_sheet);
  }
}

CSSStyleRule::~CSSStyleRule() {}

}  // namespace cssom
}  // namespace cobalt
