/*
 * 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.
 */

#ifndef COBALT_CSSOM_COMPUTED_STYLE_H_
#define COBALT_CSSOM_COMPUTED_STYLE_H_

#include "base/memory/ref_counted.h"
#include "cobalt/cssom/property_definitions.h"
#include "cobalt/math/size.h"

namespace cobalt {
namespace cssom {

class CSSComputedStyleData;
class CSSComputedStyleDeclaration;

// The computed value is the result of resolving the specified value,
// generally absolutizing it. The computed value is the value that is
// transferred from parent to child during inheritance.
//   https://www.w3.org/TR/css-cascade-3/#computed

// Converts specified values into computed values in place.
// parent_computed_style_declaration and root_computed_style cannot be NULL.
// property_key_to_base_url_map can be NULL.
void PromoteToComputedStyle(
    const scoped_refptr<CSSComputedStyleData>& specified_style,
    const scoped_refptr<CSSComputedStyleDeclaration>&
        parent_computed_style_declaration,
    const scoped_refptr<const CSSComputedStyleData>& root_computed_style,
    const math::Size& viewport_size,
    GURLMap* const property_key_to_base_url_map);

// Creates the computed style of an anonymous box from the given parent style.
// CSS 2.1 specification provides identical definitions for anonymous block and
// inline boxes. The inheritable properties of anonymous boxes are inherited
// from the enclosing non-anonymous box. Non-inherited properties have their
// initial value.
//   https://www.w3.org/TR/CSS21/visuren.html#anonymous-block-level
//   https://www.w3.org/TR/CSS21/visuren.html#anonymous
scoped_refptr<CSSComputedStyleData> GetComputedStyleOfAnonymousBox(
    const scoped_refptr<CSSComputedStyleDeclaration>&
        parent_computed_style_declaration);

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_COMPUTED_STYLE_H_
