aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/style/traversal.rs114
1 files changed, 57 insertions, 57 deletions
diff --git a/components/style/traversal.rs b/components/style/traversal.rs
index 4c608212653..6f2e25f18d5 100644
--- a/components/style/traversal.rs
+++ b/components/style/traversal.rs
@@ -8,9 +8,9 @@
use atomic_refcell::{AtomicRefCell, AtomicRefMut};
use context::{SharedStyleContext, StyleContext, ThreadLocalStyleContext};
-use data::{ElementData, ElementStyles, RestyleKind, StoredRestyleHint};
+use data::{ElementData, ElementStyles, StoredRestyleHint};
use dom::{NodeInfo, TElement, TNode};
-use matching::{MatchMethods, StyleSharingResult};
+use matching::MatchMethods;
use restyle_hints::{RESTYLE_DESCENDANTS, RESTYLE_SELF};
use selector_parser::RestyleDamage;
use servo_config::opts;
@@ -483,77 +483,77 @@ fn compute_style<E, D>(_traversal: &D,
where E: TElement,
D: DomTraversal<E>,
{
+ use data::RestyleKind::*;
+ use matching::StyleSharingResult::*;
+
context.thread_local.statistics.elements_styled += 1;
let shared_context = context.shared;
+ let kind = data.restyle_kind();
+
+ // First, try the style sharing cache. If we get a match we can skip the rest
+ // of the work.
+ if let MatchAndCascade = kind {
+ let sharing_result = unsafe {
+ let cache = &mut context.thread_local.style_sharing_candidate_cache;
+ element.share_style_if_possible(cache, shared_context, &mut data)
+ };
+ if let StyleWasShared(index) = sharing_result {
+ context.thread_local.statistics.styles_shared += 1;
+ context.thread_local.style_sharing_candidate_cache.touch(index);
+ return;
+ }
+ }
// TODO(emilio): Make cascade_input less expensive to compute in the cases
// we don't need to run selector matching.
- let cascade_input = match data.restyle_kind() {
- RestyleKind::MatchAndCascade => {
- // Check to see whether we can share a style with someone.
- let sharing_result = unsafe {
- element.share_style_if_possible(&mut context.thread_local.style_sharing_candidate_cache,
- shared_context,
- &mut data)
- };
+ let match_results = match kind {
+ MatchAndCascade => {
+ // Ensure the bloom filter is up to date.
+ let dom_depth =
+ context.thread_local.bloom_filter
+ .insert_parents_recovering(element,
+ traversal_data.current_dom_depth);
+
+ // Update the dom depth with the up-to-date dom depth.
+ //
+ // Note that this is always the same than the pre-existing depth,
+ // but it can change from unknown to known at this step.
+ traversal_data.current_dom_depth = Some(dom_depth);
- match sharing_result {
- StyleSharingResult::StyleWasShared(index) => {
- context.thread_local.statistics.styles_shared += 1;
- context.thread_local.style_sharing_candidate_cache.touch(index);
- None
- }
- StyleSharingResult::CannotShare => {
- // Ensure the bloom filter is up to date.
- let dom_depth =
- context.thread_local.bloom_filter
- .insert_parents_recovering(element,
- traversal_data.current_dom_depth);
-
- // Update the dom depth with the up-to-date dom depth.
- //
- // Note that this is always the same than the pre-existing depth,
- // but it can change from unknown to known at this step.
- traversal_data.current_dom_depth = Some(dom_depth);
-
- context.thread_local.bloom_filter.assert_complete(element);
+ context.thread_local.bloom_filter.assert_complete(element);
- // Perform the CSS selector matching.
- context.thread_local.statistics.elements_matched += 1;
+ // Perform the CSS selector matching.
+ context.thread_local.statistics.elements_matched += 1;
- Some(element.match_element(context))
- }
- }
+ element.match_element(context)
}
- RestyleKind::CascadeWithReplacements(hint) => {
- Some(element.cascade_with_replacements(hint, context, &mut data))
+ CascadeWithReplacements(hint) => {
+ element.cascade_with_replacements(hint, context, &mut data)
}
- RestyleKind::CascadeOnly => {
+ CascadeOnly => {
// TODO(emilio): Stop doing this work, and teach cascade_node about
// the current style instead.
- Some(element.match_results_from_current_style(&*data))
+ element.match_results_from_current_style(&*data)
}
};
- if let Some(match_results) = cascade_input {
- // Perform the CSS cascade.
- let shareable = match_results.primary_is_shareable();
- unsafe {
- element.cascade_node(context, &mut data,
- element.parent_element(),
- match_results.primary,
- match_results.per_pseudo,
- shareable);
- }
+ // Perform the CSS cascade.
+ let shareable = match_results.primary_is_shareable();
+ unsafe {
+ element.cascade_node(context, &mut data,
+ element.parent_element(),
+ match_results.primary,
+ match_results.per_pseudo,
+ shareable);
+ }
- if shareable {
- // Add ourselves to the LRU cache.
- context.thread_local
- .style_sharing_candidate_cache
- .insert_if_possible(&element,
- &data.styles().primary.values,
- match_results.relations);
- }
+ if shareable {
+ // Add ourselves to the LRU cache.
+ context.thread_local
+ .style_sharing_candidate_cache
+ .insert_if_possible(&element,
+ &data.styles().primary.values,
+ match_results.relations);
}
}