aboutsummaryrefslogtreecommitdiffstats
path: root/tests/unit/style/custom_properties.rs
blob: 4556e930d029cd9d13426103bb298748b1446063 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */

use cssparser::{Parser, ParserInput};
use euclid::{Scale, Size2D};
use servo_arc::Arc;
use style::applicable_declarations::CascadePriority;
use style::context::QuirksMode;
use style::custom_properties::{
    ComputedCustomProperties, CustomPropertiesBuilder, DeferFontRelativeCustomPropertyResolution,
    Name, SpecifiedValue,
};
use style::font_metrics::FontMetrics;
use style::media_queries::{Device, MediaType};
use style::properties::style_structs::Font;
use style::properties::{ComputedValues, CustomDeclaration, CustomDeclarationValue, StyleBuilder};
use style::queries::values::PrefersColorScheme;
use style::rule_cache::RuleCacheConditions;
use style::rule_tree::CascadeLevel;
use style::servo::media_queries::FontMetricsProvider;
use style::stylesheets::UrlExtraData;
use style::stylesheets::container_rule::ContainerSizeQuery;
use style::stylesheets::layer_rule::LayerOrder;
use style::stylist::Stylist;
use style::values::computed::font::GenericFontFamily;
use style::values::computed::{Context, Length};
use test::{self, Bencher};
use url::Url;

#[derive(Debug)]
struct DummyMetricsProvider;

impl FontMetricsProvider for DummyMetricsProvider {
    fn query_font_metrics(
        &self,
        _vertical: bool,
        _font: &Font,
        _base_size: Length,
        _in_media_query: bool,
        _retrieve_math_scales: bool,
    ) -> FontMetrics {
        Default::default()
    }
    fn base_size_for_generic(&self, _: GenericFontFamily) -> Length {
        Length::new(16.)
    }
}

fn cascade(
    name_and_value: &[(&str, &str)],
    inherited: &ComputedCustomProperties,
) -> ComputedCustomProperties {
    let dummy_url_data = UrlExtraData::from(Url::parse("about:blank").unwrap());
    let declarations = name_and_value
        .iter()
        .map(|&(name, value)| {
            let mut input = ParserInput::new(value);
            let mut parser = Parser::new(&mut input);
            let name = Name::from(name);
            let value = CustomDeclarationValue::Unparsed(Arc::new(
                SpecifiedValue::parse(&mut parser, &dummy_url_data).unwrap(),
            ));
            CustomDeclaration { name, value }
        })
        .collect::<Vec<_>>();

    let initial_style = ComputedValues::initial_values_with_font_override(Font::initial_values());
    let device = Device::new(
        MediaType::screen(),
        QuirksMode::NoQuirks,
        Size2D::new(800., 600.),
        Scale::new(1.0),
        Box::new(DummyMetricsProvider),
        initial_style,
        PrefersColorScheme::Light,
    );
    let stylist = Stylist::new(device, QuirksMode::NoQuirks);
    let mut builder = StyleBuilder::new(stylist.device(), Some(&stylist), None, None, None, false);
    builder.custom_properties = inherited.clone();
    let mut rule_cache_conditions = RuleCacheConditions::default();
    let mut context = Context::new(
        builder,
        stylist.quirks_mode(),
        &mut rule_cache_conditions,
        ContainerSizeQuery::none(),
    );
    let mut builder = CustomPropertiesBuilder::new(&stylist, &mut context);

    for declaration in &declarations {
        builder.cascade(
            declaration,
            CascadePriority::new(CascadeLevel::same_tree_author_normal(), LayerOrder::root()),
        );
    }

    builder.build(DeferFontRelativeCustomPropertyResolution::No);
    context.builder.custom_properties
}

#[bench]
fn cascade_custom_simple(b: &mut Bencher) {
    b.iter(|| {
        let parent = cascade(
            &[("foo", "10px"), ("bar", "100px")],
            &ComputedCustomProperties::default(),
        );

        test::black_box(cascade(
            &[("baz", "calc(40em + 4px)"), ("bazz", "calc(30em + 4px)")],
            &parent,
        ))
    })
}