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