Skip to content

Commit ba69846

Browse files
committed
LibWeb: Parse the view-timeline-inset CSS property
1 parent 198ab54 commit ba69846

File tree

13 files changed

+191
-0
lines changed

13 files changed

+191
-0
lines changed

Libraries/LibWeb/CSS/Parser/Parser.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,8 @@ class Parser {
443443
RefPtr<StyleValue const> parse_time_value(TokenStream<ComponentValue>&);
444444
RefPtr<StyleValue const> parse_time_percentage_value(TokenStream<ComponentValue>&);
445445

446+
RefPtr<StyleValue const> parse_view_timeline_inset_value(TokenStream<ComponentValue>&);
447+
446448
using ParseFunction = AK::Function<RefPtr<StyleValue const>(TokenStream<ComponentValue>&)>;
447449
RefPtr<StyleValue const> parse_comma_separated_value_list(TokenStream<ComponentValue>&, ParseFunction);
448450
RefPtr<StyleValue const> parse_simple_comma_separated_value_list(PropertyID, TokenStream<ComponentValue>&);

Libraries/LibWeb/CSS/Parser/PropertyParsing.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,8 @@ Optional<Parser::PropertyAndValue> Parser::parse_css_value_for_properties(Readon
254254
return parsed.release_value();
255255
if (auto parsed = parse_for_type(ValueType::Url); parsed.has_value())
256256
return parsed.release_value();
257+
if (auto parsed = parse_for_type(ValueType::ViewTimelineInset); parsed.has_value())
258+
return parsed.release_value();
257259

258260
// <integer>/<number> come before <length>, so that 0 is not interpreted as a <length> in case both are allowed.
259261
if (auto property = any_property_accepts_type(property_ids, ValueType::Integer); property.has_value()) {
@@ -751,6 +753,7 @@ Parser::ParseErrorOr<NonnullRefPtr<StyleValue const>> Parser::parse_css_value(Pr
751753
case PropertyID::ScrollTimelineName:
752754
return parse_all_as(tokens, [this, property_id](auto& tokens) { return parse_simple_comma_separated_value_list(property_id, tokens); });
753755
case PropertyID::ViewTimelineAxis:
756+
case PropertyID::ViewTimelineInset:
754757
case PropertyID::ViewTimelineName:
755758
return parse_all_as(tokens, [this, property_id](auto& tokens) { return parse_simple_comma_separated_value_list(property_id, tokens); });
756759
case PropertyID::WhiteSpace:

Libraries/LibWeb/CSS/Parser/ValueParsing.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1377,6 +1377,43 @@ RefPtr<StyleValue const> Parser::parse_time_percentage_value(TokenStream<Compone
13771377
return nullptr;
13781378
}
13791379

1380+
// https://drafts.csswg.org/scroll-animations-1/#view-timeline-inset
1381+
RefPtr<StyleValue const> Parser::parse_view_timeline_inset_value(TokenStream<ComponentValue>& tokens)
1382+
{
1383+
// [ [ auto | <length-percentage> ]{1,2} ]
1384+
auto transaction = tokens.begin_transaction();
1385+
1386+
StyleValueVector inset_values;
1387+
1388+
while (tokens.has_next_token() && inset_values.size() < 2) {
1389+
tokens.discard_whitespace();
1390+
1391+
if (tokens.next_token().is_ident("auto"sv)) {
1392+
tokens.discard_a_token(); // auto
1393+
inset_values.append(KeywordStyleValue::create(Keyword::Auto));
1394+
continue;
1395+
}
1396+
1397+
if (auto length_percentage = parse_length_percentage_value(tokens)) {
1398+
inset_values.append(length_percentage.release_nonnull());
1399+
continue;
1400+
}
1401+
1402+
break;
1403+
}
1404+
1405+
if (inset_values.is_empty())
1406+
return nullptr;
1407+
1408+
transaction.commit();
1409+
1410+
// If the second value is omitted, it is set to the first.
1411+
if (inset_values.size() == 1)
1412+
return StyleValueList::create({ inset_values[0], inset_values[0] }, StyleValueList::Separator::Space);
1413+
1414+
return StyleValueList::create(move(inset_values), StyleValueList::Separator::Space);
1415+
}
1416+
13801417
RefPtr<StyleValue const> Parser::parse_keyword_value(TokenStream<ComponentValue>& tokens)
13811418
{
13821419
tokens.discard_whitespace();
@@ -5049,6 +5086,8 @@ RefPtr<StyleValue const> Parser::parse_value(ValueType value_type, TokenStream<C
50495086
return parse_transform_list_value(tokens);
50505087
case ValueType::Url:
50515088
return parse_url_value(tokens);
5089+
case ValueType::ViewTimelineInset:
5090+
return parse_view_timeline_inset_value(tokens);
50525091
}
50535092
VERIFY_NOT_REACHED();
50545093
}

Libraries/LibWeb/CSS/Properties.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4023,6 +4023,17 @@
40234023
],
40244024
"multiplicity": "coordinating-list"
40254025
},
4026+
"view-timeline-inset": {
4027+
"affects-layout": false,
4028+
"animation-type": "none",
4029+
"inherited": false,
4030+
"initial": "auto",
4031+
"valid-types": [
4032+
"view-timeline-inset"
4033+
],
4034+
"percentages-resolve-to": "length",
4035+
"multiplicity": "coordinating-list"
4036+
},
40264037
"view-timeline-name": {
40274038
"affects-layout": false,
40284039
"animation-type": "none",

Libraries/LibWeb/CSS/ValueType.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ Optional<ValueType> value_type_from_string(StringView string)
7979
return ValueType::TransformList;
8080
if (string.equals_ignoring_ascii_case("url"sv))
8181
return ValueType::Url;
82+
if (string.equals_ignoring_ascii_case("view-timeline-inset"sv))
83+
return ValueType::ViewTimelineInset;
8284
return {};
8385
}
8486

@@ -157,6 +159,8 @@ StringView value_type_to_string(ValueType value_type)
157159
return "TransformList"sv;
158160
case Web::CSS::ValueType::Url:
159161
return "Url"sv;
162+
case Web::CSS::ValueType::ViewTimelineInset:
163+
return "ViewTimelineInset"sv;
160164
}
161165

162166
VERIFY_NOT_REACHED();

Libraries/LibWeb/CSS/ValueType.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ enum class ValueType : u8 {
4949
TransformFunction,
5050
TransformList,
5151
Url,
52+
ViewTimelineInset
5253
};
5354

5455
StringView value_type_to_string(ValueType);

Tests/LibWeb/Text/expected/css/CSSStyleDeclaration-has-indexed-property-getter.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ All properties associated with getComputedStyle(document.body):
290290
"user-select",
291291
"vertical-align",
292292
"view-timeline-axis",
293+
"view-timeline-inset",
293294
"view-timeline-name",
294295
"view-transition-name",
295296
"white-space-trim",

Tests/LibWeb/Text/expected/css/CSSStyleProperties-all-supported-properties-and-default-values.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -803,6 +803,8 @@ All supported properties and their default values exposed from CSSStylePropertie
803803
'vertical-align': 'baseline'
804804
'viewTimelineAxis': 'block'
805805
'view-timeline-axis': 'block'
806+
'viewTimelineInset': 'auto'
807+
'view-timeline-inset': 'auto'
806808
'viewTimelineName': 'none'
807809
'view-timeline-name': 'none'
808810
'viewTransitionName': 'none'

Tests/LibWeb/Text/expected/css/getComputedStyle-print-all.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@ unicode-bidi: normal
288288
user-select: auto
289289
vertical-align: baseline
290290
view-timeline-axis: block
291+
view-timeline-inset: auto
291292
view-timeline-name: none
292293
view-transition-name: none
293294
white-space-trim: none
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
Harness status: OK
2+
3+
Found 17 tests
4+
5+
16 Pass
6+
1 Fail
7+
Pass Property view-timeline-inset value 'initial'
8+
Pass Property view-timeline-inset value 'inherit'
9+
Pass Property view-timeline-inset value 'unset'
10+
Pass Property view-timeline-inset value 'revert'
11+
Pass Property view-timeline-inset value '1px'
12+
Pass Property view-timeline-inset value '1%'
13+
Pass Property view-timeline-inset value 'calc(1% + 1px)'
14+
Pass Property view-timeline-inset value '1px 2px'
15+
Pass Property view-timeline-inset value '1px 2em'
16+
Pass Property view-timeline-inset value 'calc(1px + 1em) 2px'
17+
Pass Property view-timeline-inset value '1px 2px, 3px 4px'
18+
Pass Property view-timeline-inset value '1px auto, auto 4px'
19+
Pass Property view-timeline-inset value '1px, 2px, 3px'
20+
Pass Property view-timeline-inset value '1px 1px, 2px 3px'
21+
Fail Property view-timeline-inset value 'auto auto, auto auto'
22+
Pass The view-timeline-inset property shows up in CSSStyleDeclaration enumeration
23+
Pass The view-timeline-inset property shows up in CSSStyleDeclaration.cssText

0 commit comments

Comments
 (0)