summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2009-02-14 08:14:10 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2009-02-14 08:14:10 +0000
commit4fb1e33000041b3befba0d5b200f733028ccf72b (patch)
treec654401a1381dfd8351b624fdb64b9ab7d98b06b
parentc4415a128f7651f2f7358401af75cfc1959c2413 (diff)
downloadlibcss-4fb1e33000041b3befba0d5b200f733028ccf72b.tar.gz
libcss-4fb1e33000041b3befba0d5b200f733028ccf72b.tar.bz2
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
-rw-r--r--src/stylesheet.c12
-rw-r--r--test/data/parse/selectors.dat49
-rw-r--r--test/data/parse2/INDEX1
-rw-r--r--test/data/parse2/selectors.dat24
4 files changed, 84 insertions, 2 deletions
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
@@ -78,6 +78,55 @@ 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
#expected
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
+