Bug 1324618 part 1. Fix dynamic restyling that changes whether our element may generate a pseudo to clear out stale pseudo styles. r?emilio draft
authorBoris Zbarsky <bzbarsky@mit.edu>
Mon, 26 Jun 2017 15:50:30 -0700
changeset 600463 c949a723c9f37f606483329a9c0d2ed26f8a99b8
parent 600121 2426999cb657f8f0729e135eb3697607d03990fd
child 600464 fb5c14c11b4619c4f50cd5c8ca469bc387f895e3
push id65775
push userbzbarsky@mozilla.com
push dateTue, 27 Jun 2017 01:04:33 +0000
reviewersemilio
bugs1324618
milestone56.0a1
Bug 1324618 part 1. Fix dynamic restyling that changes whether our element may generate a pseudo to clear out stale pseudo styles. r?emilio MozReview-Commit-ID: CsZtF3y6gXo
servo/components/style/matching.rs
--- a/servo/components/style/matching.rs
+++ b/servo/components/style/matching.rs
@@ -1192,36 +1192,32 @@ pub trait MatchMethods : TElement {
             RuleInclusion::DefaultOnly
         } else {
             RuleInclusion::All
         };
 
         // Compute rule nodes for eagerly-cascaded pseudo-elements.
         let mut matches_different_pseudos = false;
         SelectorImpl::each_eagerly_cascaded_pseudo_element(|pseudo| {
-            let bloom_filter = context.thread_local.bloom_filter.filter();
-
-            let mut matching_context =
-                MatchingContext::new_for_visited(MatchingMode::ForStatelessPseudoElement,
-                                                 Some(bloom_filter),
-                                                 visited_handling,
-                                                 context.shared.quirks_mode);
-
             // For pseudo-elements, we only try to match visited rules if there
             // are also unvisited rules.  (This matches Gecko's behavior.)
             if visited_handling == VisitedHandlingMode::RelevantLinkVisited &&
                !context.cascade_inputs().pseudos.has(&pseudo) {
                 return
             }
 
-            if !self.may_generate_pseudo(&pseudo, data.styles.primary()) {
-                return;
-            }
+            if self.may_generate_pseudo(&pseudo, data.styles.primary()) {
+                let bloom_filter = context.thread_local.bloom_filter.filter();
 
-            {
+                let mut matching_context =
+                    MatchingContext::new_for_visited(MatchingMode::ForStatelessPseudoElement,
+                                                     Some(bloom_filter),
+                                                     visited_handling,
+                                                     context.shared.quirks_mode);
+
                 let map = &mut context.thread_local.selector_flags;
                 let mut set_selector_flags = |element: &Self, flags: ElementSelectorFlags| {
                     self.apply_selector_flags(map, element, flags);
                 };
 
                 debug_assert!(applicable_declarations.is_empty());
                 // NB: We handle animation rules for ::before and ::after when
                 // traversing them.