瀏覽代碼

LibWeb: Don't crash when resolving grid properties of inline elements

Previously, attempting to get the computed value for a
grid-template-rows or grid-template-columns property would cause a
crash for inline elements.
Tim Ledbetter 9 月之前
父節點
當前提交
087fcb84cb

+ 0 - 0
Tests/LibWeb/Text/expected/css/getComputedStyle-no-paintable.txt → Tests/LibWeb/Text/expected/css/getComputedStyle-no-paintable-box.txt


+ 21 - 0
Tests/LibWeb/Text/input/css/getComputedStyle-no-paintable-box.html

@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<script src="../include.js"></script>
+<script>
+    test(() => {
+        const elementsToTest = [
+            "br",
+            "span",
+        ];
+        for (const elementName of elementsToTest) {
+            const element = document.createElement(elementName);
+            document.body.appendChild(element);
+            const style = getComputedStyle(element);
+            let values = [];
+            for (const propertyName of style) {
+                values.push(style[propertyName]);
+            }
+            element.remove();
+        }
+        println("PASS (didn't crash)");
+    });
+</script>

+ 0 - 15
Tests/LibWeb/Text/input/css/getComputedStyle-no-paintable.html

@@ -1,15 +0,0 @@
-<!DOCTYPE html>
-<script src="../include.js"></script>
-<script>
-    test(() => {
-        const noPaintableElement = document.createElement("br");
-        document.body.appendChild(noPaintableElement);
-        const style = getComputedStyle(noPaintableElement);
-        let values = [];
-        for (const propertyName of style) {
-            values.push(style[propertyName]);
-        }
-        noPaintableElement.remove();
-        println("PASS (didn't crash)");
-    });
-</script>

+ 2 - 2
Userland/Libraries/LibWeb/CSS/ResolvedCSSStyleDeclaration.cpp

@@ -523,14 +523,14 @@ RefPtr<CSSStyleValue const> ResolvedCSSStyleDeclaration::style_value_for_propert
         // For grid-template-columns and grid-template-rows the resolved value is the used value.
         // For grid-template-columns and grid-template-rows the resolved value is the used value.
         // https://www.w3.org/TR/css-grid-2/#resolved-track-list-standalone
         // https://www.w3.org/TR/css-grid-2/#resolved-track-list-standalone
         if (property_id == PropertyID::GridTemplateColumns) {
         if (property_id == PropertyID::GridTemplateColumns) {
-            if (layout_node.paintable()) {
+            if (layout_node.paintable() && layout_node.paintable()->is_paintable_box()) {
                 auto const& paintable_box = verify_cast<Painting::PaintableBox const>(*layout_node.paintable());
                 auto const& paintable_box = verify_cast<Painting::PaintableBox const>(*layout_node.paintable());
                 if (auto used_values_for_grid_template_columns = paintable_box.used_values_for_grid_template_columns()) {
                 if (auto used_values_for_grid_template_columns = paintable_box.used_values_for_grid_template_columns()) {
                     return used_values_for_grid_template_columns;
                     return used_values_for_grid_template_columns;
                 }
                 }
             }
             }
         } else if (property_id == PropertyID::GridTemplateRows) {
         } else if (property_id == PropertyID::GridTemplateRows) {
-            if (layout_node.paintable()) {
+            if (layout_node.paintable() && layout_node.paintable()->is_paintable_box()) {
                 auto const& paintable_box = verify_cast<Painting::PaintableBox const>(*layout_node.paintable());
                 auto const& paintable_box = verify_cast<Painting::PaintableBox const>(*layout_node.paintable());
                 if (auto used_values_for_grid_template_rows = paintable_box.used_values_for_grid_template_rows()) {
                 if (auto used_values_for_grid_template_rows = paintable_box.used_values_for_grid_template_rows()) {
                     return used_values_for_grid_template_rows;
                     return used_values_for_grid_template_rows;