From d89816bb5fa90421a4dea49ff6387f635ce7b389 Mon Sep 17 00:00:00 2001 From: Bobby Holley Date: Wed, 4 Nov 2015 18:15:30 -0800 Subject: [PATCH] Consider all the pseudo-classes in a given compound selector when computing restyle hints, not just the rightmost one. For some reason when I wrote this code I mixed up the rules for pseudo-elements (rightmost, maximum of one) with those of pseudo-classes (which have no such restriction). This caused a correctness issue which can be demonstrated with the associated reftest modification. --- components/style/restyle_hints.rs | 19 ++++++++++--------- .../mozilla/tests/css/restyle_hints_state.css | 8 ++++++-- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/components/style/restyle_hints.rs b/components/style/restyle_hints.rs index acb521b0f10..fe143c3e315 100644 --- a/components/style/restyle_hints.rs +++ b/components/style/restyle_hints.rs @@ -220,15 +220,16 @@ impl StateDependencySet { let mut cur = selector; let mut combinator: Option = None; loop { - if let Some(rightmost) = cur.simple_selectors.last() { - let state_dep = selector_to_state(rightmost); - if !state_dep.is_empty() { - self.deps.push(StateDependency { - selector: cur.clone(), - combinator: combinator, - state: state_dep, - }); - } + let mut deps = ElementState::empty(); + for s in &cur.simple_selectors { + deps.insert(selector_to_state(s)); + } + if !deps.is_empty() { + self.deps.push(StateDependency { + selector: cur.clone(), + combinator: combinator, + state: deps, + }); } cur = match cur.next { diff --git a/tests/wpt/mozilla/tests/css/restyle_hints_state.css b/tests/wpt/mozilla/tests/css/restyle_hints_state.css index 673ac25d572..6a152778e42 100644 --- a/tests/wpt/mozilla/tests/css/restyle_hints_state.css +++ b/tests/wpt/mozilla/tests/css/restyle_hints_state.css @@ -19,11 +19,15 @@ fieldset:enabled div { fieldset:enabled > div { background-color: yellow; } -fieldset:enabled ~ div { + +/* Add an unnecessary :first-child to make sure that restyle hints see + * non-rightmost pseudo-selectors. + * */ +fieldset:enabled:first-child ~ div { color: pink; background-color: purple; } -fieldset:enabled + div { +fieldset:enabled:first-child + div { color: brown; background-color: orange; }