瀏覽代碼

LibWeb: Hack the CSS parser to handle integer values (like z-index)

We were rejecting perfectly valid z-index values like '1000' since we
were passing all CSS values through the length parser and unit-less
lengths are not valid in this context.

It's yet another hack for the ad-hoc CSS parser (its days are numbered)
but this makes the top header links on google.com actually work. :^)
Andreas Kling 4 年之前
父節點
當前提交
194d7d3471
共有 2 個文件被更改,包括 15 次插入3 次删除
  1. 14 2
      Libraries/LibWeb/CSS/Parser/CSSParser.cpp
  2. 1 1
      Libraries/LibWeb/CSS/Parser/CSSParser.h

+ 14 - 2
Libraries/LibWeb/CSS/Parser/CSSParser.cpp

@@ -338,9 +338,21 @@ static CSS::Length parse_length(const CSS::ParsingContext& context, const String
     return CSS::Length(value.value(), type);
 }
 
-RefPtr<CSS::StyleValue> parse_css_value(const CSS::ParsingContext& context, const StringView& string)
+static bool takes_integer_value(CSS::PropertyID property_id)
+{
+    return property_id == CSS::PropertyID::ZIndex;
+}
+
+RefPtr<CSS::StyleValue> parse_css_value(const CSS::ParsingContext& context, const StringView& string, CSS::PropertyID property_id)
 {
     bool is_bad_length = false;
+
+    if (takes_integer_value(property_id)) {
+        auto integer = string.to_int();
+        if (integer.has_value())
+            return CSS::LengthStyleValue::create(CSS::Length::make_px(integer.value()));
+    }
+
     auto length = parse_length(context, string, is_bad_length);
     if (is_bad_length)
         return nullptr;
@@ -856,7 +868,7 @@ public:
         if (property_id == CSS::PropertyID::Invalid) {
             dbg() << "CSSParser: Unrecognized property '" << property_name << "'";
         }
-        auto value = parse_css_value(m_context, property_value);
+        auto value = parse_css_value(m_context, property_value, property_id);
         if (!value)
             return {};
         return CSS::StyleProperty { property_id, value.release_nonnull(), important };

+ 1 - 1
Libraries/LibWeb/CSS/Parser/CSSParser.h

@@ -47,7 +47,7 @@ namespace Web {
 
 RefPtr<CSS::StyleSheet> parse_css(const CSS::ParsingContext&, const StringView&);
 RefPtr<CSS::StyleDeclaration> parse_css_declaration(const CSS::ParsingContext&, const StringView&);
-RefPtr<CSS::StyleValue> parse_css_value(const CSS::ParsingContext&, const StringView&);
+RefPtr<CSS::StyleValue> parse_css_value(const CSS::ParsingContext&, const StringView&, CSS::PropertyID property_id = CSS::PropertyID::Invalid);
 Optional<CSS::Selector> parse_selector(const CSS::ParsingContext&, const StringView&);
 
 RefPtr<CSS::LengthStyleValue> parse_line_width(const CSS::ParsingContext&, const StringView&);