| OLD | NEW |
| 1 {% from 'macros.tmpl' import license, print_if %} | 1 {% from 'macros.tmpl' import license, print_if %} |
| 2 {% from 'fields/field.tmpl' import encode, getter_expression, setter_expression,
declare_storage, fieldwise_compare, fieldwise_copy, fieldwise_diff, fieldwise_p
ointer_compare_inherited %} | 2 {% from 'fields/field.tmpl' import encode, getter_expression, setter_expression,
declare_storage, fieldwise_compare, fieldwise_copy, fieldwise_diff, fieldwise_p
ointer_compare_inherited %} |
| 3 {% from 'fields/group.tmpl' import define_field_group_class %} | 3 {% from 'fields/group.tmpl' import declare_field_group_class %} |
| 4 {{license()}} | 4 {{license()}} |
| 5 | 5 |
| 6 #ifndef ComputedStyleBase_h | 6 #ifndef ComputedStyleBase_h |
| 7 #define ComputedStyleBase_h | 7 #define ComputedStyleBase_h |
| 8 | 8 |
| 9 #include "core/style/ComputedStyleConstants.h" | 9 #include "core/style/ComputedStyleConstants.h" |
| 10 #include "core/CoreExport.h" | 10 #include "core/CoreExport.h" |
| 11 #include "core/style/DataRef.h" | 11 #include "core/style/DataRef.h" |
| 12 #include "core/style/MemberCopy.h" | 12 #include "core/style/MemberCopy.h" |
| 13 #include "core/style/StyleDifference.h" | 13 #include "core/style/StyleDifference.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 29 {% set field_templates = { | 29 {% set field_templates = { |
| 30 'keyword': keyword, | 30 'keyword': keyword, |
| 31 'primitive': primitive, | 31 'primitive': primitive, |
| 32 'monotonic_flag': monotonic_flag, | 32 'monotonic_flag': monotonic_flag, |
| 33 'storage_only': storage_only, | 33 'storage_only': storage_only, |
| 34 'external': external | 34 'external': external |
| 35 } %} | 35 } %} |
| 36 | 36 |
| 37 namespace blink { | 37 namespace blink { |
| 38 | 38 |
| 39 struct SameSizeAsComputedStyleBase { | 39 // Forward declaration for diff functions. |
| 40 {% if computed_style.subgroups is defined %} | 40 class ComputedStyle; |
| 41 void* dataRefs[{{computed_style.subgroups|length}}]; | |
| 42 {% endif %} | |
| 43 {% for field in computed_style.fields|rejectattr("is_bit_field") %} | |
| 44 {{field.type_name}} {{field.name}}; | |
| 45 {% endfor %} | |
| 46 unsigned m_bit_fields[{{computed_style.num_32_bit_words_for_bit_fields}}]; | |
| 47 }; | |
| 48 | 41 |
| 49 // The generated portion of ComputedStyle. For more info, see the header comment | 42 // The generated portion of ComputedStyle. For more info, see the header comment |
| 50 // in ComputedStyle.h. | 43 // in ComputedStyle.h. |
| 51 // | 44 // |
| 52 // ComputedStyleBase is a generated class that stores data members or 'fields' | 45 // ComputedStyleBase is a generated class that stores data members or 'fields' |
| 53 // used in ComputedStyle. These fields can represent CSS properties or internal | 46 // used in ComputedStyle. These fields can represent CSS properties or internal |
| 54 // style information. | 47 // style information. |
| 55 // | 48 // |
| 56 // STORAGE: | 49 // STORAGE: |
| 57 // | 50 // |
| (...skipping 17 matching lines...) Expand all Loading... |
| 75 // of all the flex box fields for every ComputedStyleBase. Similarly, when an | 68 // of all the flex box fields for every ComputedStyleBase. Similarly, when an |
| 76 // element inherits from its parent, its ComputedStyleBase can simply share all | 69 // element inherits from its parent, its ComputedStyleBase can simply share all |
| 77 // of its subgroups with the parent's. | 70 // of its subgroups with the parent's. |
| 78 // | 71 // |
| 79 // INTERFACE: | 72 // INTERFACE: |
| 80 // | 73 // |
| 81 // The functions generated for a field is determined by its 'template'. For | 74 // The functions generated for a field is determined by its 'template'. For |
| 82 // example, a field with the 'keyword' template has only one setter, whereas an | 75 // example, a field with the 'keyword' template has only one setter, whereas an |
| 83 // 'external' field has an extra setter that takes an rvalue reference. A list | 76 // 'external' field has an extra setter that takes an rvalue reference. A list |
| 84 // of the available templates can be found in CSSProperties.json5. | 77 // of the available templates can be found in CSSProperties.json5. |
| 85 // | |
| 86 // ComputedStyleBase is a template class to allow it to use functions on | |
| 87 // ComputedStyle. This allows ComputedStyleBase to use hand written functions it | |
| 88 // would otherwise not know about. It should only be templated with the | |
| 89 // ComputedStyle class and no other class is allowed. | |
| 90 template <class ComputedStyleFinal> | |
| 91 class CORE_EXPORT ComputedStyleBase { | 78 class CORE_EXPORT ComputedStyleBase { |
| 92 public: | 79 public: |
| 93 inline bool IndependentInheritedEqual(const ComputedStyleBase& o) const { | 80 inline bool IndependentInheritedEqual(const ComputedStyleBase& o) const { |
| 94 return ( | 81 return ( |
| 95 {{fieldwise_compare(computed_style, computed_style.all_fields | 82 {{fieldwise_compare(computed_style, computed_style.all_fields |
| 96 |selectattr("is_property") | 83 |selectattr("is_property") |
| 97 |selectattr("is_inherited") | 84 |selectattr("is_inherited") |
| 98 |selectattr("is_independent") | 85 |selectattr("is_independent") |
| 99 |list | 86 |list |
| 100 )|indent(8)}} | 87 )|indent(8)}} |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 135 true | 122 true |
| 136 ); | 123 ); |
| 137 } | 124 } |
| 138 | 125 |
| 139 enum IsAtShadowBoundary { | 126 enum IsAtShadowBoundary { |
| 140 kAtShadowBoundary, | 127 kAtShadowBoundary, |
| 141 kNotAtShadowBoundary, | 128 kNotAtShadowBoundary, |
| 142 }; | 129 }; |
| 143 | 130 |
| 144 void InheritFrom(const ComputedStyleBase& other, | 131 void InheritFrom(const ComputedStyleBase& other, |
| 145 IsAtShadowBoundary isAtShadowBoundary) { | 132 IsAtShadowBoundary isAtShadowBoundary); |
| 146 {{fieldwise_copy(computed_style, computed_style.all_fields | |
| 147 |selectattr("is_property") | |
| 148 |selectattr("is_inherited") | |
| 149 |list | |
| 150 )|indent(4)}} | |
| 151 } | |
| 152 | 133 |
| 153 void CopyNonInheritedFromCached( | 134 void CopyNonInheritedFromCached( |
| 154 const ComputedStyleBase& other) { | 135 const ComputedStyleBase& other); |
| 155 {{fieldwise_copy(computed_style, computed_style.all_fields | |
| 156 |rejectattr("has_custom_compare_and_copy") | |
| 157 |rejectattr("is_inherited") | |
| 158 |list | |
| 159 )|indent(4)}} | |
| 160 } | |
| 161 | 136 |
| 162 // Copies the values of any independent inherited properties from the parent | 137 // Copies the values of any independent inherited properties from the parent |
| 163 // style that are marked as inherited by this style. | 138 // style that are marked as inherited by this style. |
| 164 void PropagateIndependentInheritedProperties( | 139 void PropagateIndependentInheritedProperties( |
| 165 const ComputedStyleBase& parentStyle) { | 140 const ComputedStyleBase& parentStyle); |
| 166 {% for field in computed_style.all_fields if field.is_property and field.is_
independent %} | |
| 167 if ({{field.is_inherited_method_name}}()) | |
| 168 {{setter_expression(field)}} = parentStyle.{{getter_expression(field)}}; | |
| 169 {% endfor %} | |
| 170 } | |
| 171 | 141 |
| 172 {% for name, groups_to_diff in diff_functions_map.items() %} | 142 {% for name, groups_to_diff in diff_functions_map.items() %} |
| 173 bool {{name}}(const ComputedStyleFinal& other) const { | 143 static bool {{name}}(const ComputedStyle& a, const ComputedStyle& b); |
| 174 const ComputedStyleFinal& self = static_cast<const ComputedStyleFinal&>(*thi
s); | |
| 175 {{fieldwise_diff(groups_to_diff)|indent(4)}} | |
| 176 return false; | |
| 177 } | |
| 178 {% endfor %} | 144 {% endfor %} |
| 179 | 145 |
| 180 // Fields. | 146 // Fields. |
| 181 // TODO(sashab): Remove initialFoo() static methods and update callers to | 147 // TODO(sashab): Remove initialFoo() static methods and update callers to |
| 182 // use resetFoo(), which can be more efficient. | 148 // use resetFoo(), which can be more efficient. |
| 183 | 149 |
| 184 {% for field in computed_style.all_fields|sort(attribute='name') %} | 150 {% for field in computed_style.all_fields|sort(attribute='name') %} |
| 185 // {{field.property_name}} | 151 // {{field.property_name}} |
| 186 {{field_templates[field.field_template].decl_public_methods(field)|indent(2)}} | 152 {{field_templates[field.field_template].decl_public_methods(field)|indent(2)}} |
| 187 | 153 |
| 188 {% endfor %} | 154 {% endfor %} |
| 189 private: | 155 private: |
| 190 {% for subgroup in computed_style.subgroups %} | 156 {% for subgroup in computed_style.subgroups %} |
| 191 {{define_field_group_class(subgroup)|indent(2)}} | 157 {{declare_field_group_class(subgroup)|indent(2)}} |
| 192 | 158 |
| 193 {% endfor %} | 159 {% endfor %} |
| 194 | 160 |
| 195 protected: | 161 protected: |
| 196 // Constructor and destructor are protected so that only the parent class Comp
utedStyle | 162 // Constructor and destructor are protected so that only the parent class Comp
utedStyle |
| 197 // can instantiate this class. | 163 // can instantiate this class. |
| 198 ALWAYS_INLINE ComputedStyleBase() : | 164 ComputedStyleBase(); |
| 199 {% for field in computed_style.fields %} | |
| 200 {{field.name}}({{encode(field, field.default_value)}}){{print_if(not loop.
last, ',')}} | |
| 201 {% endfor %} | |
| 202 { | |
| 203 static_assert(std::is_same<ComputedStyle, ComputedStyleFinal>::value, "Compu
tedStyleBase can only be templated with ComputedStyle"); | |
| 204 {% for subgroup in computed_style.subgroups %} | |
| 205 {{subgroup.member_name}}.Init(); | |
| 206 {% endfor %} | |
| 207 } | |
| 208 | 165 |
| 209 {% for field in computed_style.all_fields|sort(attribute='name') %} | 166 {% for field in computed_style.all_fields|sort(attribute='name') %} |
| 210 {% if field.field_template in ('storage_only', 'monotonic_flag', 'external') %
} | 167 {% if field.field_template in ('storage_only', 'monotonic_flag', 'external') %
} |
| 211 // {{field.property_name}} | 168 // {{field.property_name}} |
| 212 {{field_templates[field.field_template].decl_protected_methods(field)|indent(2
)}} | 169 {{field_templates[field.field_template].decl_protected_methods(field)|indent(2
)}} |
| 213 | 170 |
| 214 {% endif %} | 171 {% endif %} |
| 215 {% endfor %} | 172 {% endfor %} |
| 216 | 173 |
| 217 ~ComputedStyleBase() = default; | 174 ~ComputedStyleBase() = default; |
| 218 | 175 |
| 219 // Storage. | 176 // Storage. |
| 220 {% for subgroup in computed_style.subgroups %} | 177 {% for subgroup in computed_style.subgroups %} |
| 221 DataRef<{{subgroup.type_name}}> {{subgroup.member_name}}; | 178 DataRef<{{subgroup.type_name}}> {{subgroup.member_name}}; |
| 222 {% endfor %} | 179 {% endfor %} |
| 223 | 180 |
| 224 private: | 181 private: |
| 225 {% for field in computed_style.fields %} | 182 {% for field in computed_style.fields %} |
| 226 {{declare_storage(field)}} | 183 {{declare_storage(field)}} |
| 227 {% endfor %} | 184 {% endfor %} |
| 228 }; | 185 }; |
| 229 | 186 |
| 230 } // namespace blink | 187 } // namespace blink |
| 231 | 188 |
| 232 #endif // ComputedStyleBase_h | 189 #endif // ComputedStyleBase_h |
| OLD | NEW |