css: Don't throw warnings on broken URL in image css
authorBenjamin Otte <otte@redhat.com>
Tue, 26 Oct 2021 15:02:56 +0000 (17:02 +0200)
committerBenjamin Otte <otte.benjamin@googlemail.com>
Tue, 26 Oct 2021 23:44:38 +0000 (23:44 +0000)
If a URL can't be loaded, we might end up with a NULL file. Handle that
case properly by creating an invalid image instead and don't crash or
complain to stderr when files are NULL.

This was broken since 0886ade182f1a958024202d5c20248d57fcdb053

A new reftest has been included. We need a reftest instead of a
CSS parser test, because the error only becomes visible when
compute()ing the actual image.

Fixes #4373

(cherry picked from commit ac8c4245b2fb2f1fe8e660c4ad2541efb39cf3d6)

gtk/gtkcssimageurl.c
testsuite/reftests/css-image-broken-url.css [new file with mode: 0644]
testsuite/reftests/css-image-broken-url.ref.ui [new file with mode: 0644]
testsuite/reftests/css-image-broken-url.ui [new file with mode: 0644]
testsuite/reftests/meson.build

index d7271eda188c6d71282413ebb9010e37a94ff63c..f201dcb841e1483f8f8bb2aec8201b6a3e062916 100644 (file)
@@ -42,6 +42,12 @@ gtk_css_image_url_load_image (GtkCssImageUrl  *url,
   if (url->loaded_image)
     return url->loaded_image;
 
+  if (url->file == NULL)
+    {
+      url->loaded_image = gtk_css_image_invalid_new ();
+      return url->loaded_image;
+    }
+
   /* We special case resources here so we can use gdk_texture_new_from_resource. */
   if (g_file_has_uri_scheme (url->file, "resource"))
     {
@@ -148,6 +154,10 @@ gtk_css_image_url_equal (GtkCssImage *image1,
 {
   GtkCssImageUrl *url1 = GTK_CSS_IMAGE_URL (image1);
   GtkCssImageUrl *url2 = GTK_CSS_IMAGE_URL (image2);
+  
+  /* FIXME: We don't save data: urls, so we can't compare them here */
+  if (url1->file == NULL || url2->file == NULL)
+    return FALSE;
 
   return g_file_equal (url1->file, url2->file);
 }
diff --git a/testsuite/reftests/css-image-broken-url.css b/testsuite/reftests/css-image-broken-url.css
new file mode 100644 (file)
index 0000000..d7035a5
--- /dev/null
@@ -0,0 +1,4 @@
+#test {
+  /* The url should fail as early as possible */
+  background-image: url('data::::');
+}
diff --git a/testsuite/reftests/css-image-broken-url.ref.ui b/testsuite/reftests/css-image-broken-url.ref.ui
new file mode 100644 (file)
index 0000000..3c0e77e
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <object class="GtkWindow" id="window1">
+    <property name="width_request">10</property>
+    <property name="height_request">10</property>
+    <property name="decorated">0</property>
+  </object>
+</interface>
diff --git a/testsuite/reftests/css-image-broken-url.ui b/testsuite/reftests/css-image-broken-url.ui
new file mode 100644 (file)
index 0000000..286c35f
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <object class="GtkWindow" id="window1">
+    <property name="width_request">10</property>
+    <property name="height_request">10</property>
+    <property name="decorated">0</property>
+    <property name="name">test</property>
+  </object>
+</interface>
index c166233ad97680b5db111766c90d26063805be30..0d078fd9ddc9f24e578ddcbda09be9f54c1eb0e0 100644 (file)
@@ -191,6 +191,9 @@ testdata = [
   'css-image-aspect-ratio.css',
   'css-image-aspect-ratio.ui',
   'css-image-aspect-ratio.ref.ui',
+  'css-image-broken-url.css',
+  'css-image-broken-url.ref.ui',
+  'css-image-broken-url.ui',
   'css-image-color-aspect-ratio.css',
   'css-image-color-aspect-ratio.ui',
   'css-image-color-aspect-ratio.ref.ui',