mirror of
https://github.com/servo/servo.git
synced 2025-08-04 05:00:08 +01:00
Making fixes based on suggestions from nox and SimonSapin
This commit is contained in:
parent
47279179fa
commit
0985d7563f
2 changed files with 26 additions and 38 deletions
|
@ -699,11 +699,12 @@ impl Element {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sync_property_with_attrs_style(&self) {
|
fn sync_property_with_attrs_style(&self) {
|
||||||
let mut style_str = String::new();
|
let style_str = if let &Some(ref declarations) = &*self.style_attribute().borrow() {
|
||||||
|
declarations.serialize()
|
||||||
if let &Some(ref declarations) = &*self.style_attribute().borrow() {
|
|
||||||
style_str.push_str(&declarations.serialize());
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
String::new()
|
||||||
|
};
|
||||||
|
|
||||||
let new_style = AttrValue::String(style_str);
|
let new_style = AttrValue::String(style_str);
|
||||||
|
|
||||||
|
|
|
@ -255,10 +255,9 @@ mod property_bit_field {
|
||||||
|
|
||||||
/// Declarations are stored in reverse order.
|
/// Declarations are stored in reverse order.
|
||||||
/// Overridden declarations are skipped.
|
/// Overridden declarations are skipped.
|
||||||
// TODO: Because normal & important are stored in seperate lists, it is impossible to know their
|
|
||||||
// exact declaration order. They should be changed into one list, adding an important/normal
|
|
||||||
// flag to PropertyDeclaration
|
|
||||||
|
|
||||||
|
|
||||||
|
// FIXME (https://github.com/servo/servo/issues/3426)
|
||||||
#[derive(Debug, PartialEq, HeapSizeOf)]
|
#[derive(Debug, PartialEq, HeapSizeOf)]
|
||||||
pub struct PropertyDeclarationBlock {
|
pub struct PropertyDeclarationBlock {
|
||||||
#[ignore_heap_size_of = "#7038"]
|
#[ignore_heap_size_of = "#7038"]
|
||||||
|
@ -274,16 +273,13 @@ impl PropertyDeclarationBlock {
|
||||||
let mut result_list = String::new();
|
let mut result_list = String::new();
|
||||||
|
|
||||||
// Step 2
|
// Step 2
|
||||||
let mut already_serialized = HashSet::new();
|
let mut already_serialized = Vec::new();
|
||||||
|
|
||||||
// Step 3
|
// Step 3
|
||||||
// restore order of declarations since PropertyDeclarationBlock is stored in reverse order
|
// restore order of declarations since PropertyDeclarationBlock is stored in reverse order
|
||||||
let declarations = self.normal.iter().rev().chain(self.important.iter().rev()).collect::<Vec<_>>();
|
for declaration in self.important.iter().chain(self.normal.iter()).rev() {
|
||||||
|
|
||||||
|
|
||||||
for declaration in &declarations {
|
|
||||||
// Step 3.1
|
// Step 3.1
|
||||||
let property = declaration.name().to_string();
|
let property = declaration.name();
|
||||||
|
|
||||||
// Step 3.2
|
// Step 3.2
|
||||||
if already_serialized.contains(&property) {
|
if already_serialized.contains(&property) {
|
||||||
|
@ -291,13 +287,12 @@ impl PropertyDeclarationBlock {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 3.3
|
// Step 3.3
|
||||||
let mut shorthands = Vec::from(declaration.shorthands());
|
let shorthands = declaration.shorthands();
|
||||||
if shorthands.len() > 0 {
|
if !shorthands.is_empty() {
|
||||||
shorthands.sort_by(|a,b| a.longhands().len().cmp(&b.longhands().len()));
|
|
||||||
|
|
||||||
// Step 3.3.1
|
// Step 3.3.1
|
||||||
let mut longhands = declarations.iter().cloned()
|
let mut longhands = self.important.iter().chain(self.normal.iter()).rev()
|
||||||
.filter(|d| !already_serialized.contains(&d.name().to_string()))
|
.filter(|d| !already_serialized.contains(&d.name()))
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
// Step 3.3.2
|
// Step 3.3.2
|
||||||
|
@ -306,22 +301,16 @@ impl PropertyDeclarationBlock {
|
||||||
|
|
||||||
// Substep 2 & 3
|
// Substep 2 & 3
|
||||||
let mut current_longhands = Vec::new();
|
let mut current_longhands = Vec::new();
|
||||||
let mut missing_properties: HashSet<_> = HashSet::from_iter(
|
|
||||||
properties.iter().map(|&s| s.to_owned())
|
|
||||||
);
|
|
||||||
|
|
||||||
for longhand in longhands.iter().cloned() {
|
for longhand in longhands.iter() {
|
||||||
let longhand_string = longhand.name().to_string();
|
let longhand_name = longhand.name();
|
||||||
if !properties.contains(&&*longhand_string) {
|
if properties.iter().any(|p| &longhand_name == *p) {
|
||||||
continue;
|
current_longhands.push(*longhand);
|
||||||
}
|
}
|
||||||
|
|
||||||
missing_properties.remove(&longhand_string);
|
|
||||||
current_longhands.push(longhand);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Substep 1
|
// Substep 1
|
||||||
if current_longhands.len() == 0 || missing_properties.len() > 0 {
|
if current_longhands.is_empty() || current_longhands.len() != properties.len() {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -345,11 +334,11 @@ impl PropertyDeclarationBlock {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Substep 7 & 8
|
// Substep 7 & 8
|
||||||
result_list.push_str(&format!("{}: {}; ", &shorthand.to_name(), value));
|
result_list.push_str(&format!("{}: {}; ", &shorthand.name(), value));
|
||||||
|
|
||||||
for current_longhand in current_longhands {
|
for current_longhand in current_longhands {
|
||||||
// Substep 9
|
// Substep 9
|
||||||
already_serialized.insert(current_longhand.name().to_string());
|
already_serialized.push(current_longhand.name());
|
||||||
let index_to_remove = longhands.iter().position(|l| l == ¤t_longhand);
|
let index_to_remove = longhands.iter().position(|l| l == ¤t_longhand);
|
||||||
if let Some(index) = index_to_remove {
|
if let Some(index) = index_to_remove {
|
||||||
// Substep 10
|
// Substep 10
|
||||||
|
@ -367,13 +356,13 @@ impl PropertyDeclarationBlock {
|
||||||
// Step 3.3.5
|
// Step 3.3.5
|
||||||
let mut value = declaration.value();
|
let mut value = declaration.value();
|
||||||
if self.important.contains(declaration) {
|
if self.important.contains(declaration) {
|
||||||
value.push_str(" ! important");
|
value.push_str(" !important");
|
||||||
}
|
}
|
||||||
// Steps 3.3.6 & 3.3.7
|
// Steps 3.3.6 & 3.3.7
|
||||||
result_list.push_str(&format!("{}: {}; ", &property, value));
|
result_list.push_str(&format!("{}: {}; ", &property, value));
|
||||||
|
|
||||||
// Step 3.3.8
|
// Step 3.3.8
|
||||||
already_serialized.insert(property);
|
already_serialized.push(property);
|
||||||
}
|
}
|
||||||
|
|
||||||
result_list.pop(); // remove trailling whitespace
|
result_list.pop(); // remove trailling whitespace
|
||||||
|
@ -520,8 +509,6 @@ pub enum Shorthand {
|
||||||
% endfor
|
% endfor
|
||||||
}
|
}
|
||||||
|
|
||||||
use std::borrow::ToOwned;
|
|
||||||
use std::iter::FromIterator;
|
|
||||||
use util::str::str_join;
|
use util::str::str_join;
|
||||||
|
|
||||||
impl Shorthand {
|
impl Shorthand {
|
||||||
|
@ -534,7 +521,7 @@ impl Shorthand {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn to_name(&self) -> &str {
|
pub fn name(&self) -> &'static str {
|
||||||
match *self {
|
match *self {
|
||||||
% for property in SHORTHANDS:
|
% for property in SHORTHANDS:
|
||||||
Shorthand::${property.camel_case} => "${property.name}",
|
Shorthand::${property.camel_case} => "${property.name}",
|
||||||
|
@ -835,7 +822,7 @@ impl PropertyDeclaration {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn shorthands(&self) -> &[Shorthand] {
|
pub fn shorthands(&self) -> &'static [Shorthand] {
|
||||||
// first generate longhand to shorthands lookup map
|
// first generate longhand to shorthands lookup map
|
||||||
<%
|
<%
|
||||||
longhand_to_shorthand_map = {}
|
longhand_to_shorthand_map = {}
|
||||||
|
@ -863,7 +850,7 @@ impl PropertyDeclaration {
|
||||||
% for property in LONGHANDS:
|
% for property in LONGHANDS:
|
||||||
PropertyDeclaration::${property.camel_case}(_) => ${property.ident.upper()},
|
PropertyDeclaration::${property.camel_case}(_) => ${property.ident.upper()},
|
||||||
% endfor
|
% endfor
|
||||||
_ => &[] // include outlet for Custom enum value
|
PropertyDeclaration::Custom(_, _) => &[]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue