aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ. Ryan Stinnett <jryans@gmail.com>2017-05-18 18:21:44 -0500
committerJ. Ryan Stinnett <jryans@gmail.com>2017-05-24 18:08:09 -0500
commit47c8574c54eb4616ff506acf085e560764f2c828 (patch)
tree1e4bd701bb2fe853e387a6f81f3ba78c7cd52fdb
parent582ce1f6e46989d278580d7f09a95f695164d876 (diff)
downloadservo-47c8574c54eb4616ff506acf085e560764f2c828.tar.gz
servo-47c8574c54eb4616ff506acf085e560764f2c828.zip
Style sharing cache for visited
The style sharing cache stores the regular `ComputedValues`, so it would also have the visited values as well for anything inserted into the cache (since they are nested inside). Unlike all other element states, a change in state of unvisited vs. visited does not change the style system's output, since we have already computed both possible outputs up front. We change the element state checks when looking for style sharing cache hits to ignore visitedness, since that's handled by the two separate sets of values. MozReview-Commit-ID: Dt8uK8gSQSP
-rw-r--r--components/style/sharing/checks.rs15
-rw-r--r--components/style/sharing/mod.rs2
2 files changed, 16 insertions, 1 deletions
diff --git a/components/style/sharing/checks.rs b/components/style/sharing/checks.rs
index 5cc5869e509..4ac537e0009 100644
--- a/components/style/sharing/checks.rs
+++ b/components/style/sharing/checks.rs
@@ -8,6 +8,7 @@
use context::{CurrentElementInfo, SelectorFlagsMap, SharedStyleContext};
use dom::TElement;
+use element_state::*;
use matching::MatchMethods;
use selectors::bloom::BloomFilter;
use selectors::matching::{ElementSelectorFlags, StyleRelations};
@@ -80,6 +81,20 @@ pub fn have_same_class<E>(element: E,
element_class_attributes == *candidate.class_attributes.as_ref().unwrap()
}
+/// Compare element and candidate state, but ignore visitedness. Styles don't
+/// actually changed based on visitedness (since both possibilities are computed
+/// up front), so it's safe to share styles if visitedness differs.
+pub fn have_same_state_ignoring_visitedness<E>(element: E,
+ candidate: &StyleSharingCandidate<E>)
+ -> bool
+ where E: TElement,
+{
+ let state_mask = !IN_VISITED_OR_UNVISITED_STATE;
+ let state = element.get_state() & state_mask;
+ let candidate_state = candidate.element.get_state() & state_mask;
+ state == candidate_state
+}
+
/// Whether a given element and a candidate match the same set of "revalidation"
/// selectors.
///
diff --git a/components/style/sharing/mod.rs b/components/style/sharing/mod.rs
index 744571ca863..67fde2e047b 100644
--- a/components/style/sharing/mod.rs
+++ b/components/style/sharing/mod.rs
@@ -349,7 +349,7 @@ impl<E: TElement> StyleSharingCandidateCache<E> {
miss!(UserAndAuthorRules)
}
- if element.get_state() != candidate.element.get_state() {
+ if !checks::have_same_state_ignoring_visitedness(element, candidate) {
miss!(State)
}