// Copyright 2014 The Cobalt Authors. 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
