mirror of
https://github.com/servo/servo.git
synced 2025-08-04 21:20:23 +01:00
style: Make ComputedValuesMap a bit more generic.
This commit is contained in:
parent
4fdc571e9f
commit
d48fd2964d
2 changed files with 13 additions and 10 deletions
|
@ -97,32 +97,35 @@ impl ToCss for ComputedValue {
|
||||||
/// DOM. CSSDeclarations expose property names as indexed properties, which
|
/// DOM. CSSDeclarations expose property names as indexed properties, which
|
||||||
/// need to be stable. So we keep an array of property names which order is
|
/// need to be stable. So we keep an array of property names which order is
|
||||||
/// determined on the order that they are added to the name-value map.
|
/// determined on the order that they are added to the name-value map.
|
||||||
|
pub type CustomPropertiesMap = OrderedMap<ComputedValue>;
|
||||||
|
|
||||||
|
/// A map that preserves order for the keys, and that is easily indexable.
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
pub struct CustomPropertiesMap {
|
pub struct OrderedMap<T> {
|
||||||
/// Custom property name index.
|
/// Custom property name index.
|
||||||
index: Vec<Name>,
|
index: Vec<Name>,
|
||||||
/// Computed values indexed by custom property name.
|
/// Computed values indexed by custom property name.
|
||||||
values: HashMap<Name, ComputedValue>,
|
values: HashMap<Name, T>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CustomPropertiesMap {
|
impl<T> OrderedMap<T> {
|
||||||
/// Creates a new custom properties map.
|
/// Creates a new custom properties map.
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
CustomPropertiesMap {
|
OrderedMap {
|
||||||
index: Vec::new(),
|
index: Vec::new(),
|
||||||
values: HashMap::new(),
|
values: HashMap::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Insert a computed value if it has not previously been inserted.
|
/// Insert a computed value if it has not previously been inserted.
|
||||||
pub fn insert(&mut self, name: &Name, value: ComputedValue) {
|
pub fn insert(&mut self, name: &Name, value: T) {
|
||||||
debug_assert!(!self.index.contains(name));
|
debug_assert!(!self.index.contains(name));
|
||||||
self.index.push(name.clone());
|
self.index.push(name.clone());
|
||||||
self.values.insert(name.clone(), value);
|
self.values.insert(name.clone(), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Custom property computed value getter by name.
|
/// Custom property computed value getter by name.
|
||||||
pub fn get_computed_value(&self, name: &Name) -> Option<&ComputedValue> {
|
pub fn get(&self, name: &Name) -> Option<&T> {
|
||||||
let value = self.values.get(name);
|
let value = self.values.get(name);
|
||||||
debug_assert_eq!(value.is_some(), self.index.contains(name));
|
debug_assert_eq!(value.is_some(), self.index.contains(name));
|
||||||
value
|
value
|
||||||
|
@ -134,7 +137,7 @@ impl CustomPropertiesMap {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get an iterator for custom properties computed values.
|
/// Get an iterator for custom properties computed values.
|
||||||
pub fn iter(&self) -> hash_map::Iter<Name, ComputedValue> {
|
pub fn iter(&self) -> hash_map::Iter<Name, T> {
|
||||||
self.values.iter()
|
self.values.iter()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -525,7 +528,7 @@ fn substitute_one(name: &Name,
|
||||||
custom_properties_map: &mut CustomPropertiesMap,
|
custom_properties_map: &mut CustomPropertiesMap,
|
||||||
invalid: &mut HashSet<Name>)
|
invalid: &mut HashSet<Name>)
|
||||||
-> Result<TokenSerializationType, ()> {
|
-> Result<TokenSerializationType, ()> {
|
||||||
if let Some(computed_value) = custom_properties_map.get_computed_value(&name) {
|
if let Some(computed_value) = custom_properties_map.get(&name) {
|
||||||
if let Some(partial_computed_value) = partial_computed_value {
|
if let Some(partial_computed_value) = partial_computed_value {
|
||||||
partial_computed_value.push_variable(computed_value)
|
partial_computed_value.push_variable(computed_value)
|
||||||
}
|
}
|
||||||
|
@ -679,7 +682,7 @@ pub fn substitute<'i>(input: &'i str, first_token_type: TokenSerializationType,
|
||||||
let mut position = (input.position(), first_token_type);
|
let mut position = (input.position(), first_token_type);
|
||||||
let last_token_type = substitute_block(
|
let last_token_type = substitute_block(
|
||||||
&mut input, &mut position, &mut substituted, &mut |name, substituted| {
|
&mut input, &mut position, &mut substituted, &mut |name, substituted| {
|
||||||
if let Some(value) = computed_values_map.as_ref().and_then(|map| map.get_computed_value(name)) {
|
if let Some(value) = computed_values_map.as_ref().and_then(|map| map.get(name)) {
|
||||||
substituted.push_variable(value);
|
substituted.push_variable(value);
|
||||||
Ok(value.last_token_type)
|
Ok(value.last_token_type)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -2314,7 +2314,7 @@ impl ComputedValuesInner {
|
||||||
PropertyDeclarationId::Custom(name) => {
|
PropertyDeclarationId::Custom(name) => {
|
||||||
self.custom_properties
|
self.custom_properties
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.and_then(|map| map.get_computed_value(name))
|
.and_then(|map| map.get(name))
|
||||||
.map(|value| value.to_css_string())
|
.map(|value| value.to_css_string())
|
||||||
.unwrap_or(String::new())
|
.unwrap_or(String::new())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue