Sfoglia il codice sorgente

LibWeb: Don't crash when querying detached circle element properties

Tim Ledbetter 1 anno fa
parent
commit
3518f39b60

+ 1 - 0
Tests/LibWeb/Text/expected/SVG/svg-circle-detached.txt

@@ -0,0 +1 @@
+PASS (didn't crash)

+ 10 - 0
Tests/LibWeb/Text/input/SVG/svg-circle-detached.html

@@ -0,0 +1,10 @@
+<script src="../include.js"></script>
+<script>
+    test(() => {
+        const circleElement = document.createElementNS("http://www.w3.org/2000/svg", "circle");
+        const cx = circleElement.cx;
+        const cy = circleElement.cy;
+        const r = circleElement.r;
+        println("PASS (didn't crash)");
+    });
+</script>

+ 12 - 6
Userland/Libraries/LibWeb/SVG/SVGCircleElement.cpp

@@ -85,8 +85,10 @@ JS::NonnullGCPtr<SVGAnimatedLength> SVGCircleElement::cx() const
 {
     // FIXME: Create a proper animated value when animations are supported.
     auto make_length = [&] {
-        if (auto cx = computed_css_values()->length_percentage(CSS::PropertyID::Cx); cx.has_value())
-            return SVGLength::from_length_percentage(realm(), *cx);
+        if (auto const* style = computed_css_values(); style) {
+            if (auto cx = style->length_percentage(CSS::PropertyID::Cx); cx.has_value())
+                return SVGLength::from_length_percentage(realm(), *cx);
+        }
         return SVGLength::create(realm(), 0, 0.0f);
     };
     return SVGAnimatedLength::create(realm(), make_length(), make_length());
@@ -97,8 +99,10 @@ JS::NonnullGCPtr<SVGAnimatedLength> SVGCircleElement::cy() const
 {
     // FIXME: Create a proper animated value when animations are supported.
     auto make_length = [&] {
-        if (auto cy = computed_css_values()->length_percentage(CSS::PropertyID::Cy); cy.has_value())
-            return SVGLength::from_length_percentage(realm(), *cy);
+        if (auto const* style = computed_css_values(); style) {
+            if (auto cy = style->length_percentage(CSS::PropertyID::Cy); cy.has_value())
+                return SVGLength::from_length_percentage(realm(), *cy);
+        }
         return SVGLength::create(realm(), 0, 0.0f);
     };
     return SVGAnimatedLength::create(realm(), make_length(), make_length());
@@ -109,8 +113,10 @@ JS::NonnullGCPtr<SVGAnimatedLength> SVGCircleElement::r() const
 {
     // FIXME: Create a proper animated value when animations are supported.
     auto make_length = [&] {
-        if (auto r = computed_css_values()->length_percentage(CSS::PropertyID::R); r.has_value())
-            return SVGLength::from_length_percentage(realm(), *r);
+        if (auto const* style = computed_css_values(); style) {
+            if (auto r = computed_css_values()->length_percentage(CSS::PropertyID::R); r.has_value())
+                return SVGLength::from_length_percentage(realm(), *r);
+        }
         return SVGLength::create(realm(), 0, 0.0f);
     };
     return SVGAnimatedLength::create(realm(), make_length(), make_length());