style: Track the visited-handling-mode on the MatchingContext.

Instead of on the stack.

This fixes bugs where we're not passing the value around correctly, like from
::-moz-any.

This is a fix for https://bugzilla.mozilla.org/show_bug.cgi?id=1431539.
This commit is contained in:
Emilio Cobos Álvarez 2018-01-19 13:19:16 +01:00
parent e4f08ee2bb
commit 8e25c9e674
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C
8 changed files with 50 additions and 52 deletions

View file

@ -105,8 +105,6 @@ where
pub bloom_filter: Option<&'a BloomFilter>,
/// An optional cache to speed up nth-index-like selectors.
pub nth_index_cache: Option<&'a mut NthIndexCache>,
/// Input that controls how matching for links is handled.
pub visited_handling: VisitedHandlingMode,
/// The element which is going to match :scope pseudo-class. It can be
/// either one :scope element, or the scoping element.
///
@ -120,10 +118,13 @@ where
/// See https://drafts.csswg.org/selectors-4/#scope-pseudo
pub scope_element: Option<OpaqueElement>,
/// Controls how matching for links is handled.
visited_handling: VisitedHandlingMode,
/// The current nesting level of selectors that we're matching.
///
/// FIXME(emilio): Consider putting the mutable stuff in a Cell.
/// immutable again.
/// FIXME(emilio): Consider putting the mutable stuff in a Cell, then make
/// MatchingContext immutable again.
nesting_level: usize,
/// An optional hook function for checking whether a pseudo-element
@ -210,4 +211,26 @@ where
self.nesting_level -= 1;
result
}
#[inline]
pub fn visited_handling(&self) -> VisitedHandlingMode {
self.visited_handling
}
/// Runs F with a different VisitedHandlingMode.
#[inline]
pub fn with_visited_handling_mode<F, R>(
&mut self,
handling_mode: VisitedHandlingMode,
f: F,
) -> R
where
F: FnOnce(&mut Self) -> R,
{
let original_handling_mode = self.visited_handling;
self.visited_handling = handling_mode;
let result = f(self);
self.visited_handling = original_handling_mode;
result
}
}