From 0cda3ba3e8fb70d3b88b2b810ee7b988ef5f631d Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sat, 13 Feb 2016 04:12:45 +0100 Subject: [PATCH] calc: Allow subterms with '(' ')' bracketing Some more tests included. --- gtk/gtkcsscalcvalue.c | 19 +++++++++++++++++++ testsuite/css/parser/calc-errors.css | 16 ++++++++++++++++ testsuite/css/parser/calc-errors.errors | 4 ++++ testsuite/css/parser/calc.css | 16 ++++++++++++++++ testsuite/css/parser/calc.ref.css | 16 ++++++++++++++++ 5 files changed, 71 insertions(+) diff --git a/gtk/gtkcsscalcvalue.c b/gtk/gtkcsscalcvalue.c index 2bcb5455fc..e10e790b23 100644 --- a/gtk/gtkcsscalcvalue.c +++ b/gtk/gtkcsscalcvalue.c @@ -316,6 +316,9 @@ gtk_css_calc_value_new_sum (GtkCssValue *value1, return gtk_css_value_new_from_array (array); } +GtkCssValue * gtk_css_calc_value_parse_sum (GtkCssParser *parser, + GtkCssNumberParseFlags flags); + GtkCssValue * gtk_css_calc_value_parse_value (GtkCssParser *parser, GtkCssNumberParseFlags flags) @@ -326,6 +329,22 @@ gtk_css_calc_value_parse_value (GtkCssParser *parser, return NULL; } + if (_gtk_css_parser_try (parser, "(", TRUE)) + { + GtkCssValue *result = gtk_css_calc_value_parse_sum (parser, flags); + if (result == NULL) + return NULL; + + if (!_gtk_css_parser_try (parser, ")", TRUE)) + { + _gtk_css_parser_error (parser, "Missing closing ')' in calc() subterm"); + _gtk_css_value_unref (result); + return NULL; + } + + return result; + } + return _gtk_css_number_value_parse (parser, flags); } diff --git a/testsuite/css/parser/calc-errors.css b/testsuite/css/parser/calc-errors.css index a109e62400..b1464c30cb 100644 --- a/testsuite/css/parser/calc-errors.css +++ b/testsuite/css/parser/calc-errors.css @@ -57,3 +57,19 @@ n { o { margin-left: calc(1px / error); } + +p { + margin-left: calc((((((1px)))); +} + +q { + margin-left: calc((((((1px))))))))); +} + +r { + margin-left: calc(1px + (1)); +} + +s { + margin-left: calc(1px + (error)); +} diff --git a/testsuite/css/parser/calc-errors.errors b/testsuite/css/parser/calc-errors.errors index 891991dd35..cb8139b2a7 100644 --- a/testsuite/css/parser/calc-errors.errors +++ b/testsuite/css/parser/calc-errors.errors @@ -13,3 +13,7 @@ calc-errors.css:46: error: GTK_CSS_PROVIDER_ERROR_SYNTAX calc-errors.css:50: error: GTK_CSS_PROVIDER_ERROR_SYNTAX calc-errors.css:54: error: GTK_CSS_PROVIDER_ERROR_SYNTAX calc-errors.css:58: error: GTK_CSS_PROVIDER_ERROR_SYNTAX +calc-errors.css:62: error: GTK_CSS_PROVIDER_ERROR_SYNTAX +calc-errors.css:66: error: GTK_CSS_PROVIDER_ERROR_SYNTAX +calc-errors.css:70: error: GTK_CSS_PROVIDER_ERROR_SYNTAX +calc-errors.css:74: error: GTK_CSS_PROVIDER_ERROR_SYNTAX diff --git a/testsuite/css/parser/calc.css b/testsuite/css/parser/calc.css index 5406818e47..cc511fa7de 100644 --- a/testsuite/css/parser/calc.css +++ b/testsuite/css/parser/calc.css @@ -21,3 +21,19 @@ e { f { background-size: calc(2 * 3px + 4px * 5 - 6px / 3); } + +g { + background-size: calc((((((1px)))))); +} + +h { + background-size: calc(3 * ((4px + ((4 * (6px + 3em)) / 3)) + 5em)); +} + +i { + border-top-left-radius: calc(1px * (3 + 2)) calc(1px / ( 3 / (2 * 1.5))); +} + +j { + border-bottom-right-radius: calc((1 + 1 + (1 + 1) + 1) * 1px) calc((1 / 1) * 1px); +} diff --git a/testsuite/css/parser/calc.ref.css b/testsuite/css/parser/calc.ref.css index f0c2bbec07..cc2ca59d82 100644 --- a/testsuite/css/parser/calc.ref.css +++ b/testsuite/css/parser/calc.ref.css @@ -21,3 +21,19 @@ e { f { background-size: 24px; } + +g { + background-size: 1px; +} + +h { + background-size: calc(27em + 36px); +} + +i { + border-top-left-radius: 5px 1px; +} + +j { + border-bottom-right-radius: 5px 1px; +}