1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 15:57:45 +00:00

LibWeb: Parse the -webkit-progress-bar/value pseudo elements

These will be needed for styling progress bars, sadly this can
only be done with these non-standard selectors. These are, hovever,
in use on real sites such as https://rpcs3.net/compatibility.
This commit is contained in:
MacDue 2022-07-22 15:58:52 +01:00 committed by Andreas Kling
parent 218e6d2f5e
commit b5febe538c
4 changed files with 21 additions and 3 deletions

View file

@ -458,10 +458,12 @@ Parser::ParseErrorOr<Selector::SimpleSelector> Parser::parse_pseudo_simple_selec
} }
auto pseudo_name = name_token.token().ident(); auto pseudo_name = name_token.token().ident();
if (has_ignored_vendor_prefix(pseudo_name)) auto pseudo_element = pseudo_element_from_string(pseudo_name);
// Note: We allow the "ignored" -webkit prefix here for -webkit-progress-bar/-webkit-progress-bar
if (!pseudo_element.has_value() && has_ignored_vendor_prefix(pseudo_name))
return ParseError::IncludesIgnoredVendorPrefix; return ParseError::IncludesIgnoredVendorPrefix;
auto pseudo_element = pseudo_element_from_string(pseudo_name);
if (!pseudo_element.has_value()) { if (!pseudo_element.has_value()) {
dbgln_if(CSS_PARSER_DEBUG, "Unrecognized pseudo-element: '::{}'", pseudo_name); dbgln_if(CSS_PARSER_DEBUG, "Unrecognized pseudo-element: '::{}'", pseudo_name);
return ParseError::SyntaxError; return ParseError::SyntaxError;

View file

@ -352,6 +352,10 @@ Optional<Selector::PseudoElement> pseudo_element_from_string(StringView name)
return Selector::PseudoElement::FirstLine; return Selector::PseudoElement::FirstLine;
} else if (name.equals_ignoring_case("marker"sv)) { } else if (name.equals_ignoring_case("marker"sv)) {
return Selector::PseudoElement::Marker; return Selector::PseudoElement::Marker;
} else if (name.equals_ignoring_case("-webkit-progress-bar"sv)) {
return Selector::PseudoElement::ProgressBar;
} else if (name.equals_ignoring_case("-webkit-progress-value"sv)) {
return Selector::PseudoElement::ProgressValue;
} }
return {}; return {};
} }

View file

@ -26,8 +26,10 @@ public:
FirstLine, FirstLine,
FirstLetter, FirstLetter,
Marker, Marker,
ProgressValue,
ProgressBar
}; };
static auto constexpr PseudoElementCount = to_underlying(PseudoElement::Marker) + 1; static auto constexpr PseudoElementCount = to_underlying(PseudoElement::ProgressBar) + 1;
struct SimpleSelector { struct SimpleSelector {
enum class Type { enum class Type {
@ -204,6 +206,10 @@ constexpr StringView pseudo_element_name(Selector::PseudoElement pseudo_element)
return "first-letter"sv; return "first-letter"sv;
case Selector::PseudoElement::Marker: case Selector::PseudoElement::Marker:
return "marker"sv; return "marker"sv;
case Selector::PseudoElement::ProgressBar:
return "-webkit-progress-bar"sv;
case Selector::PseudoElement::ProgressValue:
return "-webkit-progress-value"sv;
} }
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
} }

View file

@ -492,6 +492,12 @@ void dump_selector(StringBuilder& builder, CSS::Selector const& selector)
case CSS::Selector::PseudoElement::Marker: case CSS::Selector::PseudoElement::Marker:
pseudo_element_description = "marker"; pseudo_element_description = "marker";
break; break;
case CSS::Selector::PseudoElement::ProgressBar:
pseudo_element_description = "-webkit-progress-bar";
break;
case CSS::Selector::PseudoElement::ProgressValue:
pseudo_element_description = "-webkit-progress-value";
break;
} }
builder.appendff(" pseudo_element={}", pseudo_element_description); builder.appendff(" pseudo_element={}", pseudo_element_description);