blob: 5a95aaaccfc5fca6e1cff06a9c22ef764c83f3d0 [file] [log] [blame]
{% from 'macros.tmpl' import license, print_if %}
{% from 'fields/field.tmpl' import encode, getter_expression, setter_expression, fieldwise_copy, fieldwise_diff %}
{% from 'fields/group.tmpl' import define_field_group_class %}
{{license()}}
#include "core/ComputedStyleBase.h"
#include "core/style/ComputedStyle.h"
#include "platform/wtf/SizeAssertions.h"
namespace blink {
struct SameSizeAsComputedStyleBase {
{% if computed_style.subgroups is defined %}
void* dataRefs[{{computed_style.subgroups|length}}];
{% endif %}
{% for field in computed_style.fields|rejectattr("is_bit_field") %}
{{field.type_name}} {{field.name}};
{% endfor %}
unsigned m_bit_fields[{{computed_style.num_32_bit_words_for_bit_fields}}];
};
// If this fails, the packing algorithm in make_computed_style_base.py has
// failed to produce the optimal packed size. To fix, update the algorithm to
// ensure that the buckets are placed so that each takes up at most 1 word.
ASSERT_SIZE(ComputedStyleBase, SameSizeAsComputedStyleBase);
// Constructor and destructor are protected so that only the parent class ComputedStyle
// can instantiate this class.
ComputedStyleBase::ComputedStyleBase() :
{% for field in computed_style.fields %}
{{field.name}}({{encode(field, field.default_value)}}){{print_if(not loop.last, ',')}}
{% endfor %}
{
{% for subgroup in computed_style.subgroups %}
{{subgroup.member_name}}.Init();
{% endfor %}
}
void ComputedStyleBase::InheritFrom(const ComputedStyleBase& other,
IsAtShadowBoundary isAtShadowBoundary) {
{{fieldwise_copy(computed_style, computed_style.all_fields
|selectattr("is_property")
|selectattr("is_inherited")
|list
)|indent(2)}}
}
void ComputedStyleBase::CopyNonInheritedFromCached(
const ComputedStyleBase& other) {
{{fieldwise_copy(computed_style, computed_style.all_fields
|rejectattr("has_custom_compare_and_copy")
|rejectattr("is_inherited")
|list
)|indent(2)}}
}
void ComputedStyleBase::PropagateIndependentInheritedProperties(
const ComputedStyleBase& parentStyle) {
{% for field in computed_style.all_fields if field.is_property and field.is_independent %}
if ({{field.is_inherited_method_name}}())
{{setter_expression(field)}} = parentStyle.{{getter_expression(field)}};
{% endfor %}
}
{% for name, groups_to_diff in diff_functions_map.items() %}
bool ComputedStyleBase::{{name}}(const ComputedStyle& a, const ComputedStyle& b) {
{{fieldwise_diff(groups_to_diff)|indent(4)}}
return false;
}
{% endfor %}
{% for group in computed_style.subgroups %}
{{define_field_group_class(group)}}
{% endfor %}
} // namespace blink