From dff52f7a040c2271ed93307f32a545bd662f9dbc Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Wed, 13 Aug 2014 16:18:39 +0200 Subject: [PATCH] css: Match state in siblings properly Previously, we always returned the state flags of the original widget and did not consider the siblings' pseudoclasses. Testcase is attached. --- gtk/gtkcssmatcher.c | 8 +++- testsuite/reftests/Makefile.am | 3 ++ testsuite/reftests/sibling-pseudoclasses.css | 3 ++ .../reftests/sibling-pseudoclasses.ref.ui | 46 +++++++++++++++++++ testsuite/reftests/sibling-pseudoclasses.ui | 43 +++++++++++++++++ 5 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 testsuite/reftests/sibling-pseudoclasses.css create mode 100644 testsuite/reftests/sibling-pseudoclasses.ref.ui create mode 100644 testsuite/reftests/sibling-pseudoclasses.ui diff --git a/gtk/gtkcssmatcher.c b/gtk/gtkcssmatcher.c index d169c274cf..b734bfa3ea 100644 --- a/gtk/gtkcssmatcher.c +++ b/gtk/gtkcssmatcher.c @@ -56,7 +56,13 @@ gtk_css_matcher_widget_path_get_previous (GtkCssMatcher *matcher, static GtkStateFlags gtk_css_matcher_widget_path_get_state (const GtkCssMatcher *matcher) { - return gtk_widget_path_iter_get_state (matcher->path.path, matcher->path.index); + const GtkWidgetPath *siblings; + + siblings = gtk_widget_path_iter_get_siblings (matcher->path.path, matcher->path.index); + if (siblings && matcher->path.sibling_index != gtk_widget_path_iter_get_sibling_index (matcher->path.path, matcher->path.index)) + return gtk_widget_path_iter_get_state (siblings, matcher->path.sibling_index); + else + return gtk_widget_path_iter_get_state (matcher->path.path, matcher->path.index); } static gboolean diff --git a/testsuite/reftests/Makefile.am b/testsuite/reftests/Makefile.am index 8501c34ab6..9e04237682 100644 --- a/testsuite/reftests/Makefile.am +++ b/testsuite/reftests/Makefile.am @@ -334,6 +334,9 @@ testdata = \ shorthand-entry-border.css \ shorthand-entry-border.ref.ui \ shorthand-entry-border.ui \ + sibling-pseudoclasses.css \ + sibling-pseudoclasses.ref.ui \ + sibling-pseudoclasses.ui \ simple.ref.ui \ simple.ui \ sizegroups-basics.css \ diff --git a/testsuite/reftests/sibling-pseudoclasses.css b/testsuite/reftests/sibling-pseudoclasses.css new file mode 100644 index 0000000000..52faf13e32 --- /dev/null +++ b/testsuite/reftests/sibling-pseudoclasses.css @@ -0,0 +1,3 @@ +:active + * { + color: tomato; +} diff --git a/testsuite/reftests/sibling-pseudoclasses.ref.ui b/testsuite/reftests/sibling-pseudoclasses.ref.ui new file mode 100644 index 0000000000..ef39a84850 --- /dev/null +++ b/testsuite/reftests/sibling-pseudoclasses.ref.ui @@ -0,0 +1,46 @@ + + + + + + False + + + True + False + vertical + + + True + True + True + True + + + + + + False + True + 0 + + + + + True + False + I'm tomato. + + + + + + False + True + 1 + + + + + + diff --git a/testsuite/reftests/sibling-pseudoclasses.ui b/testsuite/reftests/sibling-pseudoclasses.ui new file mode 100644 index 0000000000..4c83b2425c --- /dev/null +++ b/testsuite/reftests/sibling-pseudoclasses.ui @@ -0,0 +1,43 @@ + + + + + + False + + + True + False + vertical + + + True + True + True + True + + + + + + False + True + 0 + + + + + True + False + I'm tomato. + + + False + True + 1 + + + + + +