1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/stl_util.h"
6 #include "third_party/blink/renderer/core/css/css_content_distribution_value.h"
7 #include "third_party/blink/renderer/core/css/css_font_family_value.h"
8 #include "third_party/blink/renderer/core/css/css_identifier_value.h"
9 #include "third_party/blink/renderer/core/css/css_initial_value.h"
10 #include "third_party/blink/renderer/core/css/css_numeric_literal_value.h"
11 #include "third_party/blink/renderer/core/css/css_primitive_value_mappings.h"
12 #include "third_party/blink/renderer/core/css/css_property_value.h"
13 #include "third_party/blink/renderer/core/css/css_value_pair.h"
14 #include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
15 #include "third_party/blink/renderer/core/css/parser/css_parser_fast_paths.h"
16 #include "third_party/blink/renderer/core/css/parser/css_parser_local_context.h"
17 #include "third_party/blink/renderer/core/css/parser/font_variant_east_asian_parser.h"
18 #include "third_party/blink/renderer/core/css/parser/font_variant_ligatures_parser.h"
19 #include "third_party/blink/renderer/core/css/parser/font_variant_numeric_parser.h"
20 #include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
21 #include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
22 #include "third_party/blink/renderer/core/css/properties/longhand.h"
23 #include "third_party/blink/renderer/core/css/properties/shorthands.h"
24 #include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
25 #include "third_party/blink/renderer/core/layout/layout_object.h"
26 #include "third_party/blink/renderer/core/layout/layout_theme_font_provider.h"
27 #include "third_party/blink/renderer/core/style/computed_style.h"
28 #include "third_party/blink/renderer/core/style_property_shorthand.h"
29 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
30
31 // Implementations of methods in Shorthand subclasses that aren't generated.
32
33 namespace blink {
34 namespace css_shorthand {
35
36 namespace {
37
38 // Legacy parsing allows <string>s for animation-name.
ConsumeAnimationValue(CSSPropertyID property,CSSParserTokenRange & range,const CSSParserContext & context,bool use_legacy_parsing)39 CSSValue* ConsumeAnimationValue(CSSPropertyID property,
40 CSSParserTokenRange& range,
41 const CSSParserContext& context,
42 bool use_legacy_parsing) {
43 switch (property) {
44 case CSSPropertyID::kAnimationDelay:
45 return css_parsing_utils::ConsumeTime(range, context, kValueRangeAll);
46 case CSSPropertyID::kAnimationDirection:
47 return css_parsing_utils::ConsumeIdent<
48 CSSValueID::kNormal, CSSValueID::kAlternate, CSSValueID::kReverse,
49 CSSValueID::kAlternateReverse>(range);
50 case CSSPropertyID::kAnimationDuration:
51 return css_parsing_utils::ConsumeTime(range, context,
52 kValueRangeNonNegative);
53 case CSSPropertyID::kAnimationFillMode:
54 return css_parsing_utils::ConsumeIdent<
55 CSSValueID::kNone, CSSValueID::kForwards, CSSValueID::kBackwards,
56 CSSValueID::kBoth>(range);
57 case CSSPropertyID::kAnimationIterationCount:
58 return css_parsing_utils::ConsumeAnimationIterationCount(range, context);
59 case CSSPropertyID::kAnimationName:
60 return css_parsing_utils::ConsumeAnimationName(range, context,
61 use_legacy_parsing);
62 case CSSPropertyID::kAnimationPlayState:
63 return css_parsing_utils::ConsumeIdent<CSSValueID::kRunning,
64 CSSValueID::kPaused>(range);
65 case CSSPropertyID::kAnimationTimingFunction:
66 return css_parsing_utils::ConsumeAnimationTimingFunction(range, context);
67 case CSSPropertyID::kAnimationTimeline:
68 return css_parsing_utils::ConsumeAnimationTimeline(range, context);
69 default:
70 NOTREACHED();
71 return nullptr;
72 }
73 }
74
75 } // namespace
76
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext & local_context,HeapVector<CSSPropertyValue,256> & properties) const77 bool Animation::ParseShorthand(
78 bool important,
79 CSSParserTokenRange& range,
80 const CSSParserContext& context,
81 const CSSParserLocalContext& local_context,
82 HeapVector<CSSPropertyValue, 256>& properties) const {
83 const StylePropertyShorthand shorthand = animationShorthand();
84 const unsigned longhand_count = shorthand.length();
85
86 HeapVector<Member<CSSValueList>, css_parsing_utils::kMaxNumAnimationLonghands>
87 longhands(longhand_count);
88 if (!css_parsing_utils::ConsumeAnimationShorthand(
89 shorthand, longhands, ConsumeAnimationValue, range, context,
90 local_context.UseAliasParsing())) {
91 return false;
92 }
93
94 for (unsigned i = 0; i < longhand_count; ++i) {
95 css_parsing_utils::AddProperty(
96 shorthand.properties()[i]->PropertyID(), shorthand.id(), *longhands[i],
97 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
98 properties);
99 }
100 return range.AtEnd();
101 }
102
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject *,bool allow_visited_style) const103 const CSSValue* Animation::CSSValueFromComputedStyleInternal(
104 const ComputedStyle& style,
105 const SVGComputedStyle&,
106 const LayoutObject*,
107 bool allow_visited_style) const {
108 const CSSAnimationData* animation_data = style.Animations();
109 if (animation_data) {
110 CSSValueList* animations_list = CSSValueList::CreateCommaSeparated();
111 for (wtf_size_t i = 0; i < animation_data->NameList().size(); ++i) {
112 CSSValueList* list = CSSValueList::CreateSpaceSeparated();
113 list->Append(*CSSNumericLiteralValue::Create(
114 CSSTimingData::GetRepeated(animation_data->DurationList(), i),
115 CSSPrimitiveValue::UnitType::kSeconds));
116 list->Append(*ComputedStyleUtils::CreateTimingFunctionValue(
117 CSSTimingData::GetRepeated(animation_data->TimingFunctionList(), i)
118 .get()));
119 list->Append(*CSSNumericLiteralValue::Create(
120 CSSTimingData::GetRepeated(animation_data->DelayList(), i),
121 CSSPrimitiveValue::UnitType::kSeconds));
122 list->Append(*ComputedStyleUtils::ValueForAnimationIterationCount(
123 CSSTimingData::GetRepeated(animation_data->IterationCountList(), i)));
124 list->Append(*ComputedStyleUtils::ValueForAnimationDirection(
125 CSSTimingData::GetRepeated(animation_data->DirectionList(), i)));
126 list->Append(*ComputedStyleUtils::ValueForAnimationFillMode(
127 CSSTimingData::GetRepeated(animation_data->FillModeList(), i)));
128 list->Append(*ComputedStyleUtils::ValueForAnimationPlayState(
129 CSSTimingData::GetRepeated(animation_data->PlayStateList(), i)));
130 list->Append(*MakeGarbageCollected<CSSCustomIdentValue>(
131 animation_data->NameList()[i]));
132 // When serializing shorthands, a component value must be omitted
133 // if doesn't change the meaning of the overall value.
134 // https://drafts.csswg.org/cssom/#serializing-css-values
135 if (CSSAnimationData::InitialTimeline() !=
136 animation_data->GetTimeline(i)) {
137 DCHECK(RuntimeEnabledFeatures::CSSScrollTimelineEnabled());
138 list->Append(*ComputedStyleUtils::ValueForStyleNameOrKeyword(
139 animation_data->GetTimeline(i)));
140 }
141 animations_list->Append(*list);
142 }
143 return animations_list;
144 }
145
146 CSSValueList* list = CSSValueList::CreateSpaceSeparated();
147 // animation-name default value.
148 list->Append(*CSSIdentifierValue::Create(CSSValueID::kNone));
149 list->Append(
150 *CSSNumericLiteralValue::Create(CSSAnimationData::InitialDuration(),
151 CSSPrimitiveValue::UnitType::kSeconds));
152 list->Append(*ComputedStyleUtils::CreateTimingFunctionValue(
153 CSSAnimationData::InitialTimingFunction().get()));
154 list->Append(*CSSNumericLiteralValue::Create(
155 CSSAnimationData::InitialDelay(), CSSPrimitiveValue::UnitType::kSeconds));
156 list->Append(
157 *CSSNumericLiteralValue::Create(CSSAnimationData::InitialIterationCount(),
158 CSSPrimitiveValue::UnitType::kNumber));
159 list->Append(*ComputedStyleUtils::ValueForAnimationDirection(
160 CSSAnimationData::InitialDirection()));
161 list->Append(*ComputedStyleUtils::ValueForAnimationFillMode(
162 CSSAnimationData::InitialFillMode()));
163 // Initial animation-play-state.
164 list->Append(*CSSIdentifierValue::Create(CSSValueID::kRunning));
165 return list;
166 }
167
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext & local_context,HeapVector<CSSPropertyValue,256> & properties) const168 bool Background::ParseShorthand(
169 bool important,
170 CSSParserTokenRange& range,
171 const CSSParserContext& context,
172 const CSSParserLocalContext& local_context,
173 HeapVector<CSSPropertyValue, 256>& properties) const {
174 return css_parsing_utils::ParseBackgroundOrMask(important, range, context,
175 local_context, properties);
176 }
177
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const178 const CSSValue* Background::CSSValueFromComputedStyleInternal(
179 const ComputedStyle& style,
180 const SVGComputedStyle&,
181 const LayoutObject* layout_object,
182 bool allow_visited_style) const {
183 return ComputedStyleUtils::ValuesForBackgroundShorthand(style, layout_object,
184 allow_visited_style);
185 }
186
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const187 bool BackgroundPosition::ParseShorthand(
188 bool important,
189 CSSParserTokenRange& range,
190 const CSSParserContext& context,
191 const CSSParserLocalContext&,
192 HeapVector<CSSPropertyValue, 256>& properties) const {
193 CSSValue* result_x = nullptr;
194 CSSValue* result_y = nullptr;
195
196 if (!css_parsing_utils::ConsumeBackgroundPosition(
197 range, context, css_parsing_utils::UnitlessQuirk::kAllow, result_x,
198 result_y) ||
199 !range.AtEnd())
200 return false;
201
202 css_parsing_utils::AddProperty(
203 CSSPropertyID::kBackgroundPositionX, CSSPropertyID::kBackgroundPosition,
204 *result_x, important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
205 properties);
206
207 css_parsing_utils::AddProperty(
208 CSSPropertyID::kBackgroundPositionY, CSSPropertyID::kBackgroundPosition,
209 *result_y, important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
210 properties);
211 return true;
212 }
213
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject *,bool allow_visited_style) const214 const CSSValue* BackgroundPosition::CSSValueFromComputedStyleInternal(
215 const ComputedStyle& style,
216 const SVGComputedStyle&,
217 const LayoutObject*,
218 bool allow_visited_style) const {
219 return ComputedStyleUtils::BackgroundPositionOrWebkitMaskPosition(
220 *this, style, &style.BackgroundLayers());
221 }
222
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext & local_context,HeapVector<CSSPropertyValue,256> & properties) const223 bool BackgroundRepeat::ParseShorthand(
224 bool important,
225 CSSParserTokenRange& range,
226 const CSSParserContext& context,
227 const CSSParserLocalContext& local_context,
228 HeapVector<CSSPropertyValue, 256>& properties) const {
229 CSSValue* result_x = nullptr;
230 CSSValue* result_y = nullptr;
231 bool implicit = false;
232 if (!css_parsing_utils::ConsumeRepeatStyle(range, result_x, result_y,
233 implicit) ||
234 !range.AtEnd())
235 return false;
236
237 css_parsing_utils::AddProperty(
238 CSSPropertyID::kBackgroundRepeatX, CSSPropertyID::kBackgroundRepeat,
239 *result_x, important,
240 implicit ? css_parsing_utils::IsImplicitProperty::kImplicit
241 : css_parsing_utils::IsImplicitProperty::kNotImplicit,
242 properties);
243 css_parsing_utils::AddProperty(
244 CSSPropertyID::kBackgroundRepeatY, CSSPropertyID::kBackgroundRepeat,
245 *result_y, important,
246 implicit ? css_parsing_utils::IsImplicitProperty::kImplicit
247 : css_parsing_utils::IsImplicitProperty::kNotImplicit,
248 properties);
249
250 return true;
251 }
252
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject *,bool allow_visited_style) const253 const CSSValue* BackgroundRepeat::CSSValueFromComputedStyleInternal(
254 const ComputedStyle& style,
255 const SVGComputedStyle&,
256 const LayoutObject*,
257 bool allow_visited_style) const {
258 return ComputedStyleUtils::BackgroundRepeatOrWebkitMaskRepeat(
259 &style.BackgroundLayers());
260 }
261
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const262 bool BorderBlockColor::ParseShorthand(
263 bool important,
264 CSSParserTokenRange& range,
265 const CSSParserContext& context,
266 const CSSParserLocalContext&,
267 HeapVector<CSSPropertyValue, 256>& properties) const {
268 return css_parsing_utils::ConsumeShorthandVia2Longhands(
269 borderBlockColorShorthand(), important, context, range, properties);
270 }
271
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const272 const CSSValue* BorderBlockColor::CSSValueFromComputedStyleInternal(
273 const ComputedStyle& style,
274 const SVGComputedStyle&,
275 const LayoutObject* layout_object,
276 bool allow_visited_style) const {
277 return ComputedStyleUtils::ValuesForInlineBlockShorthand(
278 borderBlockColorShorthand(), style, layout_object, allow_visited_style);
279 }
280
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const281 bool BorderBlock::ParseShorthand(
282 bool important,
283 CSSParserTokenRange& range,
284 const CSSParserContext& context,
285 const CSSParserLocalContext&,
286 HeapVector<CSSPropertyValue, 256>& properties) const {
287 const CSSValue* width = nullptr;
288 const CSSValue* style = nullptr;
289 const CSSValue* color = nullptr;
290
291 if (!css_parsing_utils::ConsumeBorderShorthand(range, context, width, style,
292 color)) {
293 return false;
294 };
295
296 css_parsing_utils::AddExpandedPropertyForValue(
297 CSSPropertyID::kBorderBlockWidth, *width, important, properties);
298 css_parsing_utils::AddExpandedPropertyForValue(
299 CSSPropertyID::kBorderBlockStyle, *style, important, properties);
300 css_parsing_utils::AddExpandedPropertyForValue(
301 CSSPropertyID::kBorderBlockColor, *color, important, properties);
302
303 return range.AtEnd();
304 }
305
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const306 const CSSValue* BorderBlock::CSSValueFromComputedStyleInternal(
307 const ComputedStyle& style,
308 const SVGComputedStyle&,
309 const LayoutObject* layout_object,
310 bool allow_visited_style) const {
311 const CSSValue* value_start =
312 GetCSSPropertyBorderBlockStart().CSSValueFromComputedStyle(
313 style, layout_object, allow_visited_style);
314 const CSSValue* value_end =
315 GetCSSPropertyBorderBlockEnd().CSSValueFromComputedStyle(
316 style, layout_object, allow_visited_style);
317 if (!DataEquivalent(value_start, value_end)) {
318 return nullptr;
319 }
320 return value_start;
321 }
322
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const323 bool BorderBlockEnd::ParseShorthand(
324 bool important,
325 CSSParserTokenRange& range,
326 const CSSParserContext& context,
327 const CSSParserLocalContext&,
328 HeapVector<CSSPropertyValue, 256>& properties) const {
329 return css_parsing_utils::ConsumeShorthandGreedilyViaLonghands(
330 borderBlockEndShorthand(), important, context, range, properties);
331 }
332
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const333 bool BorderBlockStart::ParseShorthand(
334 bool important,
335 CSSParserTokenRange& range,
336 const CSSParserContext& context,
337 const CSSParserLocalContext&,
338 HeapVector<CSSPropertyValue, 256>& properties) const {
339 return css_parsing_utils::ConsumeShorthandGreedilyViaLonghands(
340 borderBlockStartShorthand(), important, context, range, properties);
341 }
342
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const343 bool BorderBlockStyle::ParseShorthand(
344 bool important,
345 CSSParserTokenRange& range,
346 const CSSParserContext& context,
347 const CSSParserLocalContext&,
348 HeapVector<CSSPropertyValue, 256>& properties) const {
349 return css_parsing_utils::ConsumeShorthandVia2Longhands(
350 borderBlockStyleShorthand(), important, context, range, properties);
351 }
352
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const353 const CSSValue* BorderBlockStyle::CSSValueFromComputedStyleInternal(
354 const ComputedStyle& style,
355 const SVGComputedStyle&,
356 const LayoutObject* layout_object,
357 bool allow_visited_style) const {
358 return ComputedStyleUtils::ValuesForInlineBlockShorthand(
359 borderBlockStyleShorthand(), style, layout_object, allow_visited_style);
360 }
361
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const362 bool BorderBlockWidth::ParseShorthand(
363 bool important,
364 CSSParserTokenRange& range,
365 const CSSParserContext& context,
366 const CSSParserLocalContext&,
367 HeapVector<CSSPropertyValue, 256>& properties) const {
368 return css_parsing_utils::ConsumeShorthandVia2Longhands(
369 borderBlockWidthShorthand(), important, context, range, properties);
370 }
371
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const372 const CSSValue* BorderBlockWidth::CSSValueFromComputedStyleInternal(
373 const ComputedStyle& style,
374 const SVGComputedStyle&,
375 const LayoutObject* layout_object,
376 bool allow_visited_style) const {
377 return ComputedStyleUtils::ValuesForInlineBlockShorthand(
378 borderBlockWidthShorthand(), style, layout_object, allow_visited_style);
379 }
380
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const381 bool BorderBottom::ParseShorthand(
382 bool important,
383 CSSParserTokenRange& range,
384 const CSSParserContext& context,
385 const CSSParserLocalContext&,
386 HeapVector<CSSPropertyValue, 256>& properties) const {
387 return css_parsing_utils::ConsumeShorthandGreedilyViaLonghands(
388 borderBottomShorthand(), important, context, range, properties);
389 }
390
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const391 const CSSValue* BorderBottom::CSSValueFromComputedStyleInternal(
392 const ComputedStyle& style,
393 const SVGComputedStyle&,
394 const LayoutObject* layout_object,
395 bool allow_visited_style) const {
396 return ComputedStyleUtils::ValuesForShorthandProperty(
397 borderBottomShorthand(), style, layout_object, allow_visited_style);
398 }
399
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const400 bool BorderColor::ParseShorthand(
401 bool important,
402 CSSParserTokenRange& range,
403 const CSSParserContext& context,
404 const CSSParserLocalContext&,
405 HeapVector<CSSPropertyValue, 256>& properties) const {
406 return css_parsing_utils::ConsumeShorthandVia4Longhands(
407 borderColorShorthand(), important, context, range, properties);
408 }
409
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const410 const CSSValue* BorderColor::CSSValueFromComputedStyleInternal(
411 const ComputedStyle& style,
412 const SVGComputedStyle&,
413 const LayoutObject* layout_object,
414 bool allow_visited_style) const {
415 return ComputedStyleUtils::ValuesForSidesShorthand(
416 borderColorShorthand(), style, layout_object, allow_visited_style);
417 }
418
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const419 bool Border::ParseShorthand(
420 bool important,
421 CSSParserTokenRange& range,
422 const CSSParserContext& context,
423 const CSSParserLocalContext&,
424 HeapVector<CSSPropertyValue, 256>& properties) const {
425 const CSSValue* width = nullptr;
426 const CSSValue* style = nullptr;
427 const CSSValue* color = nullptr;
428
429 if (!css_parsing_utils::ConsumeBorderShorthand(range, context, width, style,
430 color)) {
431 return false;
432 };
433
434 css_parsing_utils::AddExpandedPropertyForValue(CSSPropertyID::kBorderWidth,
435 *width, important, properties);
436 css_parsing_utils::AddExpandedPropertyForValue(CSSPropertyID::kBorderStyle,
437 *style, important, properties);
438 css_parsing_utils::AddExpandedPropertyForValue(CSSPropertyID::kBorderColor,
439 *color, important, properties);
440 css_parsing_utils::AddExpandedPropertyForValue(CSSPropertyID::kBorderImage,
441 *CSSInitialValue::Create(),
442 important, properties);
443
444 return range.AtEnd();
445 }
446
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const447 const CSSValue* Border::CSSValueFromComputedStyleInternal(
448 const ComputedStyle& style,
449 const SVGComputedStyle&,
450 const LayoutObject* layout_object,
451 bool allow_visited_style) const {
452 const CSSValue* value = GetCSSPropertyBorderTop().CSSValueFromComputedStyle(
453 style, layout_object, allow_visited_style);
454 static const CSSProperty* kProperties[3] = {&GetCSSPropertyBorderRight(),
455 &GetCSSPropertyBorderBottom(),
456 &GetCSSPropertyBorderLeft()};
457 for (size_t i = 0; i < base::size(kProperties); ++i) {
458 const CSSValue* value_for_side = kProperties[i]->CSSValueFromComputedStyle(
459 style, layout_object, allow_visited_style);
460 if (!DataEquivalent(value, value_for_side)) {
461 return nullptr;
462 }
463 }
464 return value;
465 }
466
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const467 bool BorderImage::ParseShorthand(
468 bool important,
469 CSSParserTokenRange& range,
470 const CSSParserContext& context,
471 const CSSParserLocalContext&,
472 HeapVector<CSSPropertyValue, 256>& properties) const {
473 CSSValue* source = nullptr;
474 CSSValue* slice = nullptr;
475 CSSValue* width = nullptr;
476 CSSValue* outset = nullptr;
477 CSSValue* repeat = nullptr;
478
479 if (!css_parsing_utils::ConsumeBorderImageComponents(
480 range, context, source, slice, width, outset, repeat,
481 css_parsing_utils::DefaultFill::kNoFill)) {
482 return false;
483 }
484
485 css_parsing_utils::AddProperty(
486 CSSPropertyID::kBorderImageSource, CSSPropertyID::kBorderImage,
487 source
488 ? *source
489 : *To<Longhand>(&GetCSSPropertyBorderImageSource())->InitialValue(),
490 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
491 properties);
492 css_parsing_utils::AddProperty(
493 CSSPropertyID::kBorderImageSlice, CSSPropertyID::kBorderImage,
494 slice ? *slice
495 : *To<Longhand>(&GetCSSPropertyBorderImageSlice())->InitialValue(),
496 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
497 properties);
498 css_parsing_utils::AddProperty(
499 CSSPropertyID::kBorderImageWidth, CSSPropertyID::kBorderImage,
500 width ? *width
501 : *To<Longhand>(&GetCSSPropertyBorderImageWidth())->InitialValue(),
502 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
503 properties);
504 css_parsing_utils::AddProperty(
505 CSSPropertyID::kBorderImageOutset, CSSPropertyID::kBorderImage,
506 outset
507 ? *outset
508 : *To<Longhand>(&GetCSSPropertyBorderImageOutset())->InitialValue(),
509 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
510 properties);
511 css_parsing_utils::AddProperty(
512 CSSPropertyID::kBorderImageRepeat, CSSPropertyID::kBorderImage,
513 repeat
514 ? *repeat
515 : *To<Longhand>(&GetCSSPropertyBorderImageRepeat())->InitialValue(),
516 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
517 properties);
518
519 return true;
520 }
521
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject *,bool allow_visited_style) const522 const CSSValue* BorderImage::CSSValueFromComputedStyleInternal(
523 const ComputedStyle& style,
524 const SVGComputedStyle&,
525 const LayoutObject*,
526 bool allow_visited_style) const {
527 return ComputedStyleUtils::ValueForNinePieceImage(style.BorderImage(), style,
528 allow_visited_style);
529 }
530
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const531 bool BorderInlineColor::ParseShorthand(
532 bool important,
533 CSSParserTokenRange& range,
534 const CSSParserContext& context,
535 const CSSParserLocalContext&,
536 HeapVector<CSSPropertyValue, 256>& properties) const {
537 return css_parsing_utils::ConsumeShorthandVia2Longhands(
538 borderInlineColorShorthand(), important, context, range, properties);
539 }
540
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const541 const CSSValue* BorderInlineColor::CSSValueFromComputedStyleInternal(
542 const ComputedStyle& style,
543 const SVGComputedStyle&,
544 const LayoutObject* layout_object,
545 bool allow_visited_style) const {
546 return ComputedStyleUtils::ValuesForInlineBlockShorthand(
547 borderInlineColorShorthand(), style, layout_object, allow_visited_style);
548 }
549
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const550 bool BorderInline::ParseShorthand(
551 bool important,
552 CSSParserTokenRange& range,
553 const CSSParserContext& context,
554 const CSSParserLocalContext&,
555 HeapVector<CSSPropertyValue, 256>& properties) const {
556 const CSSValue* width = nullptr;
557 const CSSValue* style = nullptr;
558 const CSSValue* color = nullptr;
559
560 if (!css_parsing_utils::ConsumeBorderShorthand(range, context, width, style,
561 color)) {
562 return false;
563 };
564
565 css_parsing_utils::AddExpandedPropertyForValue(
566 CSSPropertyID::kBorderInlineWidth, *width, important, properties);
567 css_parsing_utils::AddExpandedPropertyForValue(
568 CSSPropertyID::kBorderInlineStyle, *style, important, properties);
569 css_parsing_utils::AddExpandedPropertyForValue(
570 CSSPropertyID::kBorderInlineColor, *color, important, properties);
571
572 return range.AtEnd();
573 }
574
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const575 const CSSValue* BorderInline::CSSValueFromComputedStyleInternal(
576 const ComputedStyle& style,
577 const SVGComputedStyle&,
578 const LayoutObject* layout_object,
579 bool allow_visited_style) const {
580 const CSSValue* value_start =
581 GetCSSPropertyBorderInlineStart().CSSValueFromComputedStyle(
582 style, layout_object, allow_visited_style);
583 const CSSValue* value_end =
584 GetCSSPropertyBorderInlineEnd().CSSValueFromComputedStyle(
585 style, layout_object, allow_visited_style);
586 if (!DataEquivalent(value_start, value_end)) {
587 return nullptr;
588 }
589 return value_start;
590 }
591
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const592 bool BorderInlineEnd::ParseShorthand(
593 bool important,
594 CSSParserTokenRange& range,
595 const CSSParserContext& context,
596 const CSSParserLocalContext&,
597 HeapVector<CSSPropertyValue, 256>& properties) const {
598 return css_parsing_utils::ConsumeShorthandGreedilyViaLonghands(
599 borderInlineEndShorthand(), important, context, range, properties);
600 }
601
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const602 bool BorderInlineStart::ParseShorthand(
603 bool important,
604 CSSParserTokenRange& range,
605 const CSSParserContext& context,
606 const CSSParserLocalContext&,
607 HeapVector<CSSPropertyValue, 256>& properties) const {
608 return css_parsing_utils::ConsumeShorthandGreedilyViaLonghands(
609 borderInlineStartShorthand(), important, context, range, properties);
610 }
611
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const612 bool BorderInlineStyle::ParseShorthand(
613 bool important,
614 CSSParserTokenRange& range,
615 const CSSParserContext& context,
616 const CSSParserLocalContext&,
617 HeapVector<CSSPropertyValue, 256>& properties) const {
618 return css_parsing_utils::ConsumeShorthandVia2Longhands(
619 borderInlineStyleShorthand(), important, context, range, properties);
620 }
621
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const622 const CSSValue* BorderInlineStyle::CSSValueFromComputedStyleInternal(
623 const ComputedStyle& style,
624 const SVGComputedStyle&,
625 const LayoutObject* layout_object,
626 bool allow_visited_style) const {
627 return ComputedStyleUtils::ValuesForInlineBlockShorthand(
628 borderInlineStyleShorthand(), style, layout_object, allow_visited_style);
629 }
630
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const631 bool BorderInlineWidth::ParseShorthand(
632 bool important,
633 CSSParserTokenRange& range,
634 const CSSParserContext& context,
635 const CSSParserLocalContext&,
636 HeapVector<CSSPropertyValue, 256>& properties) const {
637 return css_parsing_utils::ConsumeShorthandVia2Longhands(
638 borderInlineWidthShorthand(), important, context, range, properties);
639 }
640
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const641 const CSSValue* BorderInlineWidth::CSSValueFromComputedStyleInternal(
642 const ComputedStyle& style,
643 const SVGComputedStyle&,
644 const LayoutObject* layout_object,
645 bool allow_visited_style) const {
646 return ComputedStyleUtils::ValuesForInlineBlockShorthand(
647 borderInlineWidthShorthand(), style, layout_object, allow_visited_style);
648 }
649
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const650 bool BorderLeft::ParseShorthand(
651 bool important,
652 CSSParserTokenRange& range,
653 const CSSParserContext& context,
654 const CSSParserLocalContext&,
655 HeapVector<CSSPropertyValue, 256>& properties) const {
656 return css_parsing_utils::ConsumeShorthandGreedilyViaLonghands(
657 borderLeftShorthand(), important, context, range, properties);
658 }
659
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const660 const CSSValue* BorderLeft::CSSValueFromComputedStyleInternal(
661 const ComputedStyle& style,
662 const SVGComputedStyle&,
663 const LayoutObject* layout_object,
664 bool allow_visited_style) const {
665 return ComputedStyleUtils::ValuesForShorthandProperty(
666 borderLeftShorthand(), style, layout_object, allow_visited_style);
667 }
668
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext & local_context,HeapVector<CSSPropertyValue,256> & properties) const669 bool BorderRadius::ParseShorthand(
670 bool important,
671 CSSParserTokenRange& range,
672 const CSSParserContext& context,
673 const CSSParserLocalContext& local_context,
674 HeapVector<CSSPropertyValue, 256>& properties) const {
675 CSSValue* horizontal_radii[4] = {nullptr};
676 CSSValue* vertical_radii[4] = {nullptr};
677
678 if (!css_parsing_utils::ConsumeRadii(horizontal_radii, vertical_radii, range,
679 context,
680 local_context.UseAliasParsing()))
681 return false;
682
683 css_parsing_utils::AddProperty(
684 CSSPropertyID::kBorderTopLeftRadius, CSSPropertyID::kBorderRadius,
685 *MakeGarbageCollected<CSSValuePair>(horizontal_radii[0],
686 vertical_radii[0],
687 CSSValuePair::kDropIdenticalValues),
688 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
689 properties);
690 css_parsing_utils::AddProperty(
691 CSSPropertyID::kBorderTopRightRadius, CSSPropertyID::kBorderRadius,
692 *MakeGarbageCollected<CSSValuePair>(horizontal_radii[1],
693 vertical_radii[1],
694 CSSValuePair::kDropIdenticalValues),
695 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
696 properties);
697 css_parsing_utils::AddProperty(
698 CSSPropertyID::kBorderBottomRightRadius, CSSPropertyID::kBorderRadius,
699 *MakeGarbageCollected<CSSValuePair>(horizontal_radii[2],
700 vertical_radii[2],
701 CSSValuePair::kDropIdenticalValues),
702 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
703 properties);
704 css_parsing_utils::AddProperty(
705 CSSPropertyID::kBorderBottomLeftRadius, CSSPropertyID::kBorderRadius,
706 *MakeGarbageCollected<CSSValuePair>(horizontal_radii[3],
707 vertical_radii[3],
708 CSSValuePair::kDropIdenticalValues),
709 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
710 properties);
711 return true;
712 }
713
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject *,bool allow_visited_style) const714 const CSSValue* BorderRadius::CSSValueFromComputedStyleInternal(
715 const ComputedStyle& style,
716 const SVGComputedStyle&,
717 const LayoutObject*,
718 bool allow_visited_style) const {
719 return ComputedStyleUtils::ValueForBorderRadiusShorthand(style);
720 }
721
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const722 bool BorderRight::ParseShorthand(
723 bool important,
724 CSSParserTokenRange& range,
725 const CSSParserContext& context,
726 const CSSParserLocalContext&,
727 HeapVector<CSSPropertyValue, 256>& properties) const {
728 return css_parsing_utils::ConsumeShorthandGreedilyViaLonghands(
729 borderRightShorthand(), important, context, range, properties);
730 }
731
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const732 const CSSValue* BorderRight::CSSValueFromComputedStyleInternal(
733 const ComputedStyle& style,
734 const SVGComputedStyle&,
735 const LayoutObject* layout_object,
736 bool allow_visited_style) const {
737 return ComputedStyleUtils::ValuesForShorthandProperty(
738 borderRightShorthand(), style, layout_object, allow_visited_style);
739 }
740
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const741 bool BorderSpacing::ParseShorthand(
742 bool important,
743 CSSParserTokenRange& range,
744 const CSSParserContext& context,
745 const CSSParserLocalContext&,
746 HeapVector<CSSPropertyValue, 256>& properties) const {
747 CSSValue* horizontal_spacing =
748 ConsumeLength(range, context, kValueRangeNonNegative,
749 css_parsing_utils::UnitlessQuirk::kAllow);
750 if (!horizontal_spacing)
751 return false;
752 CSSValue* vertical_spacing = horizontal_spacing;
753 if (!range.AtEnd()) {
754 vertical_spacing = ConsumeLength(range, context, kValueRangeNonNegative,
755 css_parsing_utils::UnitlessQuirk::kAllow);
756 }
757 if (!vertical_spacing || !range.AtEnd())
758 return false;
759 css_parsing_utils::AddProperty(
760 CSSPropertyID::kWebkitBorderHorizontalSpacing,
761 CSSPropertyID::kBorderSpacing, *horizontal_spacing, important,
762 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
763 css_parsing_utils::AddProperty(
764 CSSPropertyID::kWebkitBorderVerticalSpacing,
765 CSSPropertyID::kBorderSpacing, *vertical_spacing, important,
766 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
767 return true;
768 }
769
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject *,bool allow_visited_style) const770 const CSSValue* BorderSpacing::CSSValueFromComputedStyleInternal(
771 const ComputedStyle& style,
772 const SVGComputedStyle&,
773 const LayoutObject*,
774 bool allow_visited_style) const {
775 CSSValueList* list = CSSValueList::CreateSpaceSeparated();
776 list->Append(*ZoomAdjustedPixelValue(style.HorizontalBorderSpacing(), style));
777 list->Append(*ZoomAdjustedPixelValue(style.VerticalBorderSpacing(), style));
778 return list;
779 }
780
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const781 bool BorderStyle::ParseShorthand(
782 bool important,
783 CSSParserTokenRange& range,
784 const CSSParserContext& context,
785 const CSSParserLocalContext&,
786 HeapVector<CSSPropertyValue, 256>& properties) const {
787 return css_parsing_utils::ConsumeShorthandVia4Longhands(
788 borderStyleShorthand(), important, context, range, properties);
789 }
790
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const791 const CSSValue* BorderStyle::CSSValueFromComputedStyleInternal(
792 const ComputedStyle& style,
793 const SVGComputedStyle&,
794 const LayoutObject* layout_object,
795 bool allow_visited_style) const {
796 return ComputedStyleUtils::ValuesForSidesShorthand(
797 borderStyleShorthand(), style, layout_object, allow_visited_style);
798 }
799
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const800 bool BorderTop::ParseShorthand(
801 bool important,
802 CSSParserTokenRange& range,
803 const CSSParserContext& context,
804 const CSSParserLocalContext&,
805 HeapVector<CSSPropertyValue, 256>& properties) const {
806 return css_parsing_utils::ConsumeShorthandGreedilyViaLonghands(
807 borderTopShorthand(), important, context, range, properties);
808 }
809
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const810 const CSSValue* BorderTop::CSSValueFromComputedStyleInternal(
811 const ComputedStyle& style,
812 const SVGComputedStyle&,
813 const LayoutObject* layout_object,
814 bool allow_visited_style) const {
815 return ComputedStyleUtils::ValuesForShorthandProperty(
816 borderTopShorthand(), style, layout_object, allow_visited_style);
817 }
818
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const819 bool BorderWidth::ParseShorthand(
820 bool important,
821 CSSParserTokenRange& range,
822 const CSSParserContext& context,
823 const CSSParserLocalContext&,
824 HeapVector<CSSPropertyValue, 256>& properties) const {
825 return css_parsing_utils::ConsumeShorthandVia4Longhands(
826 borderWidthShorthand(), important, context, range, properties);
827 }
828
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const829 const CSSValue* BorderWidth::CSSValueFromComputedStyleInternal(
830 const ComputedStyle& style,
831 const SVGComputedStyle&,
832 const LayoutObject* layout_object,
833 bool allow_visited_style) const {
834 return ComputedStyleUtils::ValuesForSidesShorthand(
835 borderWidthShorthand(), style, layout_object, allow_visited_style);
836 }
837
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const838 bool ColumnRule::ParseShorthand(
839 bool important,
840 CSSParserTokenRange& range,
841 const CSSParserContext& context,
842 const CSSParserLocalContext&,
843 HeapVector<CSSPropertyValue, 256>& properties) const {
844 return css_parsing_utils::ConsumeShorthandGreedilyViaLonghands(
845 columnRuleShorthand(), important, context, range, properties);
846 }
847
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const848 const CSSValue* ColumnRule::CSSValueFromComputedStyleInternal(
849 const ComputedStyle& style,
850 const SVGComputedStyle&,
851 const LayoutObject* layout_object,
852 bool allow_visited_style) const {
853 return ComputedStyleUtils::ValuesForShorthandProperty(
854 columnRuleShorthand(), style, layout_object, allow_visited_style);
855 }
856
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const857 bool Columns::ParseShorthand(
858 bool important,
859 CSSParserTokenRange& range,
860 const CSSParserContext& context,
861 const CSSParserLocalContext&,
862 HeapVector<CSSPropertyValue, 256>& properties) const {
863 CSSValue* column_width = nullptr;
864 CSSValue* column_count = nullptr;
865 if (!css_parsing_utils::ConsumeColumnWidthOrCount(range, context,
866 column_width, column_count))
867 return false;
868 css_parsing_utils::ConsumeColumnWidthOrCount(range, context, column_width,
869 column_count);
870 if (!range.AtEnd())
871 return false;
872 if (!column_width)
873 column_width = CSSIdentifierValue::Create(CSSValueID::kAuto);
874 if (!column_count)
875 column_count = CSSIdentifierValue::Create(CSSValueID::kAuto);
876 css_parsing_utils::AddProperty(
877 CSSPropertyID::kColumnWidth, CSSPropertyID::kInvalid, *column_width,
878 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
879 properties);
880 css_parsing_utils::AddProperty(
881 CSSPropertyID::kColumnCount, CSSPropertyID::kInvalid, *column_count,
882 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
883 properties);
884 return true;
885 }
886
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const887 const CSSValue* Columns::CSSValueFromComputedStyleInternal(
888 const ComputedStyle& style,
889 const SVGComputedStyle&,
890 const LayoutObject* layout_object,
891 bool allow_visited_style) const {
892 return ComputedStyleUtils::ValuesForShorthandProperty(
893 columnsShorthand(), style, layout_object, allow_visited_style);
894 }
895
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const896 bool Flex::ParseShorthand(bool important,
897 CSSParserTokenRange& range,
898 const CSSParserContext& context,
899 const CSSParserLocalContext&,
900 HeapVector<CSSPropertyValue, 256>& properties) const {
901 static const double kUnsetValue = -1;
902 double flex_grow = kUnsetValue;
903 double flex_shrink = kUnsetValue;
904 CSSValue* flex_basis = nullptr;
905
906 if (range.Peek().Id() == CSSValueID::kNone) {
907 flex_grow = 0;
908 flex_shrink = 0;
909 flex_basis = CSSIdentifierValue::Create(CSSValueID::kAuto);
910 range.ConsumeIncludingWhitespace();
911 } else {
912 unsigned index = 0;
913 while (!range.AtEnd() && index++ < 3) {
914 double num;
915 if (css_parsing_utils::ConsumeNumberRaw(range, context, num)) {
916 if (num < 0)
917 return false;
918 if (flex_grow == kUnsetValue) {
919 flex_grow = num;
920 } else if (flex_shrink == kUnsetValue) {
921 flex_shrink = num;
922 } else if (!num) {
923 // flex only allows a basis of 0 (sans units) if
924 // flex-grow and flex-shrink values have already been
925 // set.
926 flex_basis = CSSNumericLiteralValue::Create(
927 0, CSSPrimitiveValue::UnitType::kPixels);
928 } else {
929 return false;
930 }
931 } else if (!flex_basis) {
932 if (range.Peek().Id() == CSSValueID::kAuto)
933 flex_basis = css_parsing_utils::ConsumeIdent(range);
934 if (!flex_basis) {
935 flex_basis = css_parsing_utils::ConsumeLengthOrPercent(
936 range, context, kValueRangeNonNegative);
937 }
938 if (index == 2 && !range.AtEnd())
939 return false;
940 }
941 }
942 if (index == 0)
943 return false;
944 if (flex_grow == kUnsetValue)
945 flex_grow = 1;
946 if (flex_shrink == kUnsetValue)
947 flex_shrink = 1;
948 if (!flex_basis) {
949 flex_basis = CSSNumericLiteralValue::Create(
950 0, CSSPrimitiveValue::UnitType::kPercentage);
951 }
952 }
953
954 if (!range.AtEnd())
955 return false;
956 css_parsing_utils::AddProperty(
957 CSSPropertyID::kFlexGrow, CSSPropertyID::kFlex,
958 *CSSNumericLiteralValue::Create(clampTo<float>(flex_grow),
959 CSSPrimitiveValue::UnitType::kNumber),
960 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
961 properties);
962 css_parsing_utils::AddProperty(
963 CSSPropertyID::kFlexShrink, CSSPropertyID::kFlex,
964 *CSSNumericLiteralValue::Create(clampTo<float>(flex_shrink),
965 CSSPrimitiveValue::UnitType::kNumber),
966 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
967 properties);
968
969 css_parsing_utils::AddProperty(
970 CSSPropertyID::kFlexBasis, CSSPropertyID::kFlex, *flex_basis, important,
971 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
972
973 return true;
974 }
975
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const976 const CSSValue* Flex::CSSValueFromComputedStyleInternal(
977 const ComputedStyle& style,
978 const SVGComputedStyle&,
979 const LayoutObject* layout_object,
980 bool allow_visited_style) const {
981 return ComputedStyleUtils::ValuesForShorthandProperty(
982 flexShorthand(), style, layout_object, allow_visited_style);
983 }
984
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const985 bool FlexFlow::ParseShorthand(
986 bool important,
987 CSSParserTokenRange& range,
988 const CSSParserContext& context,
989 const CSSParserLocalContext&,
990 HeapVector<CSSPropertyValue, 256>& properties) const {
991 return css_parsing_utils::ConsumeShorthandGreedilyViaLonghands(
992 flexFlowShorthand(), important, context, range, properties);
993 }
994
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const995 const CSSValue* FlexFlow::CSSValueFromComputedStyleInternal(
996 const ComputedStyle& style,
997 const SVGComputedStyle&,
998 const LayoutObject* layout_object,
999 bool allow_visited_style) const {
1000 return ComputedStyleUtils::ValuesForShorthandProperty(
1001 flexFlowShorthand(), style, layout_object, allow_visited_style);
1002 }
1003 namespace {
1004
ConsumeSystemFont(bool important,CSSParserTokenRange & range,HeapVector<CSSPropertyValue,256> & properties)1005 bool ConsumeSystemFont(bool important,
1006 CSSParserTokenRange& range,
1007 HeapVector<CSSPropertyValue, 256>& properties) {
1008 CSSValueID system_font_id = range.ConsumeIncludingWhitespace().Id();
1009 DCHECK_GE(system_font_id, CSSValueID::kCaption);
1010 DCHECK_LE(system_font_id, CSSValueID::kStatusBar);
1011 if (!range.AtEnd())
1012 return false;
1013
1014 FontSelectionValue font_slope = NormalSlopeValue();
1015 FontSelectionValue font_weight = NormalWeightValue();
1016 float font_size = 0;
1017 AtomicString font_family;
1018 LayoutThemeFontProvider::SystemFont(system_font_id, font_slope, font_weight,
1019 font_size, font_family);
1020
1021 css_parsing_utils::AddProperty(
1022 CSSPropertyID::kFontStyle, CSSPropertyID::kFont,
1023 *CSSIdentifierValue::Create(font_slope == ItalicSlopeValue()
1024 ? CSSValueID::kItalic
1025 : CSSValueID::kNormal),
1026 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
1027 properties);
1028 css_parsing_utils::AddProperty(
1029 CSSPropertyID::kFontWeight, CSSPropertyID::kFont,
1030 *CSSNumericLiteralValue::Create(font_weight,
1031 CSSPrimitiveValue::UnitType::kNumber),
1032 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
1033 properties);
1034 css_parsing_utils::AddProperty(
1035 CSSPropertyID::kFontSize, CSSPropertyID::kFont,
1036 *CSSNumericLiteralValue::Create(font_size,
1037 CSSPrimitiveValue::UnitType::kPixels),
1038 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
1039 properties);
1040
1041 CSSValueList* font_family_list = CSSValueList::CreateCommaSeparated();
1042 font_family_list->Append(*CSSFontFamilyValue::Create(font_family));
1043 css_parsing_utils::AddProperty(
1044 CSSPropertyID::kFontFamily, CSSPropertyID::kFont, *font_family_list,
1045 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
1046 properties);
1047
1048 css_parsing_utils::AddProperty(
1049 CSSPropertyID::kFontStretch, CSSPropertyID::kFont,
1050 *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
1051 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1052 css_parsing_utils::AddProperty(
1053 CSSPropertyID::kFontVariantCaps, CSSPropertyID::kFont,
1054 *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
1055 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1056 css_parsing_utils::AddProperty(
1057 CSSPropertyID::kFontVariantLigatures, CSSPropertyID::kFont,
1058 *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
1059 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1060 css_parsing_utils::AddProperty(
1061 CSSPropertyID::kFontVariantNumeric, CSSPropertyID::kFont,
1062 *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
1063 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1064 css_parsing_utils::AddProperty(
1065 CSSPropertyID::kFontVariantEastAsian, CSSPropertyID::kFont,
1066 *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
1067 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1068 css_parsing_utils::AddProperty(
1069 CSSPropertyID::kLineHeight, CSSPropertyID::kFont,
1070 *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
1071 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1072 return true;
1073 }
1074
ConsumeFont(bool important,CSSParserTokenRange & range,const CSSParserContext & context,HeapVector<CSSPropertyValue,256> & properties)1075 bool ConsumeFont(bool important,
1076 CSSParserTokenRange& range,
1077 const CSSParserContext& context,
1078 HeapVector<CSSPropertyValue, 256>& properties) {
1079 // Optional font-style, font-variant, font-stretch and font-weight.
1080 // Each may be normal.
1081 CSSValue* font_style = nullptr;
1082 CSSIdentifierValue* font_variant_caps = nullptr;
1083 CSSValue* font_weight = nullptr;
1084 CSSValue* font_stretch = nullptr;
1085 const int kNumReorderableFontProperties = 4;
1086 for (int i = 0; i < kNumReorderableFontProperties && !range.AtEnd(); ++i) {
1087 CSSValueID id = range.Peek().Id();
1088 if (id == CSSValueID::kNormal) {
1089 css_parsing_utils::ConsumeIdent(range);
1090 continue;
1091 }
1092 if (!font_style &&
1093 (id == CSSValueID::kItalic || id == CSSValueID::kOblique)) {
1094 font_style = css_parsing_utils::ConsumeFontStyle(range, context);
1095 if (!font_style)
1096 return false;
1097 continue;
1098 }
1099 if (!font_variant_caps && id == CSSValueID::kSmallCaps) {
1100 // Font variant in the shorthand is particular, it only accepts normal or
1101 // small-caps.
1102 // See https://drafts.csswg.org/css-fonts/#propdef-font
1103 font_variant_caps = css_parsing_utils::ConsumeFontVariantCSS21(range);
1104 if (font_variant_caps)
1105 continue;
1106 }
1107 if (!font_weight) {
1108 font_weight = css_parsing_utils::ConsumeFontWeight(range, context);
1109 if (font_weight)
1110 continue;
1111 }
1112 // Stretch in the font shorthand can only take the CSS Fonts Level 3
1113 // keywords, not arbitrary values, compare
1114 // https://drafts.csswg.org/css-fonts-4/#font-prop
1115 // Bail out if the last possible property of the set in this loop could not
1116 // be parsed, this closes the first block of optional values of the font
1117 // shorthand, compare: [ [ <‘font-style’> || <font-variant-css21> ||
1118 // <‘font-weight’> || <font-stretch-css3> ]?
1119 if (font_stretch ||
1120 !(font_stretch =
1121 css_parsing_utils::ConsumeFontStretchKeywordOnly(range)))
1122 break;
1123 }
1124
1125 if (range.AtEnd())
1126 return false;
1127
1128 css_parsing_utils::AddProperty(
1129 CSSPropertyID::kFontStyle, CSSPropertyID::kFont,
1130 font_style ? *font_style
1131 : *CSSIdentifierValue::Create(CSSValueID::kNormal),
1132 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
1133 properties);
1134 css_parsing_utils::AddProperty(
1135 CSSPropertyID::kFontVariantCaps, CSSPropertyID::kFont,
1136 font_variant_caps ? *font_variant_caps
1137 : *CSSIdentifierValue::Create(CSSValueID::kNormal),
1138 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
1139 properties);
1140 css_parsing_utils::AddProperty(
1141 CSSPropertyID::kFontVariantLigatures, CSSPropertyID::kFont,
1142 *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
1143 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1144 css_parsing_utils::AddProperty(
1145 CSSPropertyID::kFontVariantNumeric, CSSPropertyID::kFont,
1146 *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
1147 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1148 css_parsing_utils::AddProperty(
1149 CSSPropertyID::kFontVariantEastAsian, CSSPropertyID::kFont,
1150 *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
1151 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1152
1153 css_parsing_utils::AddProperty(
1154 CSSPropertyID::kFontWeight, CSSPropertyID::kFont,
1155 font_weight ? *font_weight
1156 : *CSSIdentifierValue::Create(CSSValueID::kNormal),
1157 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
1158 properties);
1159 css_parsing_utils::AddProperty(
1160 CSSPropertyID::kFontStretch, CSSPropertyID::kFont,
1161 font_stretch ? *font_stretch
1162 : *CSSIdentifierValue::Create(CSSValueID::kNormal),
1163 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
1164 properties);
1165
1166 // Now a font size _must_ come.
1167 CSSValue* font_size = css_parsing_utils::ConsumeFontSize(range, context);
1168 if (!font_size || range.AtEnd())
1169 return false;
1170
1171 css_parsing_utils::AddProperty(
1172 CSSPropertyID::kFontSize, CSSPropertyID::kFont, *font_size, important,
1173 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1174
1175 if (css_parsing_utils::ConsumeSlashIncludingWhitespace(range)) {
1176 CSSValue* line_height =
1177 css_parsing_utils::ConsumeLineHeight(range, context);
1178 if (!line_height)
1179 return false;
1180 css_parsing_utils::AddProperty(
1181 CSSPropertyID::kLineHeight, CSSPropertyID::kFont, *line_height,
1182 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
1183 properties);
1184 } else {
1185 css_parsing_utils::AddProperty(
1186 CSSPropertyID::kLineHeight, CSSPropertyID::kFont,
1187 *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
1188 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1189 }
1190
1191 // Font family must come now.
1192 CSSValue* parsed_family_value = css_parsing_utils::ConsumeFontFamily(range);
1193 if (!parsed_family_value)
1194 return false;
1195
1196 css_parsing_utils::AddProperty(
1197 CSSPropertyID::kFontFamily, CSSPropertyID::kFont, *parsed_family_value,
1198 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
1199 properties);
1200
1201 // FIXME: http://www.w3.org/TR/2011/WD-css3-fonts-20110324/#font-prop requires
1202 // that "font-stretch", "font-size-adjust", and "font-kerning" be reset to
1203 // their initial values but we don't seem to support them at the moment. They
1204 // should also be added here once implemented.
1205 return range.AtEnd();
1206 }
1207
1208 } // namespace
1209
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const1210 bool Font::ParseShorthand(bool important,
1211 CSSParserTokenRange& range,
1212 const CSSParserContext& context,
1213 const CSSParserLocalContext&,
1214 HeapVector<CSSPropertyValue, 256>& properties) const {
1215 const CSSParserToken& token = range.Peek();
1216 if (token.Id() >= CSSValueID::kCaption &&
1217 token.Id() <= CSSValueID::kStatusBar)
1218 return ConsumeSystemFont(important, range, properties);
1219 return ConsumeFont(important, range, context, properties);
1220 }
1221
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject *,bool allow_visited_style) const1222 const CSSValue* Font::CSSValueFromComputedStyleInternal(
1223 const ComputedStyle& style,
1224 const SVGComputedStyle&,
1225 const LayoutObject*,
1226 bool allow_visited_style) const {
1227 return ComputedStyleUtils::ValueForFont(style);
1228 }
1229
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext &,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const1230 bool FontVariant::ParseShorthand(
1231 bool important,
1232 CSSParserTokenRange& range,
1233 const CSSParserContext&,
1234 const CSSParserLocalContext&,
1235 HeapVector<CSSPropertyValue, 256>& properties) const {
1236 if (css_parsing_utils::IdentMatches<CSSValueID::kNormal, CSSValueID::kNone>(
1237 range.Peek().Id())) {
1238 css_parsing_utils::AddProperty(
1239 CSSPropertyID::kFontVariantLigatures, CSSPropertyID::kFontVariant,
1240 *css_parsing_utils::ConsumeIdent(range), important,
1241 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1242 css_parsing_utils::AddProperty(
1243 CSSPropertyID::kFontVariantCaps, CSSPropertyID::kFontVariant,
1244 *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
1245 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1246 css_parsing_utils::AddProperty(
1247 CSSPropertyID::kFontVariantNumeric, CSSPropertyID::kFontVariant,
1248 *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
1249 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1250 css_parsing_utils::AddProperty(
1251 CSSPropertyID::kFontVariantEastAsian, CSSPropertyID::kFontVariant,
1252 *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
1253 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1254 return range.AtEnd();
1255 }
1256
1257 CSSIdentifierValue* caps_value = nullptr;
1258 FontVariantLigaturesParser ligatures_parser;
1259 FontVariantNumericParser numeric_parser;
1260 FontVariantEastAsianParser east_asian_parser;
1261 do {
1262 FontVariantLigaturesParser::ParseResult ligatures_parse_result =
1263 ligatures_parser.ConsumeLigature(range);
1264 FontVariantNumericParser::ParseResult numeric_parse_result =
1265 numeric_parser.ConsumeNumeric(range);
1266 FontVariantEastAsianParser::ParseResult east_asian_parse_result =
1267 east_asian_parser.ConsumeEastAsian(range);
1268 if (ligatures_parse_result ==
1269 FontVariantLigaturesParser::ParseResult::kConsumedValue ||
1270 numeric_parse_result ==
1271 FontVariantNumericParser::ParseResult::kConsumedValue ||
1272 east_asian_parse_result ==
1273 FontVariantEastAsianParser::ParseResult::kConsumedValue)
1274 continue;
1275
1276 if (ligatures_parse_result ==
1277 FontVariantLigaturesParser::ParseResult::kDisallowedValue ||
1278 numeric_parse_result ==
1279 FontVariantNumericParser::ParseResult::kDisallowedValue ||
1280 east_asian_parse_result ==
1281 FontVariantEastAsianParser::ParseResult::kDisallowedValue)
1282 return false;
1283
1284 CSSValueID id = range.Peek().Id();
1285 switch (id) {
1286 case CSSValueID::kSmallCaps:
1287 case CSSValueID::kAllSmallCaps:
1288 case CSSValueID::kPetiteCaps:
1289 case CSSValueID::kAllPetiteCaps:
1290 case CSSValueID::kUnicase:
1291 case CSSValueID::kTitlingCaps:
1292 // Only one caps value permitted in font-variant grammar.
1293 if (caps_value)
1294 return false;
1295 caps_value = css_parsing_utils::ConsumeIdent(range);
1296 break;
1297 default:
1298 return false;
1299 }
1300 } while (!range.AtEnd());
1301
1302 css_parsing_utils::AddProperty(
1303 CSSPropertyID::kFontVariantLigatures, CSSPropertyID::kFontVariant,
1304 *ligatures_parser.FinalizeValue(), important,
1305 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1306 css_parsing_utils::AddProperty(
1307 CSSPropertyID::kFontVariantNumeric, CSSPropertyID::kFontVariant,
1308 *numeric_parser.FinalizeValue(), important,
1309 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1310 css_parsing_utils::AddProperty(
1311 CSSPropertyID::kFontVariantEastAsian, CSSPropertyID::kFontVariant,
1312 *east_asian_parser.FinalizeValue(), important,
1313 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1314 css_parsing_utils::AddProperty(
1315 CSSPropertyID::kFontVariantCaps, CSSPropertyID::kFontVariant,
1316 caps_value ? *caps_value
1317 : *CSSIdentifierValue::Create(CSSValueID::kNormal),
1318 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
1319 properties);
1320 return true;
1321 }
1322
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const1323 const CSSValue* FontVariant::CSSValueFromComputedStyleInternal(
1324 const ComputedStyle& style,
1325 const SVGComputedStyle&,
1326 const LayoutObject* layout_object,
1327 bool allow_visited_style) const {
1328 return ComputedStyleUtils::ValuesForFontVariantProperty(style, layout_object,
1329 allow_visited_style);
1330 }
1331
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const1332 bool Gap::ParseShorthand(bool important,
1333 CSSParserTokenRange& range,
1334 const CSSParserContext& context,
1335 const CSSParserLocalContext&,
1336 HeapVector<CSSPropertyValue, 256>& properties) const {
1337 DCHECK_EQ(shorthandForProperty(CSSPropertyID::kGap).length(), 2u);
1338 CSSValue* row_gap = css_parsing_utils::ConsumeGapLength(range, context);
1339 CSSValue* column_gap = css_parsing_utils::ConsumeGapLength(range, context);
1340 if (!row_gap || !range.AtEnd())
1341 return false;
1342 if (!column_gap)
1343 column_gap = row_gap;
1344 css_parsing_utils::AddProperty(
1345 CSSPropertyID::kRowGap, CSSPropertyID::kGap, *row_gap, important,
1346 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1347 css_parsing_utils::AddProperty(
1348 CSSPropertyID::kColumnGap, CSSPropertyID::kGap, *column_gap, important,
1349 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1350 return true;
1351 }
1352
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const1353 const CSSValue* Gap::CSSValueFromComputedStyleInternal(
1354 const ComputedStyle& style,
1355 const SVGComputedStyle&,
1356 const LayoutObject* layout_object,
1357 bool allow_visited_style) const {
1358 return ComputedStyleUtils::ValuesForGapShorthand(
1359 gapShorthand(), style, layout_object, allow_visited_style);
1360 }
1361
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const1362 bool GridArea::ParseShorthand(
1363 bool important,
1364 CSSParserTokenRange& range,
1365 const CSSParserContext& context,
1366 const CSSParserLocalContext&,
1367 HeapVector<CSSPropertyValue, 256>& properties) const {
1368 DCHECK_EQ(gridAreaShorthand().length(), 4u);
1369
1370 CSSValue* row_start_value =
1371 css_parsing_utils::ConsumeGridLine(range, context);
1372 if (!row_start_value)
1373 return false;
1374 CSSValue* column_start_value = nullptr;
1375 CSSValue* row_end_value = nullptr;
1376 CSSValue* column_end_value = nullptr;
1377 if (css_parsing_utils::ConsumeSlashIncludingWhitespace(range)) {
1378 column_start_value = css_parsing_utils::ConsumeGridLine(range, context);
1379 if (!column_start_value)
1380 return false;
1381 if (css_parsing_utils::ConsumeSlashIncludingWhitespace(range)) {
1382 row_end_value = css_parsing_utils::ConsumeGridLine(range, context);
1383 if (!row_end_value)
1384 return false;
1385 if (css_parsing_utils::ConsumeSlashIncludingWhitespace(range)) {
1386 column_end_value = css_parsing_utils::ConsumeGridLine(range, context);
1387 if (!column_end_value)
1388 return false;
1389 }
1390 }
1391 }
1392 if (!range.AtEnd())
1393 return false;
1394 if (!column_start_value) {
1395 column_start_value = row_start_value->IsCustomIdentValue()
1396 ? row_start_value
1397 : CSSIdentifierValue::Create(CSSValueID::kAuto);
1398 }
1399 if (!row_end_value) {
1400 row_end_value = row_start_value->IsCustomIdentValue()
1401 ? row_start_value
1402 : CSSIdentifierValue::Create(CSSValueID::kAuto);
1403 }
1404 if (!column_end_value) {
1405 column_end_value = column_start_value->IsCustomIdentValue()
1406 ? column_start_value
1407 : CSSIdentifierValue::Create(CSSValueID::kAuto);
1408 }
1409
1410 css_parsing_utils::AddProperty(
1411 CSSPropertyID::kGridRowStart, CSSPropertyID::kGridArea, *row_start_value,
1412 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
1413 properties);
1414 css_parsing_utils::AddProperty(
1415 CSSPropertyID::kGridColumnStart, CSSPropertyID::kGridArea,
1416 *column_start_value, important,
1417 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1418 css_parsing_utils::AddProperty(
1419 CSSPropertyID::kGridRowEnd, CSSPropertyID::kGridArea, *row_end_value,
1420 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
1421 properties);
1422 css_parsing_utils::AddProperty(
1423 CSSPropertyID::kGridColumnEnd, CSSPropertyID::kGridArea,
1424 *column_end_value, important,
1425 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1426 return true;
1427 }
1428
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const1429 const CSSValue* GridArea::CSSValueFromComputedStyleInternal(
1430 const ComputedStyle& style,
1431 const SVGComputedStyle&,
1432 const LayoutObject* layout_object,
1433 bool allow_visited_style) const {
1434 return ComputedStyleUtils::ValuesForGridShorthand(
1435 gridAreaShorthand(), style, layout_object, allow_visited_style);
1436 }
1437
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const1438 bool GridColumn::ParseShorthand(
1439 bool important,
1440 CSSParserTokenRange& range,
1441 const CSSParserContext& context,
1442 const CSSParserLocalContext&,
1443 HeapVector<CSSPropertyValue, 256>& properties) const {
1444 const StylePropertyShorthand& shorthand =
1445 shorthandForProperty(CSSPropertyID::kGridColumn);
1446 DCHECK_EQ(shorthand.length(), 2u);
1447
1448 CSSValue* start_value = nullptr;
1449 CSSValue* end_value = nullptr;
1450 if (!css_parsing_utils::ConsumeGridItemPositionShorthand(
1451 important, range, context, start_value, end_value)) {
1452 return false;
1453 }
1454
1455 css_parsing_utils::AddProperty(
1456 shorthand.properties()[0]->PropertyID(), CSSPropertyID::kGridColumn,
1457 *start_value, important,
1458 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1459 css_parsing_utils::AddProperty(
1460 shorthand.properties()[1]->PropertyID(), CSSPropertyID::kGridColumn,
1461 *end_value, important,
1462 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1463
1464 return true;
1465 }
1466
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const1467 const CSSValue* GridColumn::CSSValueFromComputedStyleInternal(
1468 const ComputedStyle& style,
1469 const SVGComputedStyle&,
1470 const LayoutObject* layout_object,
1471 bool allow_visited_style) const {
1472 return ComputedStyleUtils::ValuesForGridShorthand(
1473 gridColumnShorthand(), style, layout_object, allow_visited_style);
1474 }
1475
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const1476 bool GridColumnGap::ParseShorthand(
1477 bool important,
1478 CSSParserTokenRange& range,
1479 const CSSParserContext& context,
1480 const CSSParserLocalContext&,
1481 HeapVector<CSSPropertyValue, 256>& properties) const {
1482 CSSValue* gap_length = css_parsing_utils::ConsumeGapLength(range, context);
1483 if (!gap_length || !range.AtEnd())
1484 return false;
1485
1486 css_parsing_utils::AddProperty(
1487 CSSPropertyID::kColumnGap, CSSPropertyID::kGridColumnGap, *gap_length,
1488 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
1489 properties);
1490 return true;
1491 }
1492
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const1493 const CSSValue* GridColumnGap::CSSValueFromComputedStyleInternal(
1494 const ComputedStyle& style,
1495 const SVGComputedStyle&,
1496 const LayoutObject* layout_object,
1497 bool allow_visited_style) const {
1498 return ComputedStyleUtils::ValuesForShorthandProperty(
1499 gridColumnGapShorthand(), style, layout_object, allow_visited_style);
1500 }
1501
1502 namespace {
1503
ConsumeImplicitAutoFlow(CSSParserTokenRange & range,const CSSValue & flow_direction)1504 CSSValueList* ConsumeImplicitAutoFlow(CSSParserTokenRange& range,
1505 const CSSValue& flow_direction) {
1506 // [ auto-flow && dense? ]
1507 CSSValue* dense_algorithm = nullptr;
1508 if ((css_parsing_utils::ConsumeIdent<CSSValueID::kAutoFlow>(range))) {
1509 dense_algorithm =
1510 css_parsing_utils::ConsumeIdent<CSSValueID::kDense>(range);
1511 } else {
1512 dense_algorithm =
1513 css_parsing_utils::ConsumeIdent<CSSValueID::kDense>(range);
1514 if (!dense_algorithm)
1515 return nullptr;
1516 if (!css_parsing_utils::ConsumeIdent<CSSValueID::kAutoFlow>(range))
1517 return nullptr;
1518 }
1519 CSSValueList* list = CSSValueList::CreateSpaceSeparated();
1520 list->Append(flow_direction);
1521 if (dense_algorithm)
1522 list->Append(*dense_algorithm);
1523 return list;
1524 }
1525
1526 } // namespace
1527
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const1528 bool Grid::ParseShorthand(bool important,
1529 CSSParserTokenRange& range,
1530 const CSSParserContext& context,
1531 const CSSParserLocalContext&,
1532 HeapVector<CSSPropertyValue, 256>& properties) const {
1533 DCHECK_EQ(shorthandForProperty(CSSPropertyID::kGrid).length(), 6u);
1534
1535 CSSParserTokenRange range_copy = range;
1536
1537 CSSValue* template_rows = nullptr;
1538 CSSValue* template_columns = nullptr;
1539 CSSValue* template_areas = nullptr;
1540
1541 if (css_parsing_utils::ConsumeGridTemplateShorthand(
1542 important, range, context, template_rows, template_columns,
1543 template_areas)) {
1544 DCHECK(template_rows);
1545 DCHECK(template_columns);
1546 DCHECK(template_areas);
1547
1548 css_parsing_utils::AddProperty(
1549 CSSPropertyID::kGridTemplateRows, CSSPropertyID::kGrid, *template_rows,
1550 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
1551 properties);
1552 css_parsing_utils::AddProperty(
1553 CSSPropertyID::kGridTemplateColumns, CSSPropertyID::kGrid,
1554 *template_columns, important,
1555 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1556 css_parsing_utils::AddProperty(
1557 CSSPropertyID::kGridTemplateAreas, CSSPropertyID::kGrid,
1558 *template_areas, important,
1559 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1560
1561 // It can only be specified the explicit or the implicit grid properties in
1562 // a single grid declaration. The sub-properties not specified are set to
1563 // their initial value, as normal for shorthands.
1564 css_parsing_utils::AddProperty(
1565 CSSPropertyID::kGridAutoFlow, CSSPropertyID::kGrid,
1566 *CSSInitialValue::Create(), important,
1567 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1568 css_parsing_utils::AddProperty(
1569 CSSPropertyID::kGridAutoColumns, CSSPropertyID::kGrid,
1570 *CSSInitialValue::Create(), important,
1571 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1572 css_parsing_utils::AddProperty(
1573 CSSPropertyID::kGridAutoRows, CSSPropertyID::kGrid,
1574 *CSSInitialValue::Create(), important,
1575 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1576 return true;
1577 }
1578
1579 range = range_copy;
1580
1581 CSSValue* auto_columns_value = nullptr;
1582 CSSValue* auto_rows_value = nullptr;
1583 CSSValueList* grid_auto_flow = nullptr;
1584 template_rows = nullptr;
1585 template_columns = nullptr;
1586
1587 if (css_parsing_utils::IdentMatches<CSSValueID::kDense,
1588 CSSValueID::kAutoFlow>(
1589 range.Peek().Id())) {
1590 // 2- [ auto-flow && dense? ] <grid-auto-rows>? / <grid-template-columns>
1591 grid_auto_flow = ConsumeImplicitAutoFlow(
1592 range, *CSSIdentifierValue::Create(CSSValueID::kRow));
1593 if (!grid_auto_flow)
1594 return false;
1595 if (css_parsing_utils::ConsumeSlashIncludingWhitespace(range)) {
1596 auto_rows_value = CSSInitialValue::Create();
1597 } else {
1598 auto_rows_value = css_parsing_utils::ConsumeGridTrackList(
1599 range, context, css_parsing_utils::TrackListType::kGridAuto);
1600 if (!auto_rows_value)
1601 return false;
1602 if (!css_parsing_utils::ConsumeSlashIncludingWhitespace(range))
1603 return false;
1604 }
1605 if (!(template_columns =
1606 css_parsing_utils::ConsumeGridTemplatesRowsOrColumns(range,
1607 context)))
1608 return false;
1609 template_rows = CSSInitialValue::Create();
1610 auto_columns_value = CSSInitialValue::Create();
1611 } else {
1612 // 3- <grid-template-rows> / [ auto-flow && dense? ] <grid-auto-columns>?
1613 template_rows =
1614 css_parsing_utils::ConsumeGridTemplatesRowsOrColumns(range, context);
1615 if (!template_rows)
1616 return false;
1617 if (!css_parsing_utils::ConsumeSlashIncludingWhitespace(range))
1618 return false;
1619 grid_auto_flow = ConsumeImplicitAutoFlow(
1620 range, *CSSIdentifierValue::Create(CSSValueID::kColumn));
1621 if (!grid_auto_flow)
1622 return false;
1623 if (range.AtEnd()) {
1624 auto_columns_value = CSSInitialValue::Create();
1625 } else {
1626 auto_columns_value = css_parsing_utils::ConsumeGridTrackList(
1627 range, context, css_parsing_utils::TrackListType::kGridAuto);
1628 if (!auto_columns_value)
1629 return false;
1630 }
1631 template_columns = CSSInitialValue::Create();
1632 auto_rows_value = CSSInitialValue::Create();
1633 }
1634
1635 if (!range.AtEnd())
1636 return false;
1637
1638 // It can only be specified the explicit or the implicit grid properties in a
1639 // single grid declaration. The sub-properties not specified are set to their
1640 // initial value, as normal for shorthands.
1641 css_parsing_utils::AddProperty(
1642 CSSPropertyID::kGridTemplateColumns, CSSPropertyID::kGrid,
1643 *template_columns, important,
1644 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1645 css_parsing_utils::AddProperty(
1646 CSSPropertyID::kGridTemplateRows, CSSPropertyID::kGrid, *template_rows,
1647 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
1648 properties);
1649 css_parsing_utils::AddProperty(
1650 CSSPropertyID::kGridTemplateAreas, CSSPropertyID::kGrid,
1651 *CSSInitialValue::Create(), important,
1652 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1653 css_parsing_utils::AddProperty(
1654 CSSPropertyID::kGridAutoFlow, CSSPropertyID::kGrid, *grid_auto_flow,
1655 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
1656 properties);
1657 css_parsing_utils::AddProperty(
1658 CSSPropertyID::kGridAutoColumns, CSSPropertyID::kGrid,
1659 *auto_columns_value, important,
1660 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1661 css_parsing_utils::AddProperty(
1662 CSSPropertyID::kGridAutoRows, CSSPropertyID::kGrid, *auto_rows_value,
1663 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
1664 properties);
1665 return true;
1666 }
1667
IsLayoutDependent(const ComputedStyle * style,LayoutObject * layout_object) const1668 bool Grid::IsLayoutDependent(const ComputedStyle* style,
1669 LayoutObject* layout_object) const {
1670 return layout_object && layout_object->IsLayoutGrid();
1671 }
1672
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const1673 const CSSValue* Grid::CSSValueFromComputedStyleInternal(
1674 const ComputedStyle& style,
1675 const SVGComputedStyle&,
1676 const LayoutObject* layout_object,
1677 bool allow_visited_style) const {
1678 return ComputedStyleUtils::ValuesForGridShorthand(
1679 gridShorthand(), style, layout_object, allow_visited_style);
1680 }
1681
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const1682 bool GridGap::ParseShorthand(
1683 bool important,
1684 CSSParserTokenRange& range,
1685 const CSSParserContext& context,
1686 const CSSParserLocalContext&,
1687 HeapVector<CSSPropertyValue, 256>& properties) const {
1688 DCHECK_EQ(shorthandForProperty(CSSPropertyID::kGridGap).length(), 2u);
1689 CSSValue* row_gap = css_parsing_utils::ConsumeGapLength(range, context);
1690 CSSValue* column_gap = css_parsing_utils::ConsumeGapLength(range, context);
1691 if (!row_gap || !range.AtEnd())
1692 return false;
1693 if (!column_gap)
1694 column_gap = row_gap;
1695 css_parsing_utils::AddProperty(
1696 CSSPropertyID::kRowGap, CSSPropertyID::kGap, *row_gap, important,
1697 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1698 css_parsing_utils::AddProperty(
1699 CSSPropertyID::kColumnGap, CSSPropertyID::kGap, *column_gap, important,
1700 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1701 return true;
1702 }
1703
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const1704 const CSSValue* GridGap::CSSValueFromComputedStyleInternal(
1705 const ComputedStyle& style,
1706 const SVGComputedStyle&,
1707 const LayoutObject* layout_object,
1708 bool allow_visited_style) const {
1709 return ComputedStyleUtils::ValuesForShorthandProperty(
1710 gridGapShorthand(), style, layout_object, allow_visited_style);
1711 }
1712
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const1713 bool GridRow::ParseShorthand(
1714 bool important,
1715 CSSParserTokenRange& range,
1716 const CSSParserContext& context,
1717 const CSSParserLocalContext&,
1718 HeapVector<CSSPropertyValue, 256>& properties) const {
1719 const StylePropertyShorthand& shorthand =
1720 shorthandForProperty(CSSPropertyID::kGridRow);
1721 DCHECK_EQ(shorthand.length(), 2u);
1722
1723 CSSValue* start_value = nullptr;
1724 CSSValue* end_value = nullptr;
1725 if (!css_parsing_utils::ConsumeGridItemPositionShorthand(
1726 important, range, context, start_value, end_value)) {
1727 return false;
1728 }
1729
1730 css_parsing_utils::AddProperty(
1731 shorthand.properties()[0]->PropertyID(), CSSPropertyID::kGridRow,
1732 *start_value, important,
1733 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1734 css_parsing_utils::AddProperty(
1735 shorthand.properties()[1]->PropertyID(), CSSPropertyID::kGridRow,
1736 *end_value, important,
1737 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1738
1739 return true;
1740 }
1741
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const1742 const CSSValue* GridRow::CSSValueFromComputedStyleInternal(
1743 const ComputedStyle& style,
1744 const SVGComputedStyle&,
1745 const LayoutObject* layout_object,
1746 bool allow_visited_style) const {
1747 return ComputedStyleUtils::ValuesForGridShorthand(
1748 gridRowShorthand(), style, layout_object, allow_visited_style);
1749 }
1750
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const1751 bool GridRowGap::ParseShorthand(
1752 bool important,
1753 CSSParserTokenRange& range,
1754 const CSSParserContext& context,
1755 const CSSParserLocalContext&,
1756 HeapVector<CSSPropertyValue, 256>& properties) const {
1757 CSSValue* gap_length = css_parsing_utils::ConsumeGapLength(range, context);
1758 if (!gap_length || !range.AtEnd())
1759 return false;
1760
1761 css_parsing_utils::AddProperty(
1762 CSSPropertyID::kRowGap, CSSPropertyID::kGridRowGap, *gap_length,
1763 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
1764 properties);
1765 return true;
1766 }
1767
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const1768 const CSSValue* GridRowGap::CSSValueFromComputedStyleInternal(
1769 const ComputedStyle& style,
1770 const SVGComputedStyle&,
1771 const LayoutObject* layout_object,
1772 bool allow_visited_style) const {
1773 return ComputedStyleUtils::ValuesForShorthandProperty(
1774 gridRowGapShorthand(), style, layout_object, allow_visited_style);
1775 }
1776
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const1777 bool GridTemplate::ParseShorthand(
1778 bool important,
1779 CSSParserTokenRange& range,
1780 const CSSParserContext& context,
1781 const CSSParserLocalContext&,
1782 HeapVector<CSSPropertyValue, 256>& properties) const {
1783 CSSValue* template_rows = nullptr;
1784 CSSValue* template_columns = nullptr;
1785 CSSValue* template_areas = nullptr;
1786 if (!css_parsing_utils::ConsumeGridTemplateShorthand(
1787 important, range, context, template_rows, template_columns,
1788 template_areas))
1789 return false;
1790
1791 DCHECK(template_rows);
1792 DCHECK(template_columns);
1793 DCHECK(template_areas);
1794
1795 css_parsing_utils::AddProperty(
1796 CSSPropertyID::kGridTemplateRows, CSSPropertyID::kGridTemplate,
1797 *template_rows, important,
1798 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1799 css_parsing_utils::AddProperty(
1800 CSSPropertyID::kGridTemplateColumns, CSSPropertyID::kGridTemplate,
1801 *template_columns, important,
1802 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1803 css_parsing_utils::AddProperty(
1804 CSSPropertyID::kGridTemplateAreas, CSSPropertyID::kGridTemplate,
1805 *template_areas, important,
1806 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
1807
1808 return true;
1809 }
1810
IsLayoutDependent(const ComputedStyle * style,LayoutObject * layout_object) const1811 bool GridTemplate::IsLayoutDependent(const ComputedStyle* style,
1812 LayoutObject* layout_object) const {
1813 return layout_object && layout_object->IsLayoutGrid();
1814 }
1815
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const1816 const CSSValue* GridTemplate::CSSValueFromComputedStyleInternal(
1817 const ComputedStyle& style,
1818 const SVGComputedStyle&,
1819 const LayoutObject* layout_object,
1820 bool allow_visited_style) const {
1821 return ComputedStyleUtils::ValuesForGridShorthand(
1822 gridTemplateShorthand(), style, layout_object, allow_visited_style);
1823 }
1824
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const1825 bool InsetBlock::ParseShorthand(
1826 bool important,
1827 CSSParserTokenRange& range,
1828 const CSSParserContext& context,
1829 const CSSParserLocalContext&,
1830 HeapVector<CSSPropertyValue, 256>& properties) const {
1831 return css_parsing_utils::ConsumeShorthandVia2Longhands(
1832 insetBlockShorthand(), important, context, range, properties);
1833 }
1834
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const1835 const CSSValue* InsetBlock::CSSValueFromComputedStyleInternal(
1836 const ComputedStyle& style,
1837 const SVGComputedStyle&,
1838 const LayoutObject* layout_object,
1839 bool allow_visited_style) const {
1840 return ComputedStyleUtils::ValuesForInlineBlockShorthand(
1841 insetBlockShorthand(), style, layout_object, allow_visited_style);
1842 }
1843
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const1844 bool Inset::ParseShorthand(
1845 bool important,
1846 CSSParserTokenRange& range,
1847 const CSSParserContext& context,
1848 const CSSParserLocalContext&,
1849 HeapVector<CSSPropertyValue, 256>& properties) const {
1850 return css_parsing_utils::ConsumeShorthandVia4Longhands(
1851 insetShorthand(), important, context, range, properties);
1852 }
1853
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const1854 const CSSValue* Inset::CSSValueFromComputedStyleInternal(
1855 const ComputedStyle& style,
1856 const SVGComputedStyle&,
1857 const LayoutObject* layout_object,
1858 bool allow_visited_style) const {
1859 return ComputedStyleUtils::ValuesForSidesShorthand(
1860 insetShorthand(), style, layout_object, allow_visited_style);
1861 }
1862
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const1863 bool InsetInline::ParseShorthand(
1864 bool important,
1865 CSSParserTokenRange& range,
1866 const CSSParserContext& context,
1867 const CSSParserLocalContext&,
1868 HeapVector<CSSPropertyValue, 256>& properties) const {
1869 return css_parsing_utils::ConsumeShorthandVia2Longhands(
1870 insetInlineShorthand(), important, context, range, properties);
1871 }
1872
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const1873 const CSSValue* InsetInline::CSSValueFromComputedStyleInternal(
1874 const ComputedStyle& style,
1875 const SVGComputedStyle&,
1876 const LayoutObject* layout_object,
1877 bool allow_visited_style) const {
1878 return ComputedStyleUtils::ValuesForInlineBlockShorthand(
1879 insetInlineShorthand(), style, layout_object, allow_visited_style);
1880 }
1881
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const1882 bool ListStyle::ParseShorthand(
1883 bool important,
1884 CSSParserTokenRange& range,
1885 const CSSParserContext& context,
1886 const CSSParserLocalContext&,
1887 HeapVector<CSSPropertyValue, 256>& properties) const {
1888 const CSSValue* none = nullptr;
1889 const CSSValue* list_style_position = nullptr;
1890 const CSSValue* list_style_image = nullptr;
1891 const CSSValue* list_style_type = nullptr;
1892 do {
1893 if (!none) {
1894 none = css_parsing_utils::ConsumeIdent<CSSValueID::kNone>(range);
1895 if (none)
1896 continue;
1897 }
1898 if (!list_style_position) {
1899 list_style_position = css_parsing_utils::ParseLonghand(
1900 CSSPropertyID::kListStylePosition, CSSPropertyID::kListStyle, context,
1901 range);
1902 if (list_style_position)
1903 continue;
1904 }
1905 if (!list_style_image) {
1906 list_style_image = css_parsing_utils::ParseLonghand(
1907 CSSPropertyID::kListStyleImage, CSSPropertyID::kListStyle, context,
1908 range);
1909 if (list_style_image)
1910 continue;
1911 }
1912 if (!list_style_type) {
1913 list_style_type = css_parsing_utils::ParseLonghand(
1914 CSSPropertyID::kListStyleType, CSSPropertyID::kListStyle, context,
1915 range);
1916 if (list_style_type)
1917 continue;
1918 }
1919 return false;
1920 } while (!range.AtEnd());
1921 if (none) {
1922 if (!list_style_type)
1923 list_style_type = none;
1924 else if (!list_style_image)
1925 list_style_image = none;
1926 else
1927 return false;
1928 }
1929
1930 if (list_style_position) {
1931 AddProperty(CSSPropertyID::kListStylePosition, CSSPropertyID::kListStyle,
1932 *list_style_position, important,
1933 css_parsing_utils::IsImplicitProperty::kNotImplicit,
1934 properties);
1935 } else {
1936 AddProperty(CSSPropertyID::kListStylePosition, CSSPropertyID::kListStyle,
1937 *CSSInitialValue::Create(), important,
1938 css_parsing_utils::IsImplicitProperty::kNotImplicit,
1939 properties);
1940 }
1941
1942 if (list_style_image) {
1943 AddProperty(CSSPropertyID::kListStyleImage, CSSPropertyID::kListStyle,
1944 *list_style_image, important,
1945 css_parsing_utils::IsImplicitProperty::kNotImplicit,
1946 properties);
1947 } else {
1948 AddProperty(CSSPropertyID::kListStyleImage, CSSPropertyID::kListStyle,
1949 *CSSInitialValue::Create(), important,
1950 css_parsing_utils::IsImplicitProperty::kNotImplicit,
1951 properties);
1952 }
1953
1954 if (list_style_type) {
1955 AddProperty(CSSPropertyID::kListStyleType, CSSPropertyID::kListStyle,
1956 *list_style_type, important,
1957 css_parsing_utils::IsImplicitProperty::kNotImplicit,
1958 properties);
1959 } else {
1960 AddProperty(CSSPropertyID::kListStyleType, CSSPropertyID::kListStyle,
1961 *CSSInitialValue::Create(), important,
1962 css_parsing_utils::IsImplicitProperty::kNotImplicit,
1963 properties);
1964 }
1965
1966 return true;
1967 }
1968
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const1969 const CSSValue* ListStyle::CSSValueFromComputedStyleInternal(
1970 const ComputedStyle& style,
1971 const SVGComputedStyle&,
1972 const LayoutObject* layout_object,
1973 bool allow_visited_style) const {
1974 return ComputedStyleUtils::ValuesForShorthandProperty(
1975 listStyleShorthand(), style, layout_object, allow_visited_style);
1976 }
1977
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const1978 bool MarginBlock::ParseShorthand(
1979 bool important,
1980 CSSParserTokenRange& range,
1981 const CSSParserContext& context,
1982 const CSSParserLocalContext&,
1983 HeapVector<CSSPropertyValue, 256>& properties) const {
1984 return css_parsing_utils::ConsumeShorthandVia2Longhands(
1985 marginBlockShorthand(), important, context, range, properties);
1986 }
1987
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const1988 const CSSValue* MarginBlock::CSSValueFromComputedStyleInternal(
1989 const ComputedStyle& style,
1990 const SVGComputedStyle&,
1991 const LayoutObject* layout_object,
1992 bool allow_visited_style) const {
1993 return ComputedStyleUtils::ValuesForInlineBlockShorthand(
1994 marginBlockShorthand(), style, layout_object, allow_visited_style);
1995 }
1996
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const1997 bool Margin::ParseShorthand(
1998 bool important,
1999 CSSParserTokenRange& range,
2000 const CSSParserContext& context,
2001 const CSSParserLocalContext&,
2002 HeapVector<CSSPropertyValue, 256>& properties) const {
2003 return css_parsing_utils::ConsumeShorthandVia4Longhands(
2004 marginShorthand(), important, context, range, properties);
2005 }
2006
IsLayoutDependent(const ComputedStyle * style,LayoutObject * layout_object) const2007 bool Margin::IsLayoutDependent(const ComputedStyle* style,
2008 LayoutObject* layout_object) const {
2009 return layout_object && layout_object->IsBox() &&
2010 (!style || !style->MarginBottom().IsFixed() ||
2011 !style->MarginTop().IsFixed() || !style->MarginLeft().IsFixed() ||
2012 !style->MarginRight().IsFixed());
2013 }
2014
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const2015 const CSSValue* Margin::CSSValueFromComputedStyleInternal(
2016 const ComputedStyle& style,
2017 const SVGComputedStyle&,
2018 const LayoutObject* layout_object,
2019 bool allow_visited_style) const {
2020 return ComputedStyleUtils::ValuesForSidesShorthand(
2021 marginShorthand(), style, layout_object, allow_visited_style);
2022 }
2023
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2024 bool MarginInline::ParseShorthand(
2025 bool important,
2026 CSSParserTokenRange& range,
2027 const CSSParserContext& context,
2028 const CSSParserLocalContext&,
2029 HeapVector<CSSPropertyValue, 256>& properties) const {
2030 return css_parsing_utils::ConsumeShorthandVia2Longhands(
2031 marginInlineShorthand(), important, context, range, properties);
2032 }
2033
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const2034 const CSSValue* MarginInline::CSSValueFromComputedStyleInternal(
2035 const ComputedStyle& style,
2036 const SVGComputedStyle&,
2037 const LayoutObject* layout_object,
2038 bool allow_visited_style) const {
2039 return ComputedStyleUtils::ValuesForInlineBlockShorthand(
2040 marginInlineShorthand(), style, layout_object, allow_visited_style);
2041 }
2042
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2043 bool Marker::ParseShorthand(
2044 bool important,
2045 CSSParserTokenRange& range,
2046 const CSSParserContext& context,
2047 const CSSParserLocalContext&,
2048 HeapVector<CSSPropertyValue, 256>& properties) const {
2049 const CSSValue* marker = css_parsing_utils::ParseLonghand(
2050 CSSPropertyID::kMarkerStart, CSSPropertyID::kMarker, context, range);
2051 if (!marker || !range.AtEnd())
2052 return false;
2053
2054 css_parsing_utils::AddProperty(
2055 CSSPropertyID::kMarkerStart, CSSPropertyID::kMarker, *marker, important,
2056 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2057 css_parsing_utils::AddProperty(
2058 CSSPropertyID::kMarkerMid, CSSPropertyID::kMarker, *marker, important,
2059 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2060 css_parsing_utils::AddProperty(
2061 CSSPropertyID::kMarkerEnd, CSSPropertyID::kMarker, *marker, important,
2062 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2063 return true;
2064 }
2065
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle & svg_style,const LayoutObject * layout_object,bool allow_visited_style) const2066 const CSSValue* Marker::CSSValueFromComputedStyleInternal(
2067 const ComputedStyle& style,
2068 const SVGComputedStyle& svg_style,
2069 const LayoutObject* layout_object,
2070 bool allow_visited_style) const {
2071 const CSSValue* marker_start =
2072 ComputedStyleUtils::ValueForSVGResource(svg_style.MarkerStartResource());
2073 if (*marker_start == *ComputedStyleUtils::ValueForSVGResource(
2074 svg_style.MarkerMidResource()) &&
2075 *marker_start == *ComputedStyleUtils::ValueForSVGResource(
2076 svg_style.MarkerEndResource())) {
2077 return marker_start;
2078 }
2079 return nullptr;
2080 }
2081
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2082 bool Offset::ParseShorthand(
2083 bool important,
2084 CSSParserTokenRange& range,
2085 const CSSParserContext& context,
2086 const CSSParserLocalContext&,
2087 HeapVector<CSSPropertyValue, 256>& properties) const {
2088 // TODO(meade): The propertyID parameter isn't used - it can be removed
2089 // once all of the ParseSingleValue implementations have been moved to the
2090 // CSSPropertys, and the base CSSProperty::ParseSingleValue contains
2091 // no functionality.
2092 const CSSValue* offset_position =
2093 To<Longhand>(GetCSSPropertyOffsetPosition())
2094 .ParseSingleValue(range, context, CSSParserLocalContext());
2095 const CSSValue* offset_path =
2096 css_parsing_utils::ConsumeOffsetPath(range, context);
2097 const CSSValue* offset_distance = nullptr;
2098 const CSSValue* offset_rotate = nullptr;
2099 if (offset_path) {
2100 offset_distance = css_parsing_utils::ConsumeLengthOrPercent(range, context,
2101 kValueRangeAll);
2102 offset_rotate = css_parsing_utils::ConsumeOffsetRotate(range, context);
2103 if (offset_rotate && !offset_distance) {
2104 offset_distance = css_parsing_utils::ConsumeLengthOrPercent(
2105 range, context, kValueRangeAll);
2106 }
2107 }
2108 const CSSValue* offset_anchor = nullptr;
2109 if (css_parsing_utils::ConsumeSlashIncludingWhitespace(range)) {
2110 offset_anchor =
2111 To<Longhand>(GetCSSPropertyOffsetAnchor())
2112 .ParseSingleValue(range, context, CSSParserLocalContext());
2113 if (!offset_anchor)
2114 return false;
2115 }
2116 if ((!offset_position && !offset_path) || !range.AtEnd())
2117 return false;
2118
2119 if ((offset_position || offset_anchor) &&
2120 !RuntimeEnabledFeatures::CSSOffsetPositionAnchorEnabled())
2121 return false;
2122
2123 if (offset_position) {
2124 css_parsing_utils::AddProperty(
2125 CSSPropertyID::kOffsetPosition, CSSPropertyID::kOffset,
2126 *offset_position, important,
2127 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2128 } else if (RuntimeEnabledFeatures::CSSOffsetPositionAnchorEnabled()) {
2129 css_parsing_utils::AddProperty(
2130 CSSPropertyID::kOffsetPosition, CSSPropertyID::kOffset,
2131 *CSSInitialValue::Create(), important,
2132 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2133 }
2134
2135 if (offset_path) {
2136 css_parsing_utils::AddProperty(
2137 CSSPropertyID::kOffsetPath, CSSPropertyID::kOffset, *offset_path,
2138 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
2139 properties);
2140 } else {
2141 css_parsing_utils::AddProperty(
2142 CSSPropertyID::kOffsetPath, CSSPropertyID::kOffset,
2143 *CSSInitialValue::Create(), important,
2144 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2145 }
2146
2147 if (offset_distance) {
2148 css_parsing_utils::AddProperty(
2149 CSSPropertyID::kOffsetDistance, CSSPropertyID::kOffset,
2150 *offset_distance, important,
2151 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2152 } else {
2153 css_parsing_utils::AddProperty(
2154 CSSPropertyID::kOffsetDistance, CSSPropertyID::kOffset,
2155 *CSSInitialValue::Create(), important,
2156 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2157 }
2158
2159 if (offset_rotate) {
2160 css_parsing_utils::AddProperty(
2161 CSSPropertyID::kOffsetRotate, CSSPropertyID::kOffset, *offset_rotate,
2162 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
2163 properties);
2164 } else {
2165 css_parsing_utils::AddProperty(
2166 CSSPropertyID::kOffsetRotate, CSSPropertyID::kOffset,
2167 *CSSInitialValue::Create(), important,
2168 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2169 }
2170
2171 if (offset_anchor) {
2172 css_parsing_utils::AddProperty(
2173 CSSPropertyID::kOffsetAnchor, CSSPropertyID::kOffset, *offset_anchor,
2174 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
2175 properties);
2176 } else if (RuntimeEnabledFeatures::CSSOffsetPositionAnchorEnabled()) {
2177 css_parsing_utils::AddProperty(
2178 CSSPropertyID::kOffsetAnchor, CSSPropertyID::kOffset,
2179 *CSSInitialValue::Create(), important,
2180 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2181 }
2182
2183 return true;
2184 }
2185
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const2186 const CSSValue* Offset::CSSValueFromComputedStyleInternal(
2187 const ComputedStyle& style,
2188 const SVGComputedStyle&,
2189 const LayoutObject* layout_object,
2190 bool allow_visited_style) const {
2191 return ComputedStyleUtils::ValueForOffset(style, layout_object,
2192 allow_visited_style);
2193 }
2194
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2195 bool Outline::ParseShorthand(
2196 bool important,
2197 CSSParserTokenRange& range,
2198 const CSSParserContext& context,
2199 const CSSParserLocalContext&,
2200 HeapVector<CSSPropertyValue, 256>& properties) const {
2201 return css_parsing_utils::ConsumeShorthandGreedilyViaLonghands(
2202 outlineShorthand(), important, context, range, properties);
2203 }
2204
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const2205 const CSSValue* Outline::CSSValueFromComputedStyleInternal(
2206 const ComputedStyle& style,
2207 const SVGComputedStyle&,
2208 const LayoutObject* layout_object,
2209 bool allow_visited_style) const {
2210 return ComputedStyleUtils::ValuesForShorthandProperty(
2211 outlineShorthand(), style, layout_object, allow_visited_style);
2212 }
2213
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2214 bool Overflow::ParseShorthand(
2215 bool important,
2216 CSSParserTokenRange& range,
2217 const CSSParserContext& context,
2218 const CSSParserLocalContext&,
2219 HeapVector<CSSPropertyValue, 256>& properties) const {
2220 return css_parsing_utils::ConsumeShorthandVia2Longhands(
2221 overflowShorthand(), important, context, range, properties);
2222 }
2223
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject *,bool allow_visited_style) const2224 const CSSValue* Overflow::CSSValueFromComputedStyleInternal(
2225 const ComputedStyle& style,
2226 const SVGComputedStyle&,
2227 const LayoutObject*,
2228 bool allow_visited_style) const {
2229 CSSValueList* list = CSSValueList::CreateSpaceSeparated();
2230 list->Append(*CSSIdentifierValue::Create(style.OverflowX()));
2231 if (style.OverflowX() != style.OverflowY())
2232 list->Append(*CSSIdentifierValue::Create(style.OverflowY()));
2233
2234 return list;
2235 }
2236
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2237 bool OverscrollBehavior::ParseShorthand(
2238 bool important,
2239 CSSParserTokenRange& range,
2240 const CSSParserContext& context,
2241 const CSSParserLocalContext&,
2242 HeapVector<CSSPropertyValue, 256>& properties) const {
2243 return css_parsing_utils::ConsumeShorthandVia2Longhands(
2244 overscrollBehaviorShorthand(), important, context, range, properties);
2245 }
2246
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject *,bool allow_visited_style) const2247 const CSSValue* OverscrollBehavior::CSSValueFromComputedStyleInternal(
2248 const ComputedStyle& style,
2249 const SVGComputedStyle&,
2250 const LayoutObject*,
2251 bool allow_visited_style) const {
2252 CSSValueList* list = CSSValueList::CreateSpaceSeparated();
2253 list->Append(*CSSIdentifierValue::Create(style.OverscrollBehaviorX()));
2254 if (style.OverscrollBehaviorX() != style.OverscrollBehaviorY())
2255 list->Append(*CSSIdentifierValue::Create(style.OverscrollBehaviorY()));
2256
2257 return list;
2258 }
2259
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2260 bool PaddingBlock::ParseShorthand(
2261 bool important,
2262 CSSParserTokenRange& range,
2263 const CSSParserContext& context,
2264 const CSSParserLocalContext&,
2265 HeapVector<CSSPropertyValue, 256>& properties) const {
2266 return css_parsing_utils::ConsumeShorthandVia2Longhands(
2267 paddingBlockShorthand(), important, context, range, properties);
2268 }
2269
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const2270 const CSSValue* PaddingBlock::CSSValueFromComputedStyleInternal(
2271 const ComputedStyle& style,
2272 const SVGComputedStyle&,
2273 const LayoutObject* layout_object,
2274 bool allow_visited_style) const {
2275 return ComputedStyleUtils::ValuesForInlineBlockShorthand(
2276 paddingBlockShorthand(), style, layout_object, allow_visited_style);
2277 }
2278
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2279 bool Padding::ParseShorthand(
2280 bool important,
2281 CSSParserTokenRange& range,
2282 const CSSParserContext& context,
2283 const CSSParserLocalContext&,
2284 HeapVector<CSSPropertyValue, 256>& properties) const {
2285 return css_parsing_utils::ConsumeShorthandVia4Longhands(
2286 paddingShorthand(), important, context, range, properties);
2287 }
2288
IsLayoutDependent(const ComputedStyle * style,LayoutObject * layout_object) const2289 bool Padding::IsLayoutDependent(const ComputedStyle* style,
2290 LayoutObject* layout_object) const {
2291 return layout_object && layout_object->IsBox() &&
2292 (!style || !style->PaddingBottom().IsFixed() ||
2293 !style->PaddingTop().IsFixed() || !style->PaddingLeft().IsFixed() ||
2294 !style->PaddingRight().IsFixed());
2295 }
2296
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const2297 const CSSValue* Padding::CSSValueFromComputedStyleInternal(
2298 const ComputedStyle& style,
2299 const SVGComputedStyle&,
2300 const LayoutObject* layout_object,
2301 bool allow_visited_style) const {
2302 return ComputedStyleUtils::ValuesForSidesShorthand(
2303 paddingShorthand(), style, layout_object, allow_visited_style);
2304 }
2305
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2306 bool PaddingInline::ParseShorthand(
2307 bool important,
2308 CSSParserTokenRange& range,
2309 const CSSParserContext& context,
2310 const CSSParserLocalContext&,
2311 HeapVector<CSSPropertyValue, 256>& properties) const {
2312 return css_parsing_utils::ConsumeShorthandVia2Longhands(
2313 paddingInlineShorthand(), important, context, range, properties);
2314 }
2315
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const2316 const CSSValue* PaddingInline::CSSValueFromComputedStyleInternal(
2317 const ComputedStyle& style,
2318 const SVGComputedStyle&,
2319 const LayoutObject* layout_object,
2320 bool allow_visited_style) const {
2321 return ComputedStyleUtils::ValuesForInlineBlockShorthand(
2322 paddingInlineShorthand(), style, layout_object, allow_visited_style);
2323 }
2324
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext &,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2325 bool PageBreakAfter::ParseShorthand(
2326 bool important,
2327 CSSParserTokenRange& range,
2328 const CSSParserContext&,
2329 const CSSParserLocalContext&,
2330 HeapVector<CSSPropertyValue, 256>& properties) const {
2331 CSSValueID value;
2332 if (!css_parsing_utils::ConsumeFromPageBreakBetween(range, value)) {
2333 return false;
2334 }
2335
2336 DCHECK(IsValidCSSValueID(value));
2337 css_parsing_utils::AddProperty(
2338 CSSPropertyID::kBreakAfter, CSSPropertyID::kPageBreakAfter,
2339 *CSSIdentifierValue::Create(value), important,
2340 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2341 return true;
2342 }
2343
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject *,bool allow_visited_style) const2344 const CSSValue* PageBreakAfter::CSSValueFromComputedStyleInternal(
2345 const ComputedStyle& style,
2346 const SVGComputedStyle&,
2347 const LayoutObject*,
2348 bool allow_visited_style) const {
2349 return ComputedStyleUtils::ValueForPageBreakBetween(style.BreakAfter());
2350 }
2351
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext &,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2352 bool PageBreakBefore::ParseShorthand(
2353 bool important,
2354 CSSParserTokenRange& range,
2355 const CSSParserContext&,
2356 const CSSParserLocalContext&,
2357 HeapVector<CSSPropertyValue, 256>& properties) const {
2358 CSSValueID value;
2359 if (!css_parsing_utils::ConsumeFromPageBreakBetween(range, value)) {
2360 return false;
2361 }
2362
2363 DCHECK(IsValidCSSValueID(value));
2364 css_parsing_utils::AddProperty(
2365 CSSPropertyID::kBreakBefore, CSSPropertyID::kPageBreakBefore,
2366 *CSSIdentifierValue::Create(value), important,
2367 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2368 return true;
2369 }
2370
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject *,bool allow_visited_style) const2371 const CSSValue* PageBreakBefore::CSSValueFromComputedStyleInternal(
2372 const ComputedStyle& style,
2373 const SVGComputedStyle&,
2374 const LayoutObject*,
2375 bool allow_visited_style) const {
2376 return ComputedStyleUtils::ValueForPageBreakBetween(style.BreakBefore());
2377 }
2378
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext &,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2379 bool PageBreakInside::ParseShorthand(
2380 bool important,
2381 CSSParserTokenRange& range,
2382 const CSSParserContext&,
2383 const CSSParserLocalContext&,
2384 HeapVector<CSSPropertyValue, 256>& properties) const {
2385 CSSValueID value;
2386 if (!css_parsing_utils::ConsumeFromColumnOrPageBreakInside(range, value)) {
2387 return false;
2388 }
2389
2390 css_parsing_utils::AddProperty(
2391 CSSPropertyID::kBreakInside, CSSPropertyID::kPageBreakInside,
2392 *CSSIdentifierValue::Create(value), important,
2393 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2394 return true;
2395 }
2396
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject *,bool allow_visited_style) const2397 const CSSValue* PageBreakInside::CSSValueFromComputedStyleInternal(
2398 const ComputedStyle& style,
2399 const SVGComputedStyle&,
2400 const LayoutObject*,
2401 bool allow_visited_style) const {
2402 return ComputedStyleUtils::ValueForPageBreakInside(style.BreakInside());
2403 }
2404
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext & local_context,HeapVector<CSSPropertyValue,256> & properties) const2405 bool PlaceContent::ParseShorthand(
2406 bool important,
2407 CSSParserTokenRange& range,
2408 const CSSParserContext& context,
2409 const CSSParserLocalContext& local_context,
2410 HeapVector<CSSPropertyValue, 256>& properties) const {
2411 DCHECK_EQ(shorthandForProperty(CSSPropertyID::kPlaceContent).length(), 2u);
2412
2413 CSSParserTokenRange range_copy = range;
2414 bool is_baseline = css_parsing_utils::IsBaselineKeyword(range.Peek().Id());
2415 const CSSValue* align_content_value =
2416 To<Longhand>(GetCSSPropertyAlignContent())
2417 .ParseSingleValue(range, context, local_context);
2418 if (!align_content_value)
2419 return false;
2420
2421 const CSSValue* justify_content_value = nullptr;
2422 if (range.AtEnd()) {
2423 if (is_baseline) {
2424 justify_content_value =
2425 MakeGarbageCollected<cssvalue::CSSContentDistributionValue>(
2426 CSSValueID::kInvalid, CSSValueID::kStart, CSSValueID::kInvalid);
2427 } else {
2428 range = range_copy;
2429 }
2430 }
2431 if (!justify_content_value) {
2432 justify_content_value =
2433 To<Longhand>(GetCSSPropertyJustifyContent())
2434 .ParseSingleValue(range, context, local_context);
2435 }
2436
2437 if (!justify_content_value || !range.AtEnd())
2438 return false;
2439
2440 DCHECK(align_content_value);
2441 DCHECK(justify_content_value);
2442
2443 css_parsing_utils::AddProperty(
2444 CSSPropertyID::kAlignContent, CSSPropertyID::kPlaceContent,
2445 *align_content_value, important,
2446 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2447 css_parsing_utils::AddProperty(
2448 CSSPropertyID::kJustifyContent, CSSPropertyID::kPlaceContent,
2449 *justify_content_value, important,
2450 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2451
2452 return true;
2453 }
2454
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const2455 const CSSValue* PlaceContent::CSSValueFromComputedStyleInternal(
2456 const ComputedStyle& style,
2457 const SVGComputedStyle&,
2458 const LayoutObject* layout_object,
2459 bool allow_visited_style) const {
2460 return ComputedStyleUtils::ValuesForPlaceShorthand(
2461 placeContentShorthand(), style, layout_object, allow_visited_style);
2462 }
2463
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext & local_context,HeapVector<CSSPropertyValue,256> & properties) const2464 bool PlaceItems::ParseShorthand(
2465 bool important,
2466 CSSParserTokenRange& range,
2467 const CSSParserContext& context,
2468 const CSSParserLocalContext& local_context,
2469 HeapVector<CSSPropertyValue, 256>& properties) const {
2470 DCHECK_EQ(shorthandForProperty(CSSPropertyID::kPlaceItems).length(), 2u);
2471
2472 CSSParserTokenRange range_copy = range;
2473 const CSSValue* align_items_value =
2474 To<Longhand>(GetCSSPropertyAlignItems())
2475 .ParseSingleValue(range, context, local_context);
2476 if (!align_items_value)
2477 return false;
2478
2479 if (range.AtEnd())
2480 range = range_copy;
2481
2482 const CSSValue* justify_items_value =
2483 To<Longhand>(GetCSSPropertyJustifyItems())
2484 .ParseSingleValue(range, context, local_context);
2485 if (!justify_items_value || !range.AtEnd())
2486 return false;
2487
2488 DCHECK(align_items_value);
2489 DCHECK(justify_items_value);
2490
2491 css_parsing_utils::AddProperty(
2492 CSSPropertyID::kAlignItems, CSSPropertyID::kPlaceItems,
2493 *align_items_value, important,
2494 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2495 css_parsing_utils::AddProperty(
2496 CSSPropertyID::kJustifyItems, CSSPropertyID::kPlaceItems,
2497 *justify_items_value, important,
2498 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2499
2500 return true;
2501 }
2502
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const2503 const CSSValue* PlaceItems::CSSValueFromComputedStyleInternal(
2504 const ComputedStyle& style,
2505 const SVGComputedStyle&,
2506 const LayoutObject* layout_object,
2507 bool allow_visited_style) const {
2508 return ComputedStyleUtils::ValuesForPlaceShorthand(
2509 placeItemsShorthand(), style, layout_object, allow_visited_style);
2510 }
2511
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext & local_context,HeapVector<CSSPropertyValue,256> & properties) const2512 bool PlaceSelf::ParseShorthand(
2513 bool important,
2514 CSSParserTokenRange& range,
2515 const CSSParserContext& context,
2516 const CSSParserLocalContext& local_context,
2517 HeapVector<CSSPropertyValue, 256>& properties) const {
2518 DCHECK_EQ(shorthandForProperty(CSSPropertyID::kPlaceSelf).length(), 2u);
2519
2520 CSSParserTokenRange range_copy = range;
2521 const CSSValue* align_self_value =
2522 To<Longhand>(GetCSSPropertyAlignSelf())
2523 .ParseSingleValue(range, context, local_context);
2524 if (!align_self_value)
2525 return false;
2526
2527 if (range.AtEnd())
2528 range = range_copy;
2529
2530 const CSSValue* justify_self_value =
2531 To<Longhand>(GetCSSPropertyJustifySelf())
2532 .ParseSingleValue(range, context, local_context);
2533 if (!justify_self_value || !range.AtEnd())
2534 return false;
2535
2536 DCHECK(align_self_value);
2537 DCHECK(justify_self_value);
2538
2539 css_parsing_utils::AddProperty(
2540 CSSPropertyID::kAlignSelf, CSSPropertyID::kPlaceSelf, *align_self_value,
2541 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
2542 properties);
2543 css_parsing_utils::AddProperty(
2544 CSSPropertyID::kJustifySelf, CSSPropertyID::kPlaceSelf,
2545 *justify_self_value, important,
2546 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2547
2548 return true;
2549 }
2550
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const2551 const CSSValue* PlaceSelf::CSSValueFromComputedStyleInternal(
2552 const ComputedStyle& style,
2553 const SVGComputedStyle&,
2554 const LayoutObject* layout_object,
2555 bool allow_visited_style) const {
2556 return ComputedStyleUtils::ValuesForPlaceShorthand(
2557 placeSelfShorthand(), style, layout_object, allow_visited_style);
2558 }
2559
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2560 bool ScrollMarginBlock::ParseShorthand(
2561 bool important,
2562 CSSParserTokenRange& range,
2563 const CSSParserContext& context,
2564 const CSSParserLocalContext&,
2565 HeapVector<CSSPropertyValue, 256>& properties) const {
2566 return css_parsing_utils::ConsumeShorthandVia2Longhands(
2567 scrollMarginBlockShorthand(), important, context, range, properties);
2568 }
2569
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const2570 const CSSValue* ScrollMarginBlock::CSSValueFromComputedStyleInternal(
2571 const ComputedStyle& style,
2572 const SVGComputedStyle&,
2573 const LayoutObject* layout_object,
2574 bool allow_visited_style) const {
2575 return ComputedStyleUtils::ValuesForInlineBlockShorthand(
2576 scrollMarginBlockShorthand(), style, layout_object, allow_visited_style);
2577 }
2578
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2579 bool ScrollMargin::ParseShorthand(
2580 bool important,
2581 CSSParserTokenRange& range,
2582 const CSSParserContext& context,
2583 const CSSParserLocalContext&,
2584 HeapVector<CSSPropertyValue, 256>& properties) const {
2585 return css_parsing_utils::ConsumeShorthandVia4Longhands(
2586 scrollMarginShorthand(), important, context, range, properties);
2587 }
2588
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const2589 const CSSValue* ScrollMargin::CSSValueFromComputedStyleInternal(
2590 const ComputedStyle& style,
2591 const SVGComputedStyle&,
2592 const LayoutObject* layout_object,
2593 bool allow_visited_style) const {
2594 return ComputedStyleUtils::ValuesForSidesShorthand(
2595 scrollMarginShorthand(), style, layout_object, allow_visited_style);
2596 }
2597
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2598 bool ScrollMarginInline::ParseShorthand(
2599 bool important,
2600 CSSParserTokenRange& range,
2601 const CSSParserContext& context,
2602 const CSSParserLocalContext&,
2603 HeapVector<CSSPropertyValue, 256>& properties) const {
2604 return css_parsing_utils::ConsumeShorthandVia2Longhands(
2605 scrollMarginInlineShorthand(), important, context, range, properties);
2606 }
2607
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const2608 const CSSValue* ScrollMarginInline::CSSValueFromComputedStyleInternal(
2609 const ComputedStyle& style,
2610 const SVGComputedStyle&,
2611 const LayoutObject* layout_object,
2612 bool allow_visited_style) const {
2613 return ComputedStyleUtils::ValuesForInlineBlockShorthand(
2614 scrollMarginInlineShorthand(), style, layout_object, allow_visited_style);
2615 }
2616
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2617 bool ScrollPaddingBlock::ParseShorthand(
2618 bool important,
2619 CSSParserTokenRange& range,
2620 const CSSParserContext& context,
2621 const CSSParserLocalContext&,
2622 HeapVector<CSSPropertyValue, 256>& properties) const {
2623 return css_parsing_utils::ConsumeShorthandVia2Longhands(
2624 scrollPaddingBlockShorthand(), important, context, range, properties);
2625 }
2626
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const2627 const CSSValue* ScrollPaddingBlock::CSSValueFromComputedStyleInternal(
2628 const ComputedStyle& style,
2629 const SVGComputedStyle&,
2630 const LayoutObject* layout_object,
2631 bool allow_visited_style) const {
2632 return ComputedStyleUtils::ValuesForInlineBlockShorthand(
2633 scrollPaddingBlockShorthand(), style, layout_object, allow_visited_style);
2634 }
2635
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2636 bool ScrollPadding::ParseShorthand(
2637 bool important,
2638 CSSParserTokenRange& range,
2639 const CSSParserContext& context,
2640 const CSSParserLocalContext&,
2641 HeapVector<CSSPropertyValue, 256>& properties) const {
2642 return css_parsing_utils::ConsumeShorthandVia4Longhands(
2643 scrollPaddingShorthand(), important, context, range, properties);
2644 }
2645
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const2646 const CSSValue* ScrollPadding::CSSValueFromComputedStyleInternal(
2647 const ComputedStyle& style,
2648 const SVGComputedStyle&,
2649 const LayoutObject* layout_object,
2650 bool allow_visited_style) const {
2651 return ComputedStyleUtils::ValuesForSidesShorthand(
2652 scrollPaddingShorthand(), style, layout_object, allow_visited_style);
2653 }
2654
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2655 bool ScrollPaddingInline::ParseShorthand(
2656 bool important,
2657 CSSParserTokenRange& range,
2658 const CSSParserContext& context,
2659 const CSSParserLocalContext&,
2660 HeapVector<CSSPropertyValue, 256>& properties) const {
2661 return css_parsing_utils::ConsumeShorthandVia2Longhands(
2662 scrollPaddingInlineShorthand(), important, context, range, properties);
2663 }
2664
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const2665 const CSSValue* ScrollPaddingInline::CSSValueFromComputedStyleInternal(
2666 const ComputedStyle& style,
2667 const SVGComputedStyle&,
2668 const LayoutObject* layout_object,
2669 bool allow_visited_style) const {
2670 return ComputedStyleUtils::ValuesForInlineBlockShorthand(
2671 scrollPaddingInlineShorthand(), style, layout_object,
2672 allow_visited_style);
2673 }
2674
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2675 bool TextDecoration::ParseShorthand(
2676 bool important,
2677 CSSParserTokenRange& range,
2678 const CSSParserContext& context,
2679 const CSSParserLocalContext&,
2680 HeapVector<CSSPropertyValue, 256>& properties) const {
2681 // Use RuntimeEnabledFeature-aware shorthandForProperty() method until
2682 // text-decoration-thickness ships, see style_property_shorthand.cc.tmpl.
2683 return css_parsing_utils::ConsumeShorthandGreedilyViaLonghands(
2684 shorthandForProperty(CSSPropertyID::kTextDecoration), important, context,
2685 range, properties);
2686 }
2687
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject * layout_object,bool allow_visited_style) const2688 const CSSValue* TextDecoration::CSSValueFromComputedStyleInternal(
2689 const ComputedStyle& style,
2690 const SVGComputedStyle&,
2691 const LayoutObject* layout_object,
2692 bool allow_visited_style) const {
2693 // Use RuntimeEnabledFeature-aware shorthandForProperty() method until
2694 // text-decoration-thickness ships, see style_property_shorthand.cc.tmpl.
2695 const StylePropertyShorthand& shorthand =
2696 shorthandForProperty(CSSPropertyID::kTextDecoration);
2697
2698 CSSValueList* list = CSSValueList::CreateSpaceSeparated();
2699 for (unsigned i = 0; i < shorthand.length(); ++i) {
2700 const CSSValue* value =
2701 shorthand.properties()[i]->CSSValueFromComputedStyle(
2702 style, layout_object, allow_visited_style);
2703 // Do not include initial value 'auto' for thickness.
2704 // TODO(https://crbug.com/1093826): general shorthand serialization issues
2705 // remain, in particular for text-decoration.
2706 if (shorthand.properties()[i]->PropertyID() ==
2707 CSSPropertyID::kTextDecorationThickness) {
2708 if (auto* identifier_value = DynamicTo<CSSIdentifierValue>(value)) {
2709 CSSValueID value_id = identifier_value->GetValueID();
2710 if (value_id == CSSValueID::kAuto)
2711 continue;
2712 }
2713 }
2714 DCHECK(value);
2715 list->Append(*value);
2716 }
2717 return list;
2718 }
2719
2720 namespace {
2721
ConsumeTransitionValue(CSSPropertyID property,CSSParserTokenRange & range,const CSSParserContext & context,bool use_legacy_parsing)2722 CSSValue* ConsumeTransitionValue(CSSPropertyID property,
2723 CSSParserTokenRange& range,
2724 const CSSParserContext& context,
2725 bool use_legacy_parsing) {
2726 switch (property) {
2727 case CSSPropertyID::kTransitionDelay:
2728 return css_parsing_utils::ConsumeTime(range, context, kValueRangeAll);
2729 case CSSPropertyID::kTransitionDuration:
2730 return css_parsing_utils::ConsumeTime(range, context,
2731 kValueRangeNonNegative);
2732 case CSSPropertyID::kTransitionProperty:
2733 return css_parsing_utils::ConsumeTransitionProperty(range, context);
2734 case CSSPropertyID::kTransitionTimingFunction:
2735 return css_parsing_utils::ConsumeAnimationTimingFunction(range, context);
2736 default:
2737 NOTREACHED();
2738 return nullptr;
2739 }
2740 }
2741
2742 } // namespace
2743
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext & local_context,HeapVector<CSSPropertyValue,256> & properties) const2744 bool Transition::ParseShorthand(
2745 bool important,
2746 CSSParserTokenRange& range,
2747 const CSSParserContext& context,
2748 const CSSParserLocalContext& local_context,
2749 HeapVector<CSSPropertyValue, 256>& properties) const {
2750 const StylePropertyShorthand shorthand = transitionShorthandForParsing();
2751 const unsigned longhand_count = shorthand.length();
2752
2753 HeapVector<Member<CSSValueList>, css_parsing_utils::kMaxNumAnimationLonghands>
2754 longhands(longhand_count);
2755 if (!css_parsing_utils::ConsumeAnimationShorthand(
2756 shorthand, longhands, ConsumeTransitionValue, range, context,
2757 local_context.UseAliasParsing())) {
2758 return false;
2759 }
2760
2761 for (unsigned i = 0; i < longhand_count; ++i) {
2762 if (shorthand.properties()[i]->IDEquals(
2763 CSSPropertyID::kTransitionProperty) &&
2764 !css_parsing_utils::IsValidPropertyList(*longhands[i]))
2765 return false;
2766 }
2767
2768 for (unsigned i = 0; i < longhand_count; ++i) {
2769 css_parsing_utils::AddProperty(
2770 shorthand.properties()[i]->PropertyID(), shorthand.id(), *longhands[i],
2771 important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
2772 properties);
2773 }
2774
2775 return range.AtEnd();
2776 }
2777
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject *,bool allow_visited_style) const2778 const CSSValue* Transition::CSSValueFromComputedStyleInternal(
2779 const ComputedStyle& style,
2780 const SVGComputedStyle&,
2781 const LayoutObject*,
2782 bool allow_visited_style) const {
2783 const CSSTransitionData* transition_data = style.Transitions();
2784 if (transition_data) {
2785 CSSValueList* transitions_list = CSSValueList::CreateCommaSeparated();
2786 for (wtf_size_t i = 0; i < transition_data->PropertyList().size(); ++i) {
2787 CSSValueList* list = CSSValueList::CreateSpaceSeparated();
2788 list->Append(*ComputedStyleUtils::CreateTransitionPropertyValue(
2789 transition_data->PropertyList()[i]));
2790 list->Append(*CSSNumericLiteralValue::Create(
2791 CSSTimingData::GetRepeated(transition_data->DurationList(), i),
2792 CSSPrimitiveValue::UnitType::kSeconds));
2793 list->Append(*ComputedStyleUtils::CreateTimingFunctionValue(
2794 CSSTimingData::GetRepeated(transition_data->TimingFunctionList(), i)
2795 .get()));
2796 list->Append(*CSSNumericLiteralValue::Create(
2797 CSSTimingData::GetRepeated(transition_data->DelayList(), i),
2798 CSSPrimitiveValue::UnitType::kSeconds));
2799 transitions_list->Append(*list);
2800 }
2801 return transitions_list;
2802 }
2803
2804 CSSValueList* list = CSSValueList::CreateSpaceSeparated();
2805 // transition-property default value.
2806 list->Append(*CSSIdentifierValue::Create(CSSValueID::kAll));
2807 list->Append(
2808 *CSSNumericLiteralValue::Create(CSSTransitionData::InitialDuration(),
2809 CSSPrimitiveValue::UnitType::kSeconds));
2810 list->Append(*ComputedStyleUtils::CreateTimingFunctionValue(
2811 CSSTransitionData::InitialTimingFunction().get()));
2812 list->Append(
2813 *CSSNumericLiteralValue::Create(CSSTransitionData::InitialDelay(),
2814 CSSPrimitiveValue::UnitType::kSeconds));
2815 return list;
2816 }
2817
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext &,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2818 bool WebkitColumnBreakAfter::ParseShorthand(
2819 bool important,
2820 CSSParserTokenRange& range,
2821 const CSSParserContext&,
2822 const CSSParserLocalContext&,
2823 HeapVector<CSSPropertyValue, 256>& properties) const {
2824 CSSValueID value;
2825 if (!css_parsing_utils::ConsumeFromColumnBreakBetween(range, value)) {
2826 return false;
2827 }
2828
2829 css_parsing_utils::AddProperty(
2830 CSSPropertyID::kBreakAfter, CSSPropertyID::kWebkitColumnBreakAfter,
2831 *CSSIdentifierValue::Create(value), important,
2832 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2833 return true;
2834 }
2835
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject *,bool allow_visited_style) const2836 const CSSValue* WebkitColumnBreakAfter::CSSValueFromComputedStyleInternal(
2837 const ComputedStyle& style,
2838 const SVGComputedStyle&,
2839 const LayoutObject*,
2840 bool allow_visited_style) const {
2841 return ComputedStyleUtils::ValueForWebkitColumnBreakBetween(
2842 style.BreakAfter());
2843 }
2844
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext &,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2845 bool WebkitColumnBreakBefore::ParseShorthand(
2846 bool important,
2847 CSSParserTokenRange& range,
2848 const CSSParserContext&,
2849 const CSSParserLocalContext&,
2850 HeapVector<CSSPropertyValue, 256>& properties) const {
2851 CSSValueID value;
2852 if (!css_parsing_utils::ConsumeFromColumnBreakBetween(range, value)) {
2853 return false;
2854 }
2855
2856 css_parsing_utils::AddProperty(
2857 CSSPropertyID::kBreakBefore, CSSPropertyID::kWebkitColumnBreakBefore,
2858 *CSSIdentifierValue::Create(value), important,
2859 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2860 return true;
2861 }
2862
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject *,bool allow_visited_style) const2863 const CSSValue* WebkitColumnBreakBefore::CSSValueFromComputedStyleInternal(
2864 const ComputedStyle& style,
2865 const SVGComputedStyle&,
2866 const LayoutObject*,
2867 bool allow_visited_style) const {
2868 return ComputedStyleUtils::ValueForWebkitColumnBreakBetween(
2869 style.BreakBefore());
2870 }
2871
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext &,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2872 bool WebkitColumnBreakInside::ParseShorthand(
2873 bool important,
2874 CSSParserTokenRange& range,
2875 const CSSParserContext&,
2876 const CSSParserLocalContext&,
2877 HeapVector<CSSPropertyValue, 256>& properties) const {
2878 CSSValueID value;
2879 if (!css_parsing_utils::ConsumeFromColumnOrPageBreakInside(range, value)) {
2880 return false;
2881 }
2882
2883 css_parsing_utils::AddProperty(
2884 CSSPropertyID::kBreakInside, CSSPropertyID::kWebkitColumnBreakInside,
2885 *CSSIdentifierValue::Create(value), important,
2886 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2887 return true;
2888 }
2889
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject *,bool allow_visited_style) const2890 const CSSValue* WebkitColumnBreakInside::CSSValueFromComputedStyleInternal(
2891 const ComputedStyle& style,
2892 const SVGComputedStyle&,
2893 const LayoutObject*,
2894 bool allow_visited_style) const {
2895 return ComputedStyleUtils::ValueForWebkitColumnBreakInside(
2896 style.BreakInside());
2897 }
2898
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2899 bool WebkitMaskBoxImage::ParseShorthand(
2900 bool important,
2901 CSSParserTokenRange& range,
2902 const CSSParserContext& context,
2903 const CSSParserLocalContext&,
2904 HeapVector<CSSPropertyValue, 256>& properties) const {
2905 CSSValue* source = nullptr;
2906 CSSValue* slice = nullptr;
2907 CSSValue* width = nullptr;
2908 CSSValue* outset = nullptr;
2909 CSSValue* repeat = nullptr;
2910
2911 if (!css_parsing_utils::ConsumeBorderImageComponents(
2912 range, context, source, slice, width, outset, repeat,
2913 css_parsing_utils::DefaultFill::kFill)) {
2914 return false;
2915 }
2916
2917 css_parsing_utils::AddProperty(
2918 CSSPropertyID::kWebkitMaskBoxImageSource,
2919 CSSPropertyID::kWebkitMaskBoxImage,
2920 source ? *source : *CSSInitialValue::Create(), important,
2921 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2922 css_parsing_utils::AddProperty(
2923 CSSPropertyID::kWebkitMaskBoxImageSlice,
2924 CSSPropertyID::kWebkitMaskBoxImage,
2925 slice ? *slice : *CSSInitialValue::Create(), important,
2926 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2927 css_parsing_utils::AddProperty(
2928 CSSPropertyID::kWebkitMaskBoxImageWidth,
2929 CSSPropertyID::kWebkitMaskBoxImage,
2930 width ? *width : *CSSInitialValue::Create(), important,
2931 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2932 css_parsing_utils::AddProperty(
2933 CSSPropertyID::kWebkitMaskBoxImageOutset,
2934 CSSPropertyID::kWebkitMaskBoxImage,
2935 outset ? *outset : *CSSInitialValue::Create(), important,
2936 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2937 css_parsing_utils::AddProperty(
2938 CSSPropertyID::kWebkitMaskBoxImageRepeat,
2939 CSSPropertyID::kWebkitMaskBoxImage,
2940 repeat ? *repeat : *CSSInitialValue::Create(), important,
2941 css_parsing_utils::IsImplicitProperty::kNotImplicit, properties);
2942
2943 return true;
2944 }
2945
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject *,bool allow_visited_style) const2946 const CSSValue* WebkitMaskBoxImage::CSSValueFromComputedStyleInternal(
2947 const ComputedStyle& style,
2948 const SVGComputedStyle&,
2949 const LayoutObject*,
2950 bool allow_visited_style) const {
2951 return ComputedStyleUtils::ValueForNinePieceImage(style.MaskBoxImage(), style,
2952 allow_visited_style);
2953 }
2954
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext & local_context,HeapVector<CSSPropertyValue,256> & properties) const2955 bool WebkitMask::ParseShorthand(
2956 bool important,
2957 CSSParserTokenRange& range,
2958 const CSSParserContext& context,
2959 const CSSParserLocalContext& local_context,
2960 HeapVector<CSSPropertyValue, 256>& properties) const {
2961 return css_parsing_utils::ParseBackgroundOrMask(important, range, context,
2962 local_context, properties);
2963 }
2964
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const2965 bool WebkitMaskPosition::ParseShorthand(
2966 bool important,
2967 CSSParserTokenRange& range,
2968 const CSSParserContext& context,
2969 const CSSParserLocalContext&,
2970 HeapVector<CSSPropertyValue, 256>& properties) const {
2971 CSSValue* result_x = nullptr;
2972 CSSValue* result_y = nullptr;
2973
2974 if (!css_parsing_utils::ConsumeBackgroundPosition(
2975 range, context, css_parsing_utils::UnitlessQuirk::kAllow, result_x,
2976 result_y) ||
2977 !range.AtEnd())
2978 return false;
2979
2980 css_parsing_utils::AddProperty(
2981 CSSPropertyID::kWebkitMaskPositionX, CSSPropertyID::kWebkitMaskPosition,
2982 *result_x, important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
2983 properties);
2984
2985 css_parsing_utils::AddProperty(
2986 CSSPropertyID::kWebkitMaskPositionY, CSSPropertyID::kWebkitMaskPosition,
2987 *result_y, important, css_parsing_utils::IsImplicitProperty::kNotImplicit,
2988 properties);
2989 return true;
2990 }
2991
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject *,bool allow_visited_style) const2992 const CSSValue* WebkitMaskPosition::CSSValueFromComputedStyleInternal(
2993 const ComputedStyle& style,
2994 const SVGComputedStyle&,
2995 const LayoutObject*,
2996 bool allow_visited_style) const {
2997 return ComputedStyleUtils::BackgroundPositionOrWebkitMaskPosition(
2998 *this, style, &style.MaskLayers());
2999 }
3000
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext & local_context,HeapVector<CSSPropertyValue,256> & properties) const3001 bool WebkitMaskRepeat::ParseShorthand(
3002 bool important,
3003 CSSParserTokenRange& range,
3004 const CSSParserContext& context,
3005 const CSSParserLocalContext& local_context,
3006 HeapVector<CSSPropertyValue, 256>& properties) const {
3007 CSSValue* result_x = nullptr;
3008 CSSValue* result_y = nullptr;
3009 bool implicit = false;
3010 if (!css_parsing_utils::ConsumeRepeatStyle(range, result_x, result_y,
3011 implicit) ||
3012 !range.AtEnd())
3013 return false;
3014
3015 css_parsing_utils::AddProperty(
3016 CSSPropertyID::kWebkitMaskRepeatX, CSSPropertyID::kWebkitMaskRepeat,
3017 *result_x, important,
3018 implicit ? css_parsing_utils::IsImplicitProperty::kImplicit
3019 : css_parsing_utils::IsImplicitProperty::kNotImplicit,
3020 properties);
3021 css_parsing_utils::AddProperty(
3022 CSSPropertyID::kWebkitMaskRepeatY, CSSPropertyID::kWebkitMaskRepeat,
3023 *result_y, important,
3024 implicit ? css_parsing_utils::IsImplicitProperty::kImplicit
3025 : css_parsing_utils::IsImplicitProperty::kNotImplicit,
3026 properties);
3027
3028 return true;
3029 }
3030
CSSValueFromComputedStyleInternal(const ComputedStyle & style,const SVGComputedStyle &,const LayoutObject *,bool allow_visited_style) const3031 const CSSValue* WebkitMaskRepeat::CSSValueFromComputedStyleInternal(
3032 const ComputedStyle& style,
3033 const SVGComputedStyle&,
3034 const LayoutObject*,
3035 bool allow_visited_style) const {
3036 return ComputedStyleUtils::BackgroundRepeatOrWebkitMaskRepeat(
3037 &style.MaskLayers());
3038 }
3039
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const3040 bool WebkitTextEmphasis::ParseShorthand(
3041 bool important,
3042 CSSParserTokenRange& range,
3043 const CSSParserContext& context,
3044 const CSSParserLocalContext&,
3045 HeapVector<CSSPropertyValue, 256>& properties) const {
3046 return css_parsing_utils::ConsumeShorthandGreedilyViaLonghands(
3047 webkitTextEmphasisShorthand(), important, context, range, properties);
3048 }
3049
ParseShorthand(bool important,CSSParserTokenRange & range,const CSSParserContext & context,const CSSParserLocalContext &,HeapVector<CSSPropertyValue,256> & properties) const3050 bool WebkitTextStroke::ParseShorthand(
3051 bool important,
3052 CSSParserTokenRange& range,
3053 const CSSParserContext& context,
3054 const CSSParserLocalContext&,
3055 HeapVector<CSSPropertyValue, 256>& properties) const {
3056 return css_parsing_utils::ConsumeShorthandGreedilyViaLonghands(
3057 webkitTextStrokeShorthand(), important, context, range, properties);
3058 }
3059
3060 } // namespace css_shorthand
3061 } // namespace blink
3062