From 4fb1e33000041b3befba0d5b200f733028ccf72b Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sat, 14 Feb 2009 08:14:10 +0000 Subject: Discard selectors that contain pseudo elements in non-terminal simple selectors. More test data for selectors with pseudo elements svn path=/trunk/libcss/; revision=6473 --- src/stylesheet.c | 12 +++++++++-- test/data/parse/selectors.dat | 49 ++++++++++++++++++++++++++++++++++++++++++ test/data/parse2/INDEX | 1 + test/data/parse2/selectors.dat | 24 +++++++++++++++++++++ 4 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 test/data/parse2/selectors.dat diff --git a/src/stylesheet.c b/src/stylesheet.c index da76915..40230e1 100644 --- a/src/stylesheet.c +++ b/src/stylesheet.c @@ -557,18 +557,26 @@ css_error css_stylesheet_selector_append_specific(css_stylesheet *sheet, * For example, given A + B, the combinator field of B would point at A, * with a combinator type of CSS_COMBINATOR_SIBLING. Thus, given B, we can * find its combinator. It is not possible to find B given A. - * - * \todo Check that this (backwards) representation plays well with CSSOM. */ css_error css_stylesheet_selector_combine(css_stylesheet *sheet, css_combinator type, css_selector *a, css_selector *b) { + const css_selector_detail *det; + if (sheet == NULL || a == NULL || b == NULL) return CSS_BADPARM; /* Ensure that there is no existing combinator on B */ assert(b->combinator == NULL); + /* A must not contain a pseudo element */ + for (det = &a->data; det != NULL; ) { + if (det->type == CSS_SELECTOR_PSEUDO_ELEMENT) + return CSS_INVALID; + + det = (det->next != 0) ? det + 1 : NULL; + } + b->combinator = a; b->data.comb = type; diff --git a/test/data/parse/selectors.dat b/test/data/parse/selectors.dat index 5c69f27..e58d8ac 100644 --- a/test/data/parse/selectors.dat +++ b/test/data/parse/selectors.dat @@ -77,6 +77,55 @@ E:lang(c) {} | 1 E:lang(c) #reset +#data +E:left {} +#errors +#expected +| 1 E:left +#reset + +#data +E:right {} +#errors +#expected +| 1 E:right +#reset + +#data +E:first {} +#errors +#expected +| 1 E:first +#reset + +#data +E:first-line {} +#errors +#expected +| 1 E:first-line +#reset + +#data +E:first-letter {} +#errors +#expected +| 1 E:first-letter +#reset + +#data +E:before {} +#errors +#expected +| 1 E:before +#reset + +#data +E:after {} +#errors +#expected +| 1 E:after +#reset + #data E + F {} #errors diff --git a/test/data/parse2/INDEX b/test/data/parse2/INDEX index 9b2c5a5..0137fa4 100644 --- a/test/data/parse2/INDEX +++ b/test/data/parse2/INDEX @@ -5,6 +5,7 @@ tests1.dat Basic tests eof.dat Unexpected EOF tests comments.dat Comment tests +selectors.dat Invalid selector tests illegal-values.dat Illegal value tests malformed-declarations.dat Malformed declaration tests unknown-properties.dat Unknown property tests diff --git a/test/data/parse2/selectors.dat b/test/data/parse2/selectors.dat new file mode 100644 index 0000000..ad66101 --- /dev/null +++ b/test/data/parse2/selectors.dat @@ -0,0 +1,24 @@ +## Unknown combinator + +#data +E & F {} +#errors +#expected +#reset + +## Unknown pseudo + +#data +E:foobar {} +#errors +#expected +#reset + +## Pseudo element in non-terminal simple selector + +#data +E:first-letter > B {} +#errors +#expected +#reset + -- cgit v1.2.3