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.
This commit is contained in:
Bobby Holley 2015-11-04 18:15:30 -08:00
parent 77c253fd43
commit d89816bb5f
2 changed files with 16 additions and 11 deletions

View file

@ -220,16 +220,17 @@ impl StateDependencySet {
let mut cur = selector; let mut cur = selector;
let mut combinator: Option<Combinator> = None; let mut combinator: Option<Combinator> = None;
loop { loop {
if let Some(rightmost) = cur.simple_selectors.last() { let mut deps = ElementState::empty();
let state_dep = selector_to_state(rightmost); for s in &cur.simple_selectors {
if !state_dep.is_empty() { deps.insert(selector_to_state(s));
}
if !deps.is_empty() {
self.deps.push(StateDependency { self.deps.push(StateDependency {
selector: cur.clone(), selector: cur.clone(),
combinator: combinator, combinator: combinator,
state: state_dep, state: deps,
}); });
} }
}
cur = match cur.next { cur = match cur.next {
Some((ref sel, comb)) => { Some((ref sel, comb)) => {

View file

@ -19,11 +19,15 @@ fieldset:enabled div {
fieldset:enabled > div { fieldset:enabled > div {
background-color: yellow; 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; color: pink;
background-color: purple; background-color: purple;
} }
fieldset:enabled + div { fieldset:enabled:first-child + div {
color: brown; color: brown;
background-color: orange; background-color: orange;
} }