[gtk+] cssimageradial: Only allow at "<position>" after other props



commit 0c126012083e55532e1da961edc4fad3303186f3
Author: Benjamin Otte <otte redhat com>
Date:   Fri Feb 5 19:01:48 2016 +0100

    cssimageradial: Only allow at "<position>" after other props
    
    Don't allow syntax like
      at top left circle
    but follow the spec about requiring the at <position> right before the
    comma.
    
    This is porbably because
      circle at 10px 10px
    could be interpreted as
      circle 10px at 10px
    with the now disallowed syntax, too.
    
    Test included.

 gtk/gtkcssimageradial.c                       |   36 ++++++++++++++-----------
 testsuite/css/parser/Makefile.am              |    3 ++
 testsuite/css/parser/radial-positions.css     |    9 ++++++
 testsuite/css/parser/radial-positions.errors  |    3 ++
 4 files changed, 35 insertions(+), 16 deletions(-)
---
diff --git a/gtk/gtkcssimageradial.c b/gtk/gtkcssimageradial.c
index 3a3b343..cb60d39 100644
--- a/gtk/gtkcssimageradial.c
+++ b/gtk/gtkcssimageradial.c
@@ -234,7 +234,6 @@ gtk_css_image_radial_parse (GtkCssImage  *image,
   GtkCssImageRadial *radial = GTK_CSS_IMAGE_RADIAL (image);
   gboolean has_shape = FALSE;
   gboolean has_size = FALSE;
-  gboolean has_position = FALSE;
   gboolean found_one = FALSE;
   guint i;
   static struct {
@@ -269,13 +268,6 @@ gtk_css_image_radial_parse (GtkCssImage  *image,
         radial->circle = FALSE;
         found_one = has_shape = TRUE;
       }
-    else if (!has_position && _gtk_css_parser_try (parser, "at", TRUE))
-      {
-        radial->position = _gtk_css_position_value_parse (parser);
-        if (!radial->position)
-          return FALSE;
-        found_one = has_position = TRUE;
-      }
     else if (!has_size)
       {
         for (i = 0; i < G_N_ELEMENTS (names); i++)
@@ -298,18 +290,30 @@ gtk_css_image_radial_parse (GtkCssImage  *image,
           }
       }
 
-  } while (found_one && !(has_shape && has_size && has_position));
+  } while (found_one && !(has_shape && has_size));
 
-  if ((has_shape || has_size || has_position) &&
-      !_gtk_css_parser_try (parser, ",", TRUE))
+  if (_gtk_css_parser_try (parser, "at", TRUE))
     {
-      _gtk_css_parser_error (parser, "Expected a comma here");
-      return FALSE;
+      radial->position = _gtk_css_position_value_parse (parser);
+      if (!radial->position)
+        return FALSE;
+      if (!_gtk_css_parser_try (parser, ",", TRUE))
+        {
+          _gtk_css_parser_error (parser, "Expected a comma here");
+          return FALSE;
+        }
     }
-
-  if (!has_position)
+  else
     {
-      radial->position = _gtk_css_position_value_new (_gtk_css_number_value_new (50, GTK_CSS_PERCENT), 
_gtk_css_number_value_new (50, GTK_CSS_PERCENT));
+      radial->position = _gtk_css_position_value_new (_gtk_css_number_value_new (50, GTK_CSS_PERCENT),
+                                                      _gtk_css_number_value_new (50, GTK_CSS_PERCENT));
+
+      if ((has_shape || has_size) &&
+          !_gtk_css_parser_try (parser, ",", TRUE))
+        {
+          _gtk_css_parser_error (parser, "Expected a comma here");
+          return FALSE;
+        }
     }
 
   if (!has_size)
diff --git a/testsuite/css/parser/Makefile.am b/testsuite/css/parser/Makefile.am
index 6c5a6d9..a90b869 100644
--- a/testsuite/css/parser/Makefile.am
+++ b/testsuite/css/parser/Makefile.am
@@ -410,6 +410,9 @@ test_data = \
        radial-background-position-error.css \
        radial-background-position-error.errors \
        radial-background-position-error.ref.css \
+       radial-positions.css \
+       radial-positions.errors \
+       radial-positions.ref.css \
        selector.css \
        selector.ref.css \
        shadow.css \
diff --git a/testsuite/css/parser/radial-positions.css b/testsuite/css/parser/radial-positions.css
new file mode 100644
index 0000000..4a4adc8
--- /dev/null
+++ b/testsuite/css/parser/radial-positions.css
@@ -0,0 +1,9 @@
+a {
+  background-image: radial-gradient(at left circle, red, blue);
+}
+b {
+  background-image: radial-gradient(10px at left circle, red, blue);
+}
+c {
+  background-image: radial-gradient(at 10px 10px circle, red, blue);
+}
diff --git a/testsuite/css/parser/radial-positions.errors b/testsuite/css/parser/radial-positions.errors
new file mode 100644
index 0000000..92c2e07
--- /dev/null
+++ b/testsuite/css/parser/radial-positions.errors
@@ -0,0 +1,3 @@
+radial-positions.css:2: error: GTK_CSS_PROVIDER_ERROR_SYNTAX
+radial-positions.css:5: error: GTK_CSS_PROVIDER_ERROR_SYNTAX
+radial-positions.css:8: error: GTK_CSS_PROVIDER_ERROR_SYNTAX
diff --git a/testsuite/css/parser/radial-positions.ref.css b/testsuite/css/parser/radial-positions.ref.css
new file mode 100644
index 0000000..e69de29


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]