blob: ab2c0fcf24147a8c8fd8940b87d9dd438829f3e5 [file] [log] [blame]
// Copyright 2016 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_CSS_COMPUTED_STYLE_DATA_H_
#define COBALT_CSSOM_CSS_COMPUTED_STYLE_DATA_H_
#include <functional>
#include <map>
#include <string>
#include "base/compiler_specific.h"
#include "base/containers/small_map.h"
#include "base/memory/ref_counted.h"
#include "cobalt/base/unused.h"
#include "cobalt/cssom/property_definitions.h"
#include "cobalt/cssom/property_value.h"
namespace cobalt {
namespace cssom {
class CSSComputedStyleDeclaration;
// CSSComputedStyleData which has PropertyValue type properties only used
// internally and it is not exposed to JavaScript.
class CSSComputedStyleData : public base::RefCounted<CSSComputedStyleData> {
public:
// This class provides the ability to determine whether the properties of two
// CSSComputedStyleData objects match for a given set of property keys.
class PropertySetMatcher {
public:
PropertySetMatcher() {}
explicit PropertySetMatcher(const PropertyKeyVector& properties);
bool DoDeclaredPropertiesMatch(
const scoped_refptr<const CSSComputedStyleData>& lhs,
const scoped_refptr<const CSSComputedStyleData>& rhs) const;
private:
PropertyKeyVector properties_;
LonghandPropertiesBitset properties_bitset_;
};
// Time spent during initial layout and incremental layout is the shortest
// with an array size of 16.
typedef base::SmallMap<std::map<PropertyKey, scoped_refptr<PropertyValue> >,
16, std::equal_to<PropertyKey> > PropertyValues;
CSSComputedStyleData();
~CSSComputedStyleData();
void SetPropertyValue(const PropertyKey key,
const scoped_refptr<PropertyValue>& value);
// TODO: Define types of the properties more precisely using
// non-intrusive visitors, like boost::variant (which can serve as inspiration
// for our own base::variant).
//
// For example:
//
// // Value: <length> | <percentage> | auto | inherit | initial | unset
// typedef base::variant<Length, Percentage, Auto, Inherit, Initial, Unset>
// DeclaredWidth;
//
// // Same as above but with "inherit", "initial", and "unset" resolved.
// typedef base::variant<Length, Percentage, Auto>
// SpecifiedWidth;
//
// // Computed value: the percentage or "auto" as specified
// // or the absolute length.
// typedef base::variant<float, Percentage, Auto>
// ComputedWidth;
const scoped_refptr<PropertyValue>& animation_delay() const {
return GetPropertyValueReference(kAnimationDelayProperty);
}
void set_animation_delay(
const scoped_refptr<PropertyValue>& animation_delay) {
SetPropertyValue(kAnimationDelayProperty, animation_delay);
}
const scoped_refptr<PropertyValue>& animation_direction() const {
return GetPropertyValueReference(kAnimationDirectionProperty);
}
void set_animation_direction(
const scoped_refptr<PropertyValue>& animation_direction) {
SetPropertyValue(kAnimationDirectionProperty, animation_direction);
}
const scoped_refptr<PropertyValue>& animation_duration() const {
return GetPropertyValueReference(kAnimationDurationProperty);
}
void set_animation_duration(
const scoped_refptr<PropertyValue>& animation_duration) {
SetPropertyValue(kAnimationDurationProperty, animation_duration);
}
const scoped_refptr<PropertyValue>& animation_fill_mode() const {
return GetPropertyValueReference(kAnimationFillModeProperty);
}
void set_animation_fill_mode(
const scoped_refptr<PropertyValue>& animation_fill_mode) {
SetPropertyValue(kAnimationFillModeProperty, animation_fill_mode);
}
const scoped_refptr<PropertyValue>& animation_iteration_count() const {
return GetPropertyValueReference(kAnimationIterationCountProperty);
}
void set_animation_iteration_count(
const scoped_refptr<PropertyValue>& animation_iteration_count) {
SetPropertyValue(kAnimationIterationCountProperty,
animation_iteration_count);
}
const scoped_refptr<PropertyValue>& animation_name() const {
return GetPropertyValueReference(kAnimationNameProperty);
}
void set_animation_name(const scoped_refptr<PropertyValue>& animation_name) {
SetPropertyValue(kAnimationNameProperty, animation_name);
}
const scoped_refptr<PropertyValue>& animation_timing_function() const {
return GetPropertyValueReference(kAnimationTimingFunctionProperty);
}
void set_animation_timing_function(
const scoped_refptr<PropertyValue>& animation_timing_function) {
SetPropertyValue(kAnimationTimingFunctionProperty,
animation_timing_function);
}
const scoped_refptr<PropertyValue>& background_color() const {
return GetPropertyValueReference(kBackgroundColorProperty);
}
void set_background_color(
const scoped_refptr<PropertyValue>& background_color) {
SetPropertyValue(kBackgroundColorProperty, background_color);
}
const scoped_refptr<PropertyValue>& background_image() const {
return GetPropertyValueReference(kBackgroundImageProperty);
}
void set_background_image(
const scoped_refptr<PropertyValue>& background_image) {
SetPropertyValue(kBackgroundImageProperty, background_image);
}
const scoped_refptr<PropertyValue>& background_position() const {
return GetPropertyValueReference(kBackgroundPositionProperty);
}
void set_background_position(
const scoped_refptr<PropertyValue>& background_position) {
SetPropertyValue(kBackgroundPositionProperty, background_position);
}
const scoped_refptr<PropertyValue>& background_repeat() const {
return GetPropertyValueReference(kBackgroundRepeatProperty);
}
void set_background_repeat(
const scoped_refptr<PropertyValue>& background_repeat) {
SetPropertyValue(kBackgroundRepeatProperty, background_repeat);
}
const scoped_refptr<PropertyValue>& background_size() const {
return GetPropertyValueReference(kBackgroundSizeProperty);
}
void set_background_size(
const scoped_refptr<PropertyValue>& background_size) {
SetPropertyValue(kBackgroundSizeProperty, background_size);
}
const scoped_refptr<PropertyValue>& border_top_color() const {
return GetPropertyValueReference(kBorderTopColorProperty);
}
void set_border_top_color(
const scoped_refptr<PropertyValue>& border_top_color) {
SetPropertyValue(kBorderTopColorProperty, border_top_color);
}
const scoped_refptr<PropertyValue>& border_right_color() const {
return GetPropertyValueReference(kBorderRightColorProperty);
}
void set_border_right_color(
const scoped_refptr<PropertyValue>& border_right_color) {
SetPropertyValue(kBorderRightColorProperty, border_right_color);
}
const scoped_refptr<PropertyValue>& border_bottom_color() const {
return GetPropertyValueReference(kBorderBottomColorProperty);
}
void set_border_bottom_color(
const scoped_refptr<PropertyValue>& border_bottom_color) {
SetPropertyValue(kBorderBottomColorProperty, border_bottom_color);
}
const scoped_refptr<PropertyValue>& border_left_color() const {
return GetPropertyValueReference(kBorderLeftColorProperty);
}
void set_border_left_color(
const scoped_refptr<PropertyValue>& border_left_color) {
SetPropertyValue(kBorderLeftColorProperty, border_left_color);
}
const scoped_refptr<PropertyValue>& border_top_style() const {
return GetPropertyValueReference(kBorderTopStyleProperty);
}
void set_border_top_style(
const scoped_refptr<PropertyValue>& border_top_style) {
SetPropertyValue(kBorderTopStyleProperty, border_top_style);
}
const scoped_refptr<PropertyValue>& border_right_style() const {
return GetPropertyValueReference(kBorderRightStyleProperty);
}
void set_border_right_style(
const scoped_refptr<PropertyValue>& border_right_style) {
SetPropertyValue(kBorderRightStyleProperty, border_right_style);
}
const scoped_refptr<PropertyValue>& border_bottom_style() const {
return GetPropertyValueReference(kBorderBottomStyleProperty);
}
void set_border_bottom_style(
const scoped_refptr<PropertyValue>& border_bottom_style) {
SetPropertyValue(kBorderBottomStyleProperty, border_bottom_style);
}
const scoped_refptr<PropertyValue>& border_left_style() const {
return GetPropertyValueReference(kBorderLeftStyleProperty);
}
void set_border_left_style(
const scoped_refptr<PropertyValue>& border_left_style) {
SetPropertyValue(kBorderLeftStyleProperty, border_left_style);
}
const scoped_refptr<PropertyValue>& border_top_width() const {
return GetPropertyValueReference(kBorderTopWidthProperty);
}
void set_border_top_width(
const scoped_refptr<PropertyValue>& border_top_width) {
SetPropertyValue(kBorderTopWidthProperty, border_top_width);
}
const scoped_refptr<PropertyValue>& border_right_width() const {
return GetPropertyValueReference(kBorderRightWidthProperty);
}
void set_border_right_width(
const scoped_refptr<PropertyValue>& border_right_width) {
SetPropertyValue(kBorderRightWidthProperty, border_right_width);
}
const scoped_refptr<PropertyValue>& border_bottom_width() const {
return GetPropertyValueReference(kBorderBottomWidthProperty);
}
void set_border_bottom_width(
const scoped_refptr<PropertyValue>& border_bottom_width) {
SetPropertyValue(kBorderBottomWidthProperty, border_bottom_width);
}
const scoped_refptr<PropertyValue>& border_left_width() const {
return GetPropertyValueReference(kBorderLeftWidthProperty);
}
void set_border_left_width(
const scoped_refptr<PropertyValue>& border_left_width) {
SetPropertyValue(kBorderLeftWidthProperty, border_left_width);
}
const scoped_refptr<PropertyValue>& border_radius() const {
return GetPropertyValueReference(kBorderRadiusProperty);
}
void set_border_radius(const scoped_refptr<PropertyValue>& border_radius) {
SetPropertyValue(kBorderRadiusProperty, border_radius);
}
const scoped_refptr<PropertyValue>& bottom() const {
return GetPropertyValueReference(kBottomProperty);
}
void set_bottom(const scoped_refptr<PropertyValue>& bottom) {
SetPropertyValue(kBottomProperty, bottom);
}
const scoped_refptr<PropertyValue>& box_shadow() const {
return GetPropertyValueReference(kBoxShadowProperty);
}
void set_box_shadow(const scoped_refptr<PropertyValue>& box_shadow) {
SetPropertyValue(kBoxShadowProperty, box_shadow);
}
const scoped_refptr<PropertyValue>& color() const {
return GetPropertyValueReference(kColorProperty);
}
void set_color(const scoped_refptr<PropertyValue>& color) {
SetPropertyValue(kColorProperty, color);
}
const scoped_refptr<PropertyValue>& content() const {
return GetPropertyValueReference(kContentProperty);
}
void set_content(const scoped_refptr<PropertyValue>& content) {
SetPropertyValue(kContentProperty, content);
}
const scoped_refptr<PropertyValue>& display() const {
return GetPropertyValueReference(kDisplayProperty);
}
void set_display(const scoped_refptr<PropertyValue>& display) {
SetPropertyValue(kDisplayProperty, display);
}
const scoped_refptr<PropertyValue>& filter() const {
return GetPropertyValueReference(kFilterProperty);
}
void set_filter(const scoped_refptr<PropertyValue>& filter) {
SetPropertyValue(kFilterProperty, filter);
}
const scoped_refptr<PropertyValue>& font_family() const {
return GetPropertyValueReference(kFontFamilyProperty);
}
void set_font_family(const scoped_refptr<PropertyValue>& font_family) {
SetPropertyValue(kFontFamilyProperty, font_family);
}
const scoped_refptr<PropertyValue>& font_size() const {
return GetPropertyValueReference(kFontSizeProperty);
}
void set_font_size(const scoped_refptr<PropertyValue>& font_size) {
SetPropertyValue(kFontSizeProperty, font_size);
}
const scoped_refptr<PropertyValue>& font_style() const {
return GetPropertyValueReference(kFontStyleProperty);
}
void set_font_style(const scoped_refptr<PropertyValue>& font_style) {
SetPropertyValue(kFontStyleProperty, font_style);
}
const scoped_refptr<PropertyValue>& font_weight() const {
return GetPropertyValueReference(kFontWeightProperty);
}
void set_font_weight(const scoped_refptr<PropertyValue>& font_weight) {
SetPropertyValue(kFontWeightProperty, font_weight);
}
const scoped_refptr<PropertyValue>& height() const {
return GetPropertyValueReference(kHeightProperty);
}
void set_height(const scoped_refptr<PropertyValue>& height) {
SetPropertyValue(kHeightProperty, height);
}
const scoped_refptr<PropertyValue>& left() const {
return GetPropertyValueReference(kLeftProperty);
}
void set_left(const scoped_refptr<PropertyValue>& left) {
SetPropertyValue(kLeftProperty, left);
}
const scoped_refptr<PropertyValue>& line_height() const {
return GetPropertyValueReference(kLineHeightProperty);
}
void set_line_height(const scoped_refptr<PropertyValue>& line_height) {
SetPropertyValue(kLineHeightProperty, line_height);
}
const scoped_refptr<PropertyValue>& margin() const {
return GetPropertyValueReference(kMarginProperty);
}
void set_margin(const scoped_refptr<PropertyValue>& margin) {
SetPropertyValue(kMarginProperty, margin);
}
const scoped_refptr<PropertyValue>& margin_bottom() const {
return GetPropertyValueReference(kMarginBottomProperty);
}
void set_margin_bottom(const scoped_refptr<PropertyValue>& margin_bottom) {
SetPropertyValue(kMarginBottomProperty, margin_bottom);
}
const scoped_refptr<PropertyValue>& margin_left() const {
return GetPropertyValueReference(kMarginLeftProperty);
}
void set_margin_left(const scoped_refptr<PropertyValue>& margin_left) {
SetPropertyValue(kMarginLeftProperty, margin_left);
}
const scoped_refptr<PropertyValue>& margin_right() const {
return GetPropertyValueReference(kMarginRightProperty);
}
void set_margin_right(const scoped_refptr<PropertyValue>& margin_right) {
SetPropertyValue(kMarginRightProperty, margin_right);
}
const scoped_refptr<PropertyValue>& margin_top() const {
return GetPropertyValueReference(kMarginTopProperty);
}
void set_margin_top(const scoped_refptr<PropertyValue>& margin_top) {
SetPropertyValue(kMarginTopProperty, margin_top);
}
const scoped_refptr<PropertyValue>& max_height() const {
return GetPropertyValueReference(kMaxHeightProperty);
}
void set_max_height(const scoped_refptr<PropertyValue>& max_height) {
SetPropertyValue(kMaxHeightProperty, max_height);
}
const scoped_refptr<PropertyValue>& max_width() const {
return GetPropertyValueReference(kMaxWidthProperty);
}
void set_max_width(const scoped_refptr<PropertyValue>& max_width) {
SetPropertyValue(kMaxWidthProperty, max_width);
}
const scoped_refptr<PropertyValue>& min_height() const {
return GetPropertyValueReference(kMinHeightProperty);
}
void set_min_height(const scoped_refptr<PropertyValue>& min_height) {
SetPropertyValue(kMinHeightProperty, min_height);
}
const scoped_refptr<PropertyValue>& min_width() const {
return GetPropertyValueReference(kMinWidthProperty);
}
void set_min_width(const scoped_refptr<PropertyValue>& min_width) {
SetPropertyValue(kMinWidthProperty, min_width);
}
const scoped_refptr<PropertyValue>& opacity() const {
return GetPropertyValueReference(kOpacityProperty);
}
void set_opacity(const scoped_refptr<PropertyValue>& opacity) {
SetPropertyValue(kOpacityProperty, opacity);
}
const scoped_refptr<PropertyValue>& outline_color() const {
return GetPropertyValueReference(kOutlineColorProperty);
}
void set_outline_color(const scoped_refptr<PropertyValue>& outline_color) {
SetPropertyValue(kOutlineColorProperty, outline_color);
}
const scoped_refptr<PropertyValue>& outline_style() const {
return GetPropertyValueReference(kOutlineStyleProperty);
}
void set_outline_style(const scoped_refptr<PropertyValue>& outline_style) {
SetPropertyValue(kOutlineStyleProperty, outline_style);
}
const scoped_refptr<PropertyValue>& outline_width() const {
return GetPropertyValueReference(kOutlineWidthProperty);
}
void set_outline_width(const scoped_refptr<PropertyValue>& outline_width) {
SetPropertyValue(kOutlineWidthProperty, outline_width);
}
const scoped_refptr<PropertyValue>& overflow() const {
return GetPropertyValueReference(kOverflowProperty);
}
void set_overflow(const scoped_refptr<PropertyValue>& overflow) {
SetPropertyValue(kOverflowProperty, overflow);
}
const scoped_refptr<PropertyValue>& overflow_wrap() const {
return GetPropertyValueReference(kOverflowWrapProperty);
}
void set_overflow_wrap(const scoped_refptr<PropertyValue>& overflow_wrap) {
SetPropertyValue(kOverflowWrapProperty, overflow_wrap);
}
const scoped_refptr<PropertyValue>& padding_bottom() const {
return GetPropertyValueReference(kPaddingBottomProperty);
}
void set_padding_bottom(const scoped_refptr<PropertyValue>& padding_bottom) {
SetPropertyValue(kPaddingBottomProperty, padding_bottom);
}
const scoped_refptr<PropertyValue>& padding_left() const {
return GetPropertyValueReference(kPaddingLeftProperty);
}
void set_padding_left(const scoped_refptr<PropertyValue>& padding_left) {
SetPropertyValue(kPaddingLeftProperty, padding_left);
}
const scoped_refptr<PropertyValue>& padding_right() const {
return GetPropertyValueReference(kPaddingRightProperty);
}
void set_padding_right(const scoped_refptr<PropertyValue>& padding_right) {
SetPropertyValue(kPaddingRightProperty, padding_right);
}
const scoped_refptr<PropertyValue>& padding_top() const {
return GetPropertyValueReference(kPaddingTopProperty);
}
void set_padding_top(const scoped_refptr<PropertyValue>& padding_top) {
SetPropertyValue(kPaddingTopProperty, padding_top);
}
const scoped_refptr<PropertyValue>& pointer_events() const {
return GetPropertyValueReference(kPointerEventsProperty);
}
void set_pointer_events(const scoped_refptr<PropertyValue>& pointer_events) {
SetPropertyValue(kPointerEventsProperty, pointer_events);
}
const scoped_refptr<PropertyValue>& position() const {
return GetPropertyValueReference(kPositionProperty);
}
void set_position(const scoped_refptr<PropertyValue>& position) {
SetPropertyValue(kPositionProperty, position);
}
const scoped_refptr<PropertyValue>& right() const {
return GetPropertyValueReference(kRightProperty);
}
void set_right(const scoped_refptr<PropertyValue>& right) {
SetPropertyValue(kRightProperty, right);
}
const scoped_refptr<PropertyValue>& text_align() const {
return GetPropertyValueReference(kTextAlignProperty);
}
void set_text_align(const scoped_refptr<PropertyValue>& text_align) {
SetPropertyValue(kTextAlignProperty, text_align);
}
const scoped_refptr<PropertyValue>& text_decoration_color() const {
return GetPropertyValueReference(kTextDecorationColorProperty);
}
void set_text_decoration_color(
const scoped_refptr<PropertyValue>& text_decoration_color) {
SetPropertyValue(kTextDecorationColorProperty, text_decoration_color);
}
const scoped_refptr<PropertyValue>& text_decoration_line() const {
return GetPropertyValueReference(kTextDecorationLineProperty);
}
void set_text_decoration_line(
const scoped_refptr<PropertyValue>& text_decoration_line) {
SetPropertyValue(kTextDecorationLineProperty, text_decoration_line);
}
const scoped_refptr<PropertyValue>& text_indent() const {
return GetPropertyValueReference(kTextIndentProperty);
}
void set_text_indent(const scoped_refptr<PropertyValue>& text_indent) {
SetPropertyValue(kTextIndentProperty, text_indent);
}
const scoped_refptr<PropertyValue>& text_overflow() const {
return GetPropertyValueReference(kTextOverflowProperty);
}
void set_text_overflow(const scoped_refptr<PropertyValue>& text_overflow) {
SetPropertyValue(kTextOverflowProperty, text_overflow);
}
const scoped_refptr<PropertyValue>& text_shadow() const {
return GetPropertyValueReference(kTextShadowProperty);
}
void set_text_shadow(const scoped_refptr<PropertyValue>& text_shadow) {
SetPropertyValue(kTextShadowProperty, text_shadow);
}
const scoped_refptr<PropertyValue>& text_transform() const {
return GetPropertyValueReference(kTextTransformProperty);
}
void set_text_transform(const scoped_refptr<PropertyValue>& text_transform) {
SetPropertyValue(kTextTransformProperty, text_transform);
}
const scoped_refptr<PropertyValue>& top() const {
return GetPropertyValueReference(kTopProperty);
}
void set_top(const scoped_refptr<PropertyValue>& top) {
SetPropertyValue(kTopProperty, top);
}
const scoped_refptr<PropertyValue>& transform() const {
return GetPropertyValueReference(kTransformProperty);
}
void set_transform(const scoped_refptr<PropertyValue>& transform) {
SetPropertyValue(kTransformProperty, transform);
}
const scoped_refptr<PropertyValue>& transform_origin() const {
return GetPropertyValueReference(kTransformOriginProperty);
}
void set_transform_origin(
const scoped_refptr<PropertyValue>& transform_origin) {
SetPropertyValue(kTransformOriginProperty, transform_origin);
}
const scoped_refptr<PropertyValue>& transition_delay() const {
return GetPropertyValueReference(kTransitionDelayProperty);
}
void set_transition_delay(
const scoped_refptr<PropertyValue>& transition_delay) {
SetPropertyValue(kTransitionDelayProperty, transition_delay);
}
const scoped_refptr<PropertyValue>& transition_duration() const {
return GetPropertyValueReference(kTransitionDurationProperty);
}
void set_transition_duration(
const scoped_refptr<PropertyValue>& transition_duration) {
SetPropertyValue(kTransitionDurationProperty, transition_duration);
}
const scoped_refptr<PropertyValue>& transition_property() const {
return GetPropertyValueReference(kTransitionPropertyProperty);
}
void set_transition_property(
const scoped_refptr<PropertyValue>& transition_property) {
SetPropertyValue(kTransitionPropertyProperty, transition_property);
}
const scoped_refptr<PropertyValue>& transition_timing_function() const {
return GetPropertyValueReference(kTransitionTimingFunctionProperty);
}
void set_transition_timing_function(
const scoped_refptr<PropertyValue>& transition_timing_function) {
SetPropertyValue(kTransitionTimingFunctionProperty,
transition_timing_function);
}
const scoped_refptr<PropertyValue>& vertical_align() const {
return GetPropertyValueReference(kVerticalAlignProperty);
}
void set_vertical_align(const scoped_refptr<PropertyValue>& vertical_align) {
SetPropertyValue(kVerticalAlignProperty, vertical_align);
}
const scoped_refptr<PropertyValue>& visibility() const {
return GetPropertyValueReference(kVisibilityProperty);
}
void set_visibility(const scoped_refptr<PropertyValue>& visibility) {
SetPropertyValue(kVisibilityProperty, visibility);
}
const scoped_refptr<PropertyValue>& white_space() const {
return GetPropertyValueReference(kWhiteSpaceProperty);
}
void set_white_space(const scoped_refptr<PropertyValue>& white_space) {
SetPropertyValue(kWhiteSpaceProperty, white_space);
}
const scoped_refptr<PropertyValue>& width() const {
return GetPropertyValueReference(kWidthProperty);
}
void set_width(const scoped_refptr<PropertyValue>& width) {
SetPropertyValue(kWidthProperty, width);
}
const scoped_refptr<PropertyValue>& z_index() const {
return GetPropertyValueReference(kZIndexProperty);
}
void set_z_index(const scoped_refptr<PropertyValue>& z_index) {
SetPropertyValue(kZIndexProperty, z_index);
}
// From CSSDeclarationData
//
scoped_refptr<PropertyValue> GetPropertyValue(PropertyKey key) const {
return GetPropertyValueReference(key);
}
// Rest of public methods.
const scoped_refptr<PropertyValue>& GetPropertyValueReference(
PropertyKey key) const;
scoped_refptr<PropertyValue>& GetDeclaredPropertyValueReference(
PropertyKey key);
void AssignFrom(const CSSComputedStyleData& rhs);
// This returns the result of serializing a CSS declaration block.
// The current implementation does not handle shorthands.
// https://www.w3.org/TR/cssom/#serialize-a-css-declaration-block
std::string SerializeCSSDeclarationBlock() const;
// Returns true if the property is explicitly declared in this style, as
// opposed to implicitly inheriting from its parent or the initial value.
bool IsDeclared(const PropertyKey key) const {
return declared_properties_[key];
}
// Whether or not any inherited properties have been declared.
// NOTE: Inherited properties that are set to a value "inherit" do not impact
// this flag, as they will have the same value as the parent and can be
// skipped by descendants retrieving their inherited value without impacting
// the returned value.
bool has_declared_inherited_properties() const {
return has_declared_inherited_properties_;
}
// Adds a declared property that was inherited from the parent to an
// internal list. This facilitates tracking of whether or not a value that was
// initially set to a parent's value continues to match the parent's value.
void AddDeclaredPropertyInheritedFromParent(PropertyKey key);
// Returns true if all of the declared properties that were inherited from the
// parent are still valid. They become invalid when the parent's value
// changes.
bool AreDeclaredPropertiesInheritedFromParentValid() const;
PropertyValues* declared_property_values() {
return &declared_property_values_;
}
// Returns whether or not the declared properties in the passed in
// CSSComputedStyleData matches those declared within this one.
bool DoDeclaredPropertiesMatch(
const scoped_refptr<const CSSComputedStyleData>& other) const;
// Set the parent computed style for tracking inherited properties.
void SetParentComputedStyleDeclaration(
const scoped_refptr<CSSComputedStyleDeclaration>&
parent_computed_style_declaration);
// Returns the parent computed style used for tracking inherited properties.
const scoped_refptr<CSSComputedStyleDeclaration>&
GetParentComputedStyleDeclaration() const;
private:
// Helper function that returns the computed value if the initial property
// value is not computed or returns the initial value if it is computed.
const scoped_refptr<PropertyValue>& GetComputedInitialValue(
PropertyKey key) const;
bool IsBorderStyleNoneOrHiddenForAnEdge(PropertyKey key) const;
LonghandPropertiesBitset declared_properties_;
PropertyValues declared_property_values_;
// True if this style has any inherited properties declared.
// NOTE: Inherited properties that are set to a value "inherit" do not impact
// this flag, as they will have the same value as the parent and can be
// skipped by descendants retrieving their inherited value without impacting
// the returned value.
bool has_declared_inherited_properties_;
// Properties that were initially set to a value of "inherit" before being
// updated with the parent's value. This is used to determine whether the
// declared properties inherited from the parent have subsequently changed.
PropertyKeyVector declared_properties_inherited_from_parent_;
// The parent used for inherited properties.
// NOTE: The parent is a CSSComputedStyleDeclaration, rather than a
// CSSComputedStyleData, in order to allow for the replacement of ancestor
// CSSComputedStyleData objects without requiring all of its descendants to
// also be replaced. The descendant's inherited property value will instead
// dynamically update.
scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration_;
};
} // namespace cssom
} // namespace cobalt
#endif // COBALT_CSSOM_CSS_COMPUTED_STYLE_DATA_H_