// Copyright 2019 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/debug/backend/css_agent.h"

#include "cobalt/dom/document.h"
#include "cobalt/dom/html_element.h"

namespace cobalt {
namespace debug {
namespace backend {

CSSAgent::CSSAgent(DebugDispatcher* dispatcher)
    : AgentBase("CSS", "css_agent.js", dispatcher) {}

CSSAgent::CSSStyleRuleSequence CSSAgent::GetMatchingCSSRules(
    const scoped_refptr<dom::Element>& element) {
  CSSStyleRuleSequence css_rules;
  auto html_element = element->AsHTMLElement();
  if (html_element) {
    html_element->node_document()->UpdateComputedStyleOnElementAndAncestor(
        html_element.get());
    for (const auto& matching_rule : *html_element->matching_rules()) {
      css_rules.push_back(matching_rule.first);
    }
  }
  return css_rules;
}

}  // namespace backend
}  // namespace debug
}  // namespace cobalt
