Skip to content

Commit 9c06d58

Browse files
committed
LibWeb/CSS: Implement and use ValueType::DashedIdent
Reduces the repeated code for parsing these, and makes them available to the generic value parser.
1 parent 6671cbe commit 9c06d58

File tree

6 files changed

+38
-23
lines changed

6 files changed

+38
-23
lines changed

Libraries/LibWeb/CSS/Parser/Parser.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ class Parser {
379379
Optional<FlyString> parse_custom_ident(TokenStream<ComponentValue>&, ReadonlySpan<StringView> blacklist);
380380
RefPtr<CustomIdentStyleValue const> parse_custom_ident_value(TokenStream<ComponentValue>&, ReadonlySpan<StringView> blacklist);
381381
Optional<FlyString> parse_dashed_ident(TokenStream<ComponentValue>&);
382+
RefPtr<CustomIdentStyleValue const> parse_dashed_ident_value(TokenStream<ComponentValue>&);
382383
// NOTE: Implemented in generated code. (GenerateCSSMathFunctions.cpp)
383384
RefPtr<CalculationNode const> parse_math_function(Function const&, CalculationContext const&);
384385
RefPtr<CalculationNode const> parse_a_calc_function_node(Function const&, CalculationContext const&);

Libraries/LibWeb/CSS/Parser/PropertyParsing.cpp

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,8 @@ Optional<Parser::PropertyAndValue> Parser::parse_css_value_for_properties(Readon
224224
return parsed.release_value();
225225
if (auto parsed = parse_for_type(ValueType::Counter); parsed.has_value())
226226
return parsed.release_value();
227+
if (auto parsed = parse_for_type(ValueType::DashedIdent); parsed.has_value())
228+
return parsed.release_value();
227229
if (auto parsed = parse_for_type(ValueType::EasingFunction); parsed.has_value())
228230
return parsed.release_value();
229231
if (auto parsed = parse_for_type(ValueType::Image); parsed.has_value())
@@ -1269,10 +1271,7 @@ RefPtr<StyleValue const> Parser::parse_anchor_name_value(TokenStream<ComponentVa
12691271
return none;
12701272

12711273
return parse_comma_separated_value_list(tokens, [this](TokenStream<ComponentValue>& inner_tokens) -> RefPtr<StyleValue const> {
1272-
auto dashed_ident = parse_dashed_ident(inner_tokens);
1273-
if (!dashed_ident.has_value())
1274-
return nullptr;
1275-
return CustomIdentStyleValue::create(*dashed_ident);
1274+
return parse_dashed_ident_value(inner_tokens);
12761275
});
12771276
}
12781277

@@ -1287,10 +1286,7 @@ RefPtr<StyleValue const> Parser::parse_anchor_scope_value(TokenStream<ComponentV
12871286
return all;
12881287

12891288
return parse_comma_separated_value_list(tokens, [this](TokenStream<ComponentValue>& inner_tokens) -> RefPtr<StyleValue const> {
1290-
auto dashed_ident = parse_dashed_ident(inner_tokens);
1291-
if (!dashed_ident.has_value())
1292-
return {};
1293-
return CustomIdentStyleValue::create(*dashed_ident);
1289+
return parse_dashed_ident_value(inner_tokens);
12941290
});
12951291
}
12961292

@@ -4236,10 +4232,7 @@ RefPtr<StyleValue const> Parser::parse_position_anchor_value(TokenStream<Compone
42364232
return auto_keyword;
42374233

42384234
// <anchor-name> = <dashed-ident>
4239-
auto dashed_ident = parse_dashed_ident(tokens);
4240-
if (!dashed_ident.has_value())
4241-
return nullptr;
4242-
return CustomIdentStyleValue::create(*dashed_ident);
4235+
return parse_dashed_ident_value(tokens);
42434236
}
42444237

42454238
// https://drafts.csswg.org/css-anchor-position/#position-try-fallbacks
@@ -4266,26 +4259,26 @@ RefPtr<StyleValue const> Parser::parse_single_position_try_fallbacks_value(Token
42664259
return position_area;
42674260
}
42684261

4269-
Optional<FlyString> dashed_ident;
4262+
RefPtr<StyleValue const> dashed_ident;
42704263
RefPtr<StyleValue const> try_tactic;
42714264
while (tokens.has_next_token()) {
42724265
if (auto try_tactic_value = parse_try_tactic_value(tokens)) {
42734266
if (try_tactic)
42744267
return {};
42754268
try_tactic = try_tactic_value.release_nonnull();
4276-
} else if (auto maybe_dashed_ident = parse_dashed_ident(tokens); maybe_dashed_ident.has_value()) {
4277-
if (dashed_ident.has_value())
4269+
} else if (auto maybe_dashed_ident = parse_dashed_ident_value(tokens)) {
4270+
if (dashed_ident)
42784271
return {};
4279-
dashed_ident = maybe_dashed_ident.release_value();
4272+
dashed_ident = maybe_dashed_ident.release_nonnull();
42804273
} else {
42814274
break;
42824275
}
42834276
tokens.discard_whitespace();
42844277
}
42854278

42864279
StyleValueVector values;
4287-
if (dashed_ident.has_value())
4288-
values.append(CustomIdentStyleValue::create(dashed_ident.release_value()));
4280+
if (dashed_ident)
4281+
values.append(dashed_ident.release_nonnull());
42894282
if (try_tactic)
42904283
values.append(try_tactic.release_nonnull());
42914284

Libraries/LibWeb/CSS/Parser/ValueParsing.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3593,6 +3593,17 @@ Optional<FlyString> Parser::parse_dashed_ident(TokenStream<ComponentValue>& toke
35933593
return custom_ident;
35943594
}
35953595

3596+
RefPtr<CustomIdentStyleValue const> Parser::parse_dashed_ident_value(TokenStream<ComponentValue>& tokens)
3597+
{
3598+
auto transaction = tokens.begin_transaction();
3599+
tokens.discard_whitespace();
3600+
if (auto dashed_ident = parse_dashed_ident(tokens); dashed_ident.has_value()) {
3601+
transaction.commit();
3602+
return CustomIdentStyleValue::create(*dashed_ident);
3603+
}
3604+
return nullptr;
3605+
}
3606+
35963607
// https://www.w3.org/TR/css-grid-2/#typedef-track-breadth
35973608
Optional<GridSize> Parser::parse_grid_track_breadth(TokenStream<ComponentValue>& tokens)
35983609
{
@@ -4908,6 +4919,8 @@ RefPtr<StyleValue const> Parser::parse_value(ValueType value_type, TokenStream<C
49084919
case ValueType::CustomIdent:
49094920
// FIXME: Figure out how to pass the blacklist here
49104921
return parse_custom_ident_value(tokens, {});
4922+
case ValueType::DashedIdent:
4923+
return parse_dashed_ident_value(tokens);
49114924
case ValueType::EasingFunction:
49124925
return parse_easing_value(tokens);
49134926
case ValueType::FilterValueList:

Libraries/LibWeb/CSS/Properties.json

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,18 +198,21 @@
198198
"animation-type": "discrete",
199199
"inherited": false,
200200
"initial": "none",
201+
"valid-types": [
202+
"dashed-ident"
203+
],
201204
"valid-identifiers": [
202205
"none"
203-
],
204-
"valid-types": [
205-
"custom-ident ![none]"
206206
]
207207
},
208208
"anchor-scope": {
209209
"affects-layout": false,
210210
"animation-type": "discrete",
211211
"inherited": false,
212212
"initial": "none",
213+
"valid-types": [
214+
"dashed-ident"
215+
],
213216
"valid-identifiers": [
214217
"none",
215218
"all"
@@ -3259,7 +3262,7 @@
32593262
"inherited": false,
32603263
"initial": "auto",
32613264
"valid-types": [
3262-
"custom-ident ![auto]"
3265+
"dashed-ident"
32633266
],
32643267
"valid-identifiers": [
32653268
"auto"
@@ -3282,7 +3285,7 @@
32823285
"inherited": false,
32833286
"initial": "none",
32843287
"valid-types": [
3285-
"custom-ident ![none]",
3288+
"dashed-ident",
32863289
"try-tactic"
32873290
],
32883291
"valid-identifiers": [

Libraries/LibWeb/CSS/ValueType.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ Optional<ValueType> value_type_from_string(StringView string)
2727
return ValueType::Counter;
2828
if (string.equals_ignoring_ascii_case("custom-ident"sv))
2929
return ValueType::CustomIdent;
30+
if (string.equals_ignoring_ascii_case("dashed-ident"sv))
31+
return ValueType::DashedIdent;
3032
if (string.equals_ignoring_ascii_case("easing-function"sv))
3133
return ValueType::EasingFunction;
3234
if (string.equals_ignoring_ascii_case("filter-value-list"sv))
@@ -103,6 +105,8 @@ StringView value_type_to_string(ValueType value_type)
103105
return "Counter"sv;
104106
case Web::CSS::ValueType::CustomIdent:
105107
return "CustomIdent"sv;
108+
case Web::CSS::ValueType::DashedIdent:
109+
return "DashedIdent"sv;
106110
case Web::CSS::ValueType::EasingFunction:
107111
return "EasingFunction"sv;
108112
case Web::CSS::ValueType::FilterValueList:

Libraries/LibWeb/CSS/ValueType.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ enum class ValueType : u8 {
2323
CornerShape,
2424
Counter,
2525
CustomIdent,
26+
DashedIdent,
2627
EasingFunction,
2728
FilterValueList,
2829
FitContent,

0 commit comments

Comments
 (0)