8000 Implement parsing for animation-trigger-{exit-}range shorthands · chromium/chromium@4a4fd89 · GitHub
[go: up one dir, main page]

Skip to content

Commit 4a4fd89

Browse files
David AwogbemilaChromium LUCI CQ
authored andcommitted
Implement parsing for animation-trigger-{exit-}range shorthands
The spec is currently a work-in-progress[1] but this comment[2] describes the API. [1] w3c/csswg-drafts#10128 [2] w3c/csswg-drafts#8942 (comment) Bug: 390314945 Change-Id: I2c335d6be7b6e264fb1cbf4ae4cc3fa9aedc9136 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6187119 Reviewed-by: Anders Hartvoll Ruud <andruud@chromium.org> Commit-Queue: David Awogbemila <awogbemila@chromium.org> Cr-Commit-Position: refs/heads/main@{#1409968}
1 parent 3bb73c9 commit 4a4fd89

File tree

14 files changed

+597
-65
lines changed

14 files changed

+597
-65
lines changed

third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -881,6 +881,8 @@ enum CSSSampleId {
881881
kAnimationTriggerExitRangeEnd = 822,
882882
kInterestTargetShowDelay = 823,
883883
kInterestTargetHideDelay = 824,
884+
kAnimationTriggerRange = 825,
885+
kAnimationTriggerExitRange = 826,
884886

885887
// 1. Add new features above this line (don't change the assigned numbers of
886888
// the existing items).

third_party/blink/renderer/core/animation/css/css_animations.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3324,6 +3324,8 @@ bool CSSAnimations::IsAnimationAffectingProperty(const CSSProperty& property) {
33243324
case CSSPropertyID::kAnimationRangeStart:
33253325
case CSSPropertyID::kAnimationTimeline:
33263326
case CSSPropertyID::kAnimationTimingFunction:
3327+
case CSSPropertyID::kAnimationTriggerRange:
3328+
case CSSPropertyID::kAnimationTriggerExitRange:
33273329
case CSSPropertyID::kAnimationTriggerRangeStart:
33283330
case CSSPropertyID::kAnimationTriggerRangeEnd:
33293331
case CSSPropertyID::kAnimationTriggerExitRangeStart:

third_party/blink/renderer/core/css/css_properties.json5

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7776,6 +7776,27 @@
77767776
supports_incremental_style: false,
77777777
valid_for_keyframe: false,
77787778
},
7779+
{
7780+
name: "animation-trigger-range",
7781+
longhands: [
7782+
"animation-trigger-range-start", "animation-trigger-range-end",
7783+
],
7784+
property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
7785+
supports_incremental_style: false,
7786+
valid_for_keyframe: false,
7787+
runtime_flag: "CSSAnimationTriggerRange",
7788+
},
7789+
{
7790+
name: "animation-trigger-exit-range",
7791+
longhands: [
7792+
"animation-trigger-exit-range-start",
7793+
"animation-trigger-exit-range-end",
7794+
],
7795+
property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
7796+
supports_incremental_style: false,
7797+
valid_for_keyframe: false,
7798+
runtime_flag: "CSSAnimationTriggerRange",
7799+
},
77797800
{
77807801
name: "background",
77817802
longhands: [

third_party/blink/renderer/core/css/css_property_equality.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1283,6 +1283,8 @@ bool CSSPropertyEquality::PropertiesEqual(const PropertyHandle& property,
12831283
case CSSPropertyID::kAnimationRange:
12841284
case CSSPropertyID::kAnimationRangeEnd:
12851285
case CSSPropertyID::kAnimationRangeStart:
1286+
case CSSPropertyID::kAnimationTriggerRange:
1287+
case CSSPropertyID::kAnimationTriggerExitRange:
12861288
case CSSPropertyID::kAnimationTriggerRangeStart:
12871289
case CSSPropertyID::kAnimationTriggerRangeEnd:
12881290
case CSSPropertyID::kAnimationTriggerExitRangeStart:

third_party/blink/renderer/core/css/properties/computed_style_utils.cc

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2523,11 +2523,10 @@ CSSValue* ComputedStyleUtils::ValueForAnimationPlayStateList(
25232523
&ValueForAnimationPlayState);
25242524
}
25252525

2526-
namespace {
2527-
2528-
CSSValue* ValueForAnimationRange(const std::optional<TimelineOffset>& offset,
2529-
const ComputedStyle& style,
2530-
const Length& default_offset) {
2526+
CSSValue* ComputedStyleUtils::ValueForAnimationRange(
2527+
const std::optional<TimelineOffset>& offset,
2528+
const ComputedStyle& style,
2529+
const Length& default_offset) {
25312530
if (!offset.has_value()) {
25322531
return MakeGarbageCollected<CSSIdentifierValue>(CSSValueID::kNormal);
25332532
}
@@ -2542,8 +2541,6 @@ CSSValue* ValueForAnimationRange(const std::optional<TimelineOffset>& offset,
25422541
return list;
25432542
}
25442543

2545-
} // namespace
2546-
25472544
CSSValue* ComputedStyleUtils::ValueForAnimationRangeList(
25482545
const Vector<std::optional<TimelineOffset>>& range_list,
25492546
const CSSAnimationData* animation_data,
@@ -2553,12 +2550,6 @@ CSSValue* ComputedStyleUtils::ValueForAnimationRangeList(
25532550
default_offset);
25542551
}
25552552

2556-
CSSValue* ComputedStyleUtils::ValueForAnimationRangeStart(
2557-
const std::optional<TimelineOffset>& offset,
2558-
const ComputedStyle& style) {
2559-
return ValueForAnimationRange(offset, style, Length::Percent(0.0));
2560-
}
2561-
25622553
CSSValue* ComputedStyleUtils::ValueForAnimationRangeStartList(
25632554
const CSSAnimationData* animation_data,
25642555
const ComputedStyle& style) {
@@ -2570,12 +2561,6 @@ CSSValue* ComputedStyleUtils::ValueForAnimationRangeStartList(
25702561
animation_data, style, Length::Percent(0.0));
25712562
}
25722563

2573-
CSSValue* ComputedStyleUtils::ValueForAnimationRangeEnd(
2574-
const std::optional<TimelineOffset>& offset,
2575-
const ComputedStyle& style) {
2576-
return ValueForAnimationRange(offset, style, Length::Percent(100.0));
2577-
}
2578-
25792564
CSSValue* ComputedStyleUtils::ValueForAnimationRangeEndList(
25802565
const CSSAnimationData* animation_data,
25812566
const ComputedStyle& style) {

third_party/blink/renderer/core/css/properties/computed_style_utils.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -184,12 +184,6 @@ class CORE_EXPORT ComputedStyleUtils {
184184
const CSSAnimationData* animation_data,
185185
const ComputedStyle& style,
186186
const Length& default_offset);
187-
static CSSValue* ValueForAnimationRangeStart(
188-
const std::optional<TimelineOffset>&,
189-
const ComputedStyle&);
190-
static CSSValue* ValueForAnimationRangeEnd(
191-
const std::optional<TimelineOffset>&,
192-
const ComputedStyle&);
193187
static CSSValue* ValueForAnimationTimingFunction(
194188
const scoped_refptr<TimingFunction>&);
195189
static CSSValue* ValueForAnimationTimeline(const StyleTimeline&);
@@ -202,6 +196,10 @@ class CORE_EXPORT ComputedStyleUtils {
202196
static CSSValue* ValueForAnimationFillModeList(const CSSAnimationData*);
203197
static CSSValue* ValueForAnimationIterationCountList(const CSSAnimationData*);
204198
static CSSValue* ValueForAnimationPlayStateList(const CSSAnimationData*);
199+
static CSSValue* ValueForAnimationRange(
200+
const std::optional<TimelineOffset>& offset,
201+
const ComputedStyle& style,
202+
const Length& default_offset);
205203
static CSSValue* ValueForAnimationRangeStartList(const CSSAnimationData*,
206204
const ComputedStyle&);
207205
static CSSValue* ValueForAnimationRangeEndList(const CSSAnimationData*,

third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc

Lines changed: 131 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -272,23 +272,55 @@ bool ConsumeAnimationRangeItemInto(CSSParserTokenStream& stream,
272272
return true;
273273
}
274274

275-
} // namespace
275+
const CSSValue* AnimationRangeCSSValueFromComputedStyle(
276+
const ComputedStyle& style,
277+
const Vector<std::optional<TimelineOffset>>& range_start_list,
278+
const Vector<std::optional<TimelineOffset>>& range_end_list) {
279+
if (range_start_list.size() != range_end_list.size()) {
280+
return nullptr;
281+
}
276282

277-
bool AnimationRange::ParseShorthand(
283+
TimelineOffset default_start(TimelineOffset::NamedRange::kNone,
284+
Length::Percent(0));
285+
TimelineOffset default_end(TimelineOffset::NamedRange::kNone,
286+
Length::Percent(100));
287+
auto* outer_list = CSSValueList::CreateCommaSeparated();
288+
289+
for (wtf_size_t i = 0; i < range_start_list.size(); ++i) {
290+
const std::optional<TimelineOffset>& start = range_start_list[i];
291+
const std::optional<TimelineOffset>& end = range_end_list[i];
292+
293+
auto* inner_list = CSSValueList::CreateSpaceSeparated();
294+
inner_list->Append(*ComputedStyleUtils::ValueForAnimationRange(
295+
start, style, Length::Percent(0.0)));
296+
297+
// The form "name X name 100%" must contract to "name X".
298+
//
299+
// https://github.com/w3c/csswg-drafts/issues/8438
300+
TimelineOffset omittable_end(start.value_or(default_start).name,
301+
Length::Percent(100));
302+
if (end.value_or(default_end) != omittable_end) {
303+
inner_list->Append(*ComputedStyleUtils::ValueForAnimationRange(
304+
end, style, Length::Percent(100.0)));
305+
}
306+
outer_list->Append(*inner_list);
307+
}
308+
309+
return outer_list;
310+
}
311+
312+
bool ParseAnimationRangeShorthand(
313+
const StylePropertyShorthand& shorthand,
314+
CSSPropertyID start_longhand_id,
315+
CSSPropertyID end_longhand_id,
278316
bool important,
279317
CSSParserTokenStream& stream,
280318
const CSSParserContext& context,
281-
const CSSParserLocalContext& local_context,
282-
HeapVector<CSSPropertyValue, 64>& properties) const {
319+
HeapVector<CSSPropertyValue, 64>& properties) {
283320
using css_parsing_utils::AddProperty;
284321
using css_parsing_utils::ConsumeCommaIncludingWhitespace;
285322
using css_parsing_utils::IsImplicitProperty;
286323

287-
const StylePropertyShorthand shorthand = animationRangeShorthand();
288-
DCHECK_EQ(2u, shorthand.length());
289-
DCHECK_EQ(&GetCSSPropertyAnimationRangeStart(), shorthand.properties()[0]);
290-
DCHECK_EQ(&GetCSSPropertyAnimationRangeEnd(), shorthand.properties()[1]);
291-
292324
CSSValueList* start_list = CSSValueList::CreateCommaSeparated();
293325
CSSValueList* end_list = CSSValueList::CreateCommaSeparated();
294326

@@ -302,16 +334,32 @@ bool AnimationRange::ParseShorthand(
302334
DCHECK(end_list->length());
303335
DCHECK_EQ(start_list->length(), end_list->length());
304336

305-
AddProperty(CSSPropertyID::kAnimationRangeStart,
306-
CSSPropertyID::kAnimationRange, *start_list, important,
337+
AddProperty(start_longhand_id, shorthand.id(), *start_list, important,
338+
IsImplicitProperty::kNotImplicit, properties);
339+
AddProperty(end_longhand_id, shorthand.id(), *end_list, important,
307340
IsImplicitProperty::kNotImplicit, properties);
308-
AddProperty(CSSPropertyID::kAnimationRangeEnd, CSSPropertyID::kAnimationRange,
309-
*end_list, important, IsImplicitProperty::kNotImplicit,
310-
properties);
311341

312342
return true;
313343
}
314344

345+
} // namespace
346+
347+
bool AnimationRange::ParseShorthand(
348+
bool important,
349+
CSSParserTokenStream& stream,
350+
const CSSParserContext& context,
351+
const CSSParserLocalContext& local_context,
352+
HeapVector<CSSPropertyValue, 64>& properties) const {
353+
const StylePropertyShorthand shorthand = animationRangeShorthand();
354+
DCHECK_EQ(2u, shorthand.length());
355+
DCHECK_EQ(&GetCSSPropertyAnimationRangeStart(), shorthand.properties()[0]);
356+
DCHECK_EQ(&GetCSSPropertyAnimationRangeEnd(), shorthand.properties()[1]);
357+
return ParseAnimationRangeShorthand(shorthand,
358+
CSSPropertyID::kAnimationRangeStart,
359+
CSSPropertyID::kAnimationRangeEnd,
360+
important, stream, context, properties);
361+
}
362+
315363
const CSSValue* AnimationRange::CSSValueFromComputedStyleInternal(
316364
const ComputedStyle& style,
317365
const LayoutObject*,
@@ -326,38 +374,81 @@ const CSSValue* AnimationRange::CSSValueFromComputedStyleInternal(
326374
: Vector<std::optional<TimelineOffset>>{
327375
CSSAnimationData::InitialRangeEnd()};
328376

329-
if (range_start_list.size() != range_end_list.size()) {
330-
return nullptr;
331-
}
377+
return AnimationRangeCSSValueFromComputedStyle(style, range_start_list,
378+
range_end_list);
379+
}
332380

333-
TimelineOffset default_start(TimelineOffset::NamedRange::kNone,
334-
Length::Percent(0));
335-
TimelineOffset default_end(TimelineOffset::NamedRange::kNone,
336-
Length::Percent(100));
381+
bool AnimationTriggerRange::ParseShorthand(
382+
bool important,
383+
CSSParserTokenStream& stream,
384+
const CSSParserContext& context,
385+
const CSSParserLocalContext& local_context,
386+
HeapVector<CSSPropertyValue, 64>& properties) const {
387+
const StylePropertyShorthand shorthand = animationTriggerRangeShorthand();
388+
DCHECK_EQ(2u, shorthand.length());
389+
DCHECK_EQ(&GetCSSPropertyAnimationTriggerRangeStart(),
390+
shorthand.properties()[0]);
391+
DCHECK_EQ(&GetCSSPropertyAnimationTriggerRangeEnd(),
392+
shorthand.properties()[1]);
393+
return ParseAnimationRangeShorthand(
394+
shorthand, CSSPropertyID::kAnimationTriggerRangeStart,
395+
CSSPropertyID::kAnimationTriggerRangeEnd, important, stream, context,
396+
properties);
397+
}
337398

338-
auto* outer_list = CSSValueList::CreateCommaSeparated();
399+
const CSSValue* AnimationTriggerRange::CSSValueFromComputedStyleInternal(
400+
const ComputedStyle& style,
401+
const LayoutObject*,
402+
bool allow_visited_style,
403+
CSSValuePhase value_phase) const {
404+
const Vector<std::optional<TimelineOffset>>& range_start_list =
405+
style.Animations() ? style.Animations()->TriggerRangeStartList()
406+
: Vector<std::optional<TimelineOffset>>{
407+
CSSAnimationData::InitialTriggerRangeStart()};
408+
const Vector<std::optional<TimelineOffset>>& range_end_list =
409+
style.Animations() ? style.Animations()->TriggerRangeEndList()
410+
: Vector<std::optional<TimelineOffset>>{
411+
CSSAnimationData::InitialTriggerRangeEnd()};
339412

340-
for (wtf_size_t i = 0; i < range_start_list.size(); ++i) {
341-
const std::optional<TimelineOffset>& start = range_start_list[i];
342-
const std::optional<TimelineOffset>& end = range_end_list[i];
413+
return AnimationRangeCSSValueFromComputedStyle(style, range_start_list,
414+
range_end_list);
415+
}
343416

344-
auto* inner_list = CSSValueList::CreateSpaceSeparated();
345-
inner_list->Append(
346-
*ComputedStyleUtils::ValueForAnimationRangeStart(start, style));
417+
bool AnimationTriggerExitRange::ParseShorthand(
418+
bool important,
419+
CSSParserTokenStream& stream,
420+
const CSSParserContext& context,
421+
const CSSParserLocalContext& local_context,
422+
HeapVector<CSSPropertyValue, 64>& properties) const {
423+
const StylePropertyShorthand shorthand = animationTriggerExitRangeShorthand();
424+
DCHECK_EQ(2u, shorthand.length());
425+
DCHECK_EQ(&GetCSSPropertyAnimationTriggerExitRangeStart(),
426+
shorthand.properties()[0]);
427+
DCHECK_EQ(&GetCSSPropertyAnimationTriggerExitRangeEnd(),
428+
shorthand.properties()[1]);
429+
return ParseAnimationRangeShorthand(
430+
shorthand, CSSPropertyID::kAnimationTriggerExitRangeStart,
431+
CSSPropertyID::kAnimationTriggerExitRangeEnd, important, stream, context,
432+
properties);
433+
}
347434

348-
// The form "name X name 100%" must contract to "name X".
349-
//
350-
// https://github.com/w3c/csswg-drafts/issues/8438
351-
TimelineOffset omittable_end(start.value_or(default_start).name,
352-
Length::Percent(100));
353-
if (end.value_or(default_end) != omittable_end) {
354-
inner_list->Append(
355-
*ComputedStyleUtils::ValueForAnimationRangeEnd(end, style));
356-
}
357-
outer_list->Append(*inner_list);
358-
}
435+
const CSSValue* AnimationTriggerExitRange::CSSValueFromComputedStyleInternal(
436+
const ComputedStyle& style,
437+
const LayoutObject*,
438+
bool allow_visited_style,
439+
CSSValuePhase value_phase) const {
440+
const Vector<std::optional<TimelineOffset>>& range_start_list =
441+
style.Animations()
442+
? style.Animations()->TriggerExitRangeStartList()
443+
: Vector<std::optional<TimelineOffset>>{
444+
CSSAnimationData::InitialTriggerExitRangeStart()};
445+
const Vector<std::optional<TimelineOffset>>& range_end_list =
446+
style.Animations() ? style.Animations()->TriggerExitRangeEndList()
447+
: Vector<std::optional<TimelineOffset>>{
448+
CSSAnimationData::InitialTriggerExitRangeEnd()};
359449

360-
return outer_list;
450+
return AnimationRangeCSSValueFromComputedStyle(style, range_start_list,
451+
range_end_list);
361452
}
362453

363454
bool Background::ParseShorthand(

0 commit comments

Comments
 (0)
0