Bug 1457678: Make the font canvas code not mess with the rule tree. r?xidorn,hiro
Inserting a lot of rules in the root level is super-inefficient. This fixes it
by not doing it.
It gives the root rule node to the style, but that's fine, since it's useless.
All this code-path is already pretty messy.
This is on top of
bug 1458192, but it's trivial to rebase it on top of other
patch instead.
MozReview-Commit-ID: GoGHI4YJbKr
--- a/servo/components/style/stylist.rs
+++ b/servo/components/style/stylist.rs
@@ -1543,37 +1543,39 @@ impl Stylist {
guards: &StylesheetGuards,
parent_style: &ComputedValues,
declarations: Arc<Locked<PropertyDeclarationBlock>>,
) -> Arc<ComputedValues>
where
E: TElement,
{
use font_metrics::get_metrics_provider_for_product;
- use std::iter;
- // FIXME(emilio): Why do we even need the rule node? We should probably
- // just avoid allocating it and calling `apply_declarations` directly,
- // maybe...
- let rule_node = self.rule_tree.insert_ordered_rules(iter::once((
- StyleSource::from_declarations(declarations),
- CascadeLevel::same_tree_author_normal(),
- )));
+ let block = declarations.read_with(guards.author);
+ let iter_declarations = || {
+ block.declaration_importance_iter().map(|(declaration, importance)| {
+ debug_assert!(!importance.important());
+ (
+ declaration,
+ properties::IsFromStyleRule::No,
+ CascadeLevel::same_tree_author_normal(),
+ )
+ })
+ };
- // This currently ignores visited styles. It appears to be used for
- // font styles in <canvas> via Servo_StyleSet_ResolveForDeclarations.
- // It is unclear if visited styles are meaningful for this case.
let metrics = get_metrics_provider_for_product();
- // FIXME(emilio): the pseudo bit looks quite dubious!
- properties::cascade::<E>(
+ // We don't bother inserting these declarations in the rule tree, since
+ // it'd be quite useless and slow.
+ properties::apply_declarations::<E, _, _>(
&self.device,
/* pseudo = */ None,
- &rule_node,
+ self.rule_tree.root(),
guards,
+ iter_declarations,
Some(parent_style),
Some(parent_style),
Some(parent_style),
None,
&metrics,
CascadeFlags::empty(),
self.quirks_mode,
/* rule_cache = */ None,