Skip to content

Commit 1603d59

Browse files
committed
LibWeb: Change dump_selector
This change updates the dump_selector function in order to resolve the FIXME.
1 parent ddcd48d commit 1603d59

File tree

3 files changed

+120
-93
lines changed

3 files changed

+120
-93
lines changed

Libraries/LibWeb/CSS/Parser/SelectorParsing.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ Optional<Selector::SimpleSelector::QualifiedName> Parser::parse_selector_qualifi
237237
return Selector::SimpleSelector::QualifiedName {
238238
.namespace_type = Selector::SimpleSelector::QualifiedName::NamespaceType::None,
239239
.name = get_name(name_token),
240+
240241
};
241242
}
242243
return {};
@@ -263,6 +264,7 @@ Optional<Selector::SimpleSelector::QualifiedName> Parser::parse_selector_qualifi
263264
.namespace_type = namespace_type,
264265
.namespace_ = namespace_,
265266
.name = name,
267+
266268
};
267269
}
268270

@@ -275,6 +277,7 @@ Optional<Selector::SimpleSelector::QualifiedName> Parser::parse_selector_qualifi
275277
return Selector::SimpleSelector::QualifiedName {
276278
.namespace_type = Selector::SimpleSelector::QualifiedName::NamespaceType::Default,
277279
.name = get_name(name_token),
280+
278281
};
279282
}
280283

@@ -746,7 +749,7 @@ Parser::ParseErrorOr<Optional<Selector::SimpleSelector>> Parser::parse_simple_se
746749
}
747750
return Selector::SimpleSelector {
748751
.type = Selector::SimpleSelector::Type::Class,
749-
.value = Selector::SimpleSelector::Name { class_name_value.token().ident() }
752+
.value = Selector::SimpleSelector::Name { class_name_value.token().ident() },
750753
};
751754
}
752755
case '>':
@@ -770,7 +773,7 @@ Parser::ParseErrorOr<Optional<Selector::SimpleSelector>> Parser::parse_simple_se
770773
}
771774
return Selector::SimpleSelector {
772775
.type = Selector::SimpleSelector::Type::Id,
773-
.value = Selector::SimpleSelector::Name { first_value.token().hash_value() }
776+
.value = Selector::SimpleSelector::Name { first_value.token().hash_value() },
774777
};
775778
}
776779

Libraries/LibWeb/CSS/Selector.h

+1
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ class Selector : public RefCounted<Selector> {
155155
Optional<Keyword> keyword {};
156156
};
157157

158+
158159
struct Name {
159160
Name(FlyString n)
160161
: name(move(n))

Libraries/LibWeb/Dump.cpp

+114-91
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,92 @@ static void dump_qualified_name(StringBuilder& builder, CSS::Selector::SimpleSel
464464
builder.appendff("NamespaceType={}, Namespace='{}', Name='{}'", namespace_type, qualified_name.namespace_, qualified_name.name.name);
465465
}
466466

467+
static void dump_simple_selector_pseudo_class(StringBuilder& builder, CSS::Selector::SimpleSelector::PseudoClassSelector const& pseudo_class, int indent_levels){
468+
builder.appendff(" pseudo_class={}", CSS::pseudo_class_name(pseudo_class.type));
469+
auto pseudo_class_metadata = CSS::pseudo_class_metadata(pseudo_class.type);
470+
471+
switch (pseudo_class_metadata.parameter_type) {
472+
case CSS::PseudoClassMetadata::ParameterType::None:
473+
break;
474+
case CSS::PseudoClassMetadata::ParameterType::ANPlusB:
475+
case CSS::PseudoClassMetadata::ParameterType::ANPlusBOf: {
476+
builder.appendff("(step={}, offset={}", pseudo_class.nth_child_pattern.step_size, pseudo_class.nth_child_pattern.offset);
477+
if (!pseudo_class.argument_selector_list.is_empty()) {
478+
builder.append(", selectors=[\n"sv);
479+
for (auto const& child_selector : pseudo_class.argument_selector_list)
480+
dump_selector(builder, child_selector, indent_levels + 2);
481+
indent(builder, indent_levels + 1);
482+
builder.append("]"sv);
483+
}
484+
builder.append(")"sv);
485+
break;
486+
}
487+
case CSS::PseudoClassMetadata::ParameterType::CompoundSelector:
488+
case CSS::PseudoClassMetadata::ParameterType::ForgivingSelectorList:
489+
case CSS::PseudoClassMetadata::ParameterType::ForgivingRelativeSelectorList:
490+
case CSS::PseudoClassMetadata::ParameterType::RelativeSelectorList:
491+
case CSS::PseudoClassMetadata::ParameterType::SelectorList: {
492+
builder.append("([\n"sv);
493+
for (auto& child_selector : pseudo_class.argument_selector_list)
494+
dump_selector(builder, child_selector, indent_levels + 2);
495+
indent(builder, indent_levels + 1);
496+
builder.append("])"sv);
497+
break;
498+
}
499+
case CSS::PseudoClassMetadata::ParameterType::Ident:
500+
builder.appendff("(keyword={})", string_from_keyword(pseudo_class.keyword.value()));
501+
break;
502+
case CSS::PseudoClassMetadata::ParameterType::LanguageRanges: {
503+
builder.append('(');
504+
builder.join(',', pseudo_class.languages);
505+
builder.append(')');
506+
break;
507+
}
508+
}
509+
}
510+
511+
static void dump_simple_selector_attribute(StringBuilder& builder, CSS::Selector::SimpleSelector::Attribute const& attribute) {
512+
char const* attribute_match_type_description = "";
513+
514+
switch (attribute.match_type) {
515+
case CSS::Selector::SimpleSelector::Attribute::MatchType::HasAttribute:
516+
attribute_match_type_description = "HasAttribute";
517+
break;
518+
case CSS::Selector::SimpleSelector::Attribute::MatchType::ExactValueMatch:
519+
attribute_match_type_description = "ExactValueMatch";
520+
break;
521+
case CSS::Selector::SimpleSelector::Attribute::MatchType::ContainsWord:
522+
attribute_match_type_description = "ContainsWord";
523+
break;
524+
case CSS::Selector::SimpleSelector::Attribute::MatchType::ContainsString:
525+
attribute_match_type_description = "ContainsString";
526+
break;
527+
case CSS::Selector::SimpleSelector::Attribute::MatchType::StartsWithSegment:
528+
attribute_match_type_description = "StartsWithSegment";
529+
break;
530+
case CSS::Selector::SimpleSelector::Attribute::MatchType::StartsWithString:
531+
attribute_match_type_description = "StartsWithString";
532+
break;
533+
case CSS::Selector::SimpleSelector::Attribute::MatchType::EndsWithString:
534+
attribute_match_type_description = "EndsWithString";
535+
break;
536+
}
537+
538+
builder.appendff(" [{}, ", attribute_match_type_description);
539+
dump_qualified_name(builder, attribute.qualified_name);
540+
builder.appendff(", value='{}']", attribute.value);
541+
}
542+
543+
544+
static void dump_name_or_qualified_name(StringBuilder& builder, CSS::Selector::SimpleSelector simple_selector) {
545+
546+
if (simple_selector.value.has<CSS::Selector::SimpleSelector::Name>()) {
547+
builder.append(simple_selector.name());
548+
} else if (simple_selector.value.has<CSS::Selector::SimpleSelector::QualifiedName>()) {
549+
dump_qualified_name(builder, simple_selector.qualified_name());
550+
}
551+
}
552+
467553
void dump_selector(StringBuilder& builder, CSS::Selector const& selector, int indent_levels)
468554
{
469555
indent(builder, indent_levels);
@@ -532,102 +618,37 @@ void dump_selector(StringBuilder& builder, CSS::Selector const& selector, int in
532618

533619
builder.appendff("{}:", type_description);
534620

535-
// FIXME: This is goofy
536-
if (simple_selector.value.has<CSS::Selector::SimpleSelector::Name>()) {
537-
builder.append(simple_selector.name());
538-
} else if (simple_selector.value.has<CSS::Selector::SimpleSelector::QualifiedName>()) {
539-
dump_qualified_name(builder, simple_selector.qualified_name());
540-
}
621+
622+
dump_name_or_qualified_name(builder, simple_selector);
541623

542-
if (simple_selector.type == CSS::Selector::SimpleSelector::Type::PseudoClass) {
543-
auto const& pseudo_class = simple_selector.pseudo_class();
544-
545-
builder.appendff(" pseudo_class={}", CSS::pseudo_class_name(pseudo_class.type));
546-
auto pseudo_class_metadata = CSS::pseudo_class_metadata(pseudo_class.type);
547-
548-
switch (pseudo_class_metadata.parameter_type) {
549-
case CSS::PseudoClassMetadata::ParameterType::None:
550-
break;
551-
case CSS::PseudoClassMetadata::ParameterType::ANPlusB:
552-
case CSS::PseudoClassMetadata::ParameterType::ANPlusBOf: {
553-
builder.appendff("(step={}, offset={}", pseudo_class.nth_child_pattern.step_size, pseudo_class.nth_child_pattern.offset);
554-
if (!pseudo_class.argument_selector_list.is_empty()) {
555-
builder.append(", selectors=[\n"sv);
556-
for (auto const& child_selector : pseudo_class.argument_selector_list)
557-
dump_selector(builder, child_selector, indent_levels + 2);
558-
indent(builder, indent_levels + 1);
559-
builder.append("]"sv);
560-
}
561-
builder.append(")"sv);
562-
break;
624+
switch(simple_selector.type){
625+
case CSS::Selector::SimpleSelector::Type::PseudoClass:
626+
{
627+
auto const& pseudo_class = simple_selector.pseudo_class();
628+
dump_simple_selector_pseudo_class(builder, pseudo_class, indent_levels);
563629
}
564-
case CSS::PseudoClassMetadata::ParameterType::CompoundSelector:
565-
case CSS::PseudoClassMetadata::ParameterType::ForgivingSelectorList:
566-
case CSS::PseudoClassMetadata::ParameterType::ForgivingRelativeSelectorList:
567-
case CSS::PseudoClassMetadata::ParameterType::RelativeSelectorList:
568-
case CSS::PseudoClassMetadata::ParameterType::SelectorList: {
569-
builder.append("([\n"sv);
570-
for (auto& child_selector : pseudo_class.argument_selector_list)
571-
dump_selector(builder, child_selector, indent_levels + 2);
572-
indent(builder, indent_levels + 1);
573-
builder.append("])"sv);
574-
break;
575-
}
576-
case CSS::PseudoClassMetadata::ParameterType::Ident:
577-
builder.appendff("(keyword={})", string_from_keyword(pseudo_class.keyword.value()));
578-
break;
579-
case CSS::PseudoClassMetadata::ParameterType::LanguageRanges: {
580-
builder.append('(');
581-
builder.join(',', pseudo_class.languages);
582-
builder.append(')');
583-
break;
630+
break;
631+
case CSS::Selector::SimpleSelector::Type::PseudoElement:
632+
{
633+
builder.appendff(" pseudo_element={}", simple_selector.pseudo_element().name());
584634
}
635+
break;
636+
case CSS::Selector::SimpleSelector::Type::Attribute:
637+
{
638+
auto const& attribute = simple_selector.attribute();
639+
dump_simple_selector_attribute(builder, attribute);
585640
}
586-
}
587-
588-
if (simple_selector.type == CSS::Selector::SimpleSelector::Type::PseudoElement) {
589-
builder.appendff(" pseudo_element={}", simple_selector.pseudo_element().name());
590-
}
591-
592-
if (simple_selector.type == CSS::Selector::SimpleSelector::Type::Attribute) {
593-
auto const& attribute = simple_selector.attribute();
594-
char const* attribute_match_type_description = "";
595-
596-
switch (attribute.match_type) {
597-
case CSS::Selector::SimpleSelector::Attribute::MatchType::HasAttribute:
598-
attribute_match_type_description = "HasAttribute";
599-
break;
600-
case CSS::Selector::SimpleSelector::Attribute::MatchType::ExactValueMatch:
601-
attribute_match_type_description = "ExactValueMatch";
602-
break;
603-
case CSS::Selector::SimpleSelector::Attribute::MatchType::ContainsWord:
604-
attribute_match_type_description = "ContainsWord";
605-
break;
606-
case CSS::Selector::SimpleSelector::Attribute::MatchType::ContainsString:
607-
attribute_match_type_description = "ContainsString";
608-
break;
609-
case CSS::Selector::SimpleSelector::Attribute::MatchType::StartsWithSegment:
610-
attribute_match_type_description = "StartsWithSegment";
611-
break;
612-
case CSS::Selector::SimpleSelector::Attribute::MatchType::StartsWithString:
613-
attribute_match_type_description = "StartsWithString";
614-
break;
615-
case CSS::Selector::SimpleSelector::Attribute::MatchType::EndsWithString:
616-
attribute_match_type_description = "EndsWithString";
617-
break;
641+
break;
642+
case CSS::Selector::SimpleSelector::Type::Invalid:
643+
{
644+
auto invalid = simple_selector.value.get<CSS::Selector::SimpleSelector::Invalid>();
645+
builder.append(" '"sv);
646+
for (auto const& component_value : invalid.component_values)
647+
builder.append(component_value.to_string());
648+
builder.append("'"sv);
618649
}
619-
620-
builder.appendff(" [{}, ", attribute_match_type_description);
621-
dump_qualified_name(builder, attribute.qualified_name);
622-
builder.appendff(", value='{}']", attribute.value);
623-
}
624-
625-
if (simple_selector.type == CSS::Selector::SimpleSelector::Type::Invalid) {
626-
auto invalid = simple_selector.value.get<CSS::Selector::SimpleSelector::Invalid>();
627-
builder.append(" '"sv);
628-
for (auto const& component_value : invalid.component_values)
629-
builder.append(component_value.to_string());
630-
builder.append("'"sv);
650+
break;
651+
default: break;
631652
}
632653

633654
if (i != relative_selector.simple_selectors.size() - 1)
@@ -637,6 +658,8 @@ void dump_selector(StringBuilder& builder, CSS::Selector const& selector, int in
637658
}
638659
}
639660

661+
662+
640663
void dump_rule(CSS::CSSRule const& rule)
641664
{
642665
StringBuilder builder;

0 commit comments

Comments
 (0)