From caf5d52435f6801c385fadbed684c53e45410118 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 20 Aug 2017 02:14:08 -0500 Subject: [PATCH] servo: Merge #18158 - style: Skip state pseudo-classes when finding a pseudo-element (from emilio:pseudo-crash); r=heycam Bug: 1391577 Reviewed-by: heycam MozReview-Commit-ID: 1ICBijtcf2b Source-Repo: https://github.com/servo/servo Source-Revision: 4f3fb904ae6863aa86bb3c8b7abee5533478af13 --HG-- extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : 7158d74b7fcc082a2086e639df09b0bf83175977 --- .../style/invalidation/element/invalidator.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/servo/components/style/invalidation/element/invalidator.rs b/servo/components/style/invalidation/element/invalidator.rs index 44f6b8da3ebb..234a627dd414 100644 --- a/servo/components/style/invalidation/element/invalidator.rs +++ b/servo/components/style/invalidation/element/invalidator.rs @@ -595,14 +595,27 @@ impl<'a, 'b: 'a, E> TreeStyleInvalidator<'a, 'b, E> matched = true; if matches!(next_combinator, Combinator::PseudoElement) { + // This will usually be the very next component, except for + // the fact that we store compound selectors the other way + // around, so there could also be state pseudo-classes. let pseudo_selector = invalidation.selector .iter_raw_parse_order_from(next_combinator_offset - 1) + .skip_while(|c| matches!(**c, Component::NonTSPseudoClass(..))) .next() .unwrap(); + let pseudo = match *pseudo_selector { Component::PseudoElement(ref pseudo) => pseudo, - _ => unreachable!("Someone seriously messed up selector parsing"), + _ => { + unreachable!( + "Someone seriously messed up selector parsing: \ + {:?} at offset {:?}: {:?}", + invalidation.selector, + next_combinator_offset, + pseudo_selector, + ) + } }; // FIXME(emilio): This is not ideal, and could not be