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,15 +220,16 @@ impl StateDependencySet {
let mut cur = selector;
let mut combinator: Option<Combinator> = 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 {

View file

@ -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;
}