mirror of
https://github.com/servo/servo.git
synced 2025-07-13 02:13:40 +01:00
I'm about to introduce more state here to implement optimizations for custom property cascading, so this abstraction is useful to encapsulate that state.
43 lines
1.3 KiB
Rust
43 lines
1.3 KiB
Rust
/* 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 http://mozilla.org/MPL/2.0/. */
|
|
|
|
use cssparser::{Parser, ParserInput};
|
|
use servo_arc::Arc;
|
|
use style::custom_properties::{Name, SpecifiedValue, CustomPropertiesMap, CustomPropertiesBuilder};
|
|
use style::properties::DeclaredValue;
|
|
use test::{self, Bencher};
|
|
|
|
fn cascade(
|
|
name_and_value: &[(&str, &str)],
|
|
inherited: Option<&Arc<CustomPropertiesMap>>,
|
|
) -> Option<Arc<CustomPropertiesMap>> {
|
|
let values = name_and_value.iter().map(|&(name, value)| {
|
|
let mut input = ParserInput::new(value);
|
|
let mut parser = Parser::new(&mut input);
|
|
(Name::from(name), SpecifiedValue::parse(&mut parser).unwrap())
|
|
}).collect::<Vec<_>>();
|
|
|
|
let mut builder = CustomPropertiesBuilder::new(inherited);
|
|
|
|
for &(ref name, ref val) in &values {
|
|
builder.cascade(name, DeclaredValue::Value(val));
|
|
}
|
|
|
|
builder.build()
|
|
}
|
|
|
|
#[bench]
|
|
fn cascade_custom_simple(b: &mut Bencher) {
|
|
b.iter(|| {
|
|
let parent = cascade(&[
|
|
("foo", "10px"),
|
|
("bar", "100px"),
|
|
], None);
|
|
|
|
test::black_box(cascade(&[
|
|
("baz", "calc(40em + 4px)"),
|
|
("bazz", "calc(30em + 4px)"),
|
|
], parent.as_ref()))
|
|
})
|
|
}
|