Implement Calc for LengthOrPercentageOrAuto

This commit is contained in:
David Zbarsky 2015-08-11 21:08:05 -04:00
parent 9556141e57
commit cb4d878169
7 changed files with 44 additions and 0 deletions

View file

@ -327,8 +327,12 @@ impl CandidateBSizeIterator {
(LengthOrPercentageOrAuto::Percentage(percent), Some(block_container_block_size)) => { (LengthOrPercentageOrAuto::Percentage(percent), Some(block_container_block_size)) => {
MaybeAuto::Specified(block_container_block_size.scale_by(percent)) MaybeAuto::Specified(block_container_block_size.scale_by(percent))
} }
(LengthOrPercentageOrAuto::Calc(calc), Some(block_container_block_size)) => {
MaybeAuto::Specified(calc.length() + block_container_block_size.scale_by(calc.percentage()))
}
(LengthOrPercentageOrAuto::Percentage(_), None) | (LengthOrPercentageOrAuto::Auto, _) => MaybeAuto::Auto, (LengthOrPercentageOrAuto::Percentage(_), None) | (LengthOrPercentageOrAuto::Auto, _) => MaybeAuto::Auto,
(LengthOrPercentageOrAuto::Length(length), _) => MaybeAuto::Specified(length), (LengthOrPercentageOrAuto::Length(length), _) => MaybeAuto::Specified(length),
(LengthOrPercentageOrAuto::Calc(calc), _) => MaybeAuto::Specified(calc.length()),
}; };
let max_block_size = match (fragment.style.max_block_size(), block_container_block_size) { let max_block_size = match (fragment.style.max_block_size(), block_container_block_size) {
(LengthOrPercentageOrNone::Percentage(percent), Some(block_container_block_size)) => (LengthOrPercentageOrNone::Percentage(percent), Some(block_container_block_size)) =>
@ -1118,6 +1122,12 @@ impl BlockFlow {
let content_block_size = self.fragment.style().content_block_size(); let content_block_size = self.fragment.style().content_block_size();
match (content_block_size, containing_block_size) { match (content_block_size, containing_block_size) {
(LengthOrPercentageOrAuto::Calc(calc), Some(container_size)) => {
Some(container_size.scale_by(calc.percentage()) + calc.length())
}
(LengthOrPercentageOrAuto::Calc(calc), _) => {
Some(calc.length())
},
(LengthOrPercentageOrAuto::Length(length), _) => Some(length), (LengthOrPercentageOrAuto::Length(length), _) => Some(length),
(LengthOrPercentageOrAuto::Percentage(percent), Some(container_size)) => { (LengthOrPercentageOrAuto::Percentage(percent), Some(container_size)) => {
Some(container_size.scale_by(percent)) Some(container_size.scale_by(percent))

View file

@ -463,6 +463,12 @@ impl ReplacedImageFragmentInfo {
MaybeAuto::Specified(container_size.scale_by(pc)) MaybeAuto::Specified(container_size.scale_by(pc))
} }
(LengthOrPercentageOrAuto::Percentage(_), _, None) => MaybeAuto::Auto, (LengthOrPercentageOrAuto::Percentage(_), _, None) => MaybeAuto::Auto,
(LengthOrPercentageOrAuto::Calc(calc), _, Some(container_size)) => {
MaybeAuto::Specified(calc.length() + container_size.scale_by(calc.percentage()))
}
(LengthOrPercentageOrAuto::Calc(calc), _, None) => {
MaybeAuto::Specified(calc.length())
}
(LengthOrPercentageOrAuto::Auto, Some(dom_length), _) => MaybeAuto::Specified(dom_length), (LengthOrPercentageOrAuto::Auto, Some(dom_length), _) => MaybeAuto::Specified(dom_length),
(LengthOrPercentageOrAuto::Auto, None, _) => MaybeAuto::Auto, (LengthOrPercentageOrAuto::Auto, None, _) => MaybeAuto::Auto,
} }
@ -616,6 +622,10 @@ impl IframeFragmentInfo {
let computed_size = match (content_size, containing_size) { let computed_size = match (content_size, containing_size) {
(LengthOrPercentageOrAuto::Length(length), _) => length, (LengthOrPercentageOrAuto::Length(length), _) => length,
(LengthOrPercentageOrAuto::Percentage(pc), Some(container_size)) => container_size.scale_by(pc), (LengthOrPercentageOrAuto::Percentage(pc), Some(container_size)) => container_size.scale_by(pc),
(LengthOrPercentageOrAuto::Calc(calc), Some(container_size)) => {
container_size.scale_by(calc.percentage()) + calc.length()
},
(LengthOrPercentageOrAuto::Calc(calc), None) => calc.length(),
(LengthOrPercentageOrAuto::Percentage(_), None) => default_size, (LengthOrPercentageOrAuto::Percentage(_), None) => default_size,
(LengthOrPercentageOrAuto::Auto, _) => default_size, (LengthOrPercentageOrAuto::Auto, _) => default_size,
}; };
@ -1285,6 +1295,7 @@ impl Fragment {
} }
(Some(dom_inline_size), _) => dom_inline_size, (Some(dom_inline_size), _) => dom_inline_size,
(None, LengthOrPercentageOrAuto::Length(length)) => length, (None, LengthOrPercentageOrAuto::Length(length)) => length,
(None, LengthOrPercentageOrAuto::Calc(calc)) => calc.length(),
}; };
result.union_block(&IntrinsicISizes { result.union_block(&IntrinsicISizes {
minimum_inline_size: image_inline_size, minimum_inline_size: image_inline_size,

View file

@ -379,6 +379,9 @@ impl MaybeAuto {
LengthOrPercentageOrAuto::Percentage(percent) => { LengthOrPercentageOrAuto::Percentage(percent) => {
MaybeAuto::Specified(containing_length.scale_by(percent)) MaybeAuto::Specified(containing_length.scale_by(percent))
} }
LengthOrPercentageOrAuto::Calc(calc) => {
MaybeAuto::Specified(calc.length() + containing_length.scale_by(calc.percentage()))
}
LengthOrPercentageOrAuto::Length(length) => MaybeAuto::Specified(length) LengthOrPercentageOrAuto::Length(length) => MaybeAuto::Specified(length)
} }
} }

View file

@ -267,11 +267,13 @@ impl Flow for TableFlow {
self.column_intrinsic_inline_sizes.push(ColumnIntrinsicInlineSize { self.column_intrinsic_inline_sizes.push(ColumnIntrinsicInlineSize {
minimum_length: match *specified_inline_size { minimum_length: match *specified_inline_size {
LengthOrPercentageOrAuto::Auto | LengthOrPercentageOrAuto::Auto |
LengthOrPercentageOrAuto::Calc(_) |
LengthOrPercentageOrAuto::Percentage(_) => Au(0), LengthOrPercentageOrAuto::Percentage(_) => Au(0),
LengthOrPercentageOrAuto::Length(length) => length, LengthOrPercentageOrAuto::Length(length) => length,
}, },
percentage: match *specified_inline_size { percentage: match *specified_inline_size {
LengthOrPercentageOrAuto::Auto | LengthOrPercentageOrAuto::Auto |
LengthOrPercentageOrAuto::Calc(_) |
LengthOrPercentageOrAuto::Length(_) => 0.0, LengthOrPercentageOrAuto::Length(_) => 0.0,
LengthOrPercentageOrAuto::Percentage(percentage) => percentage, LengthOrPercentageOrAuto::Percentage(percentage) => percentage,
}, },

View file

@ -272,6 +272,7 @@ impl Flow for TableRowFlow {
let child_column_inline_size = ColumnIntrinsicInlineSize { let child_column_inline_size = ColumnIntrinsicInlineSize {
minimum_length: match child_specified_inline_size { minimum_length: match child_specified_inline_size {
LengthOrPercentageOrAuto::Auto | LengthOrPercentageOrAuto::Auto |
LengthOrPercentageOrAuto::Calc(_) |
LengthOrPercentageOrAuto::Percentage(_) => { LengthOrPercentageOrAuto::Percentage(_) => {
child_base.intrinsic_inline_sizes.minimum_inline_size child_base.intrinsic_inline_sizes.minimum_inline_size
} }
@ -279,6 +280,7 @@ impl Flow for TableRowFlow {
}, },
percentage: match child_specified_inline_size { percentage: match child_specified_inline_size {
LengthOrPercentageOrAuto::Auto | LengthOrPercentageOrAuto::Auto |
LengthOrPercentageOrAuto::Calc(_) |
LengthOrPercentageOrAuto::Length(_) => 0.0, LengthOrPercentageOrAuto::Length(_) => 0.0,
LengthOrPercentageOrAuto::Percentage(percentage) => percentage, LengthOrPercentageOrAuto::Percentage(percentage) => percentage,
}, },
@ -286,6 +288,7 @@ impl Flow for TableRowFlow {
constrained: match child_specified_inline_size { constrained: match child_specified_inline_size {
LengthOrPercentageOrAuto::Length(_) => true, LengthOrPercentageOrAuto::Length(_) => true,
LengthOrPercentageOrAuto::Auto | LengthOrPercentageOrAuto::Auto |
LengthOrPercentageOrAuto::Calc(_) |
LengthOrPercentageOrAuto::Percentage(_) => false, LengthOrPercentageOrAuto::Percentage(_) => false,
}, },
}; };

View file

@ -490,6 +490,7 @@ pub mod specified {
Length(Length), Length(Length),
Percentage(CSSFloat), // [0 .. 100%] maps to [0.0 .. 1.0] Percentage(CSSFloat), // [0 .. 100%] maps to [0.0 .. 1.0]
Auto, Auto,
Calc(Calc),
} }
impl ToCss for LengthOrPercentageOrAuto { impl ToCss for LengthOrPercentageOrAuto {
@ -499,6 +500,7 @@ pub mod specified {
&LengthOrPercentageOrAuto::Percentage(percentage) &LengthOrPercentageOrAuto::Percentage(percentage)
=> write!(dest, "{}%", percentage * 100.), => write!(dest, "{}%", percentage * 100.),
&LengthOrPercentageOrAuto::Auto => dest.write_str("auto"), &LengthOrPercentageOrAuto::Auto => dest.write_str("auto"),
&LengthOrPercentageOrAuto::Calc(calc) => calc.to_css(dest),
} }
} }
} }
@ -516,6 +518,10 @@ pub mod specified {
Ok(LengthOrPercentageOrAuto::Length(Length::Absolute(Au(0)))), Ok(LengthOrPercentageOrAuto::Length(Length::Absolute(Au(0)))),
Token::Ident(ref value) if value.eq_ignore_ascii_case("auto") => Token::Ident(ref value) if value.eq_ignore_ascii_case("auto") =>
Ok(LengthOrPercentageOrAuto::Auto), Ok(LengthOrPercentageOrAuto::Auto),
Token::Function(ref name) if name.eq_ignore_ascii_case("calc") => {
let calc = try!(input.parse_nested_block(Calc::parse));
Ok(LengthOrPercentageOrAuto::Calc(calc))
},
_ => Err(()) _ => Err(())
} }
} }
@ -1122,6 +1128,7 @@ pub mod computed {
Length(Au), Length(Au),
Percentage(CSSFloat), Percentage(CSSFloat),
Auto, Auto,
Calc(Calc),
} }
impl fmt::Debug for LengthOrPercentageOrAuto { impl fmt::Debug for LengthOrPercentageOrAuto {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
@ -1129,6 +1136,8 @@ pub mod computed {
&LengthOrPercentageOrAuto::Length(length) => write!(f, "{:?}", length), &LengthOrPercentageOrAuto::Length(length) => write!(f, "{:?}", length),
&LengthOrPercentageOrAuto::Percentage(percentage) => write!(f, "{}%", percentage * 100.), &LengthOrPercentageOrAuto::Percentage(percentage) => write!(f, "{}%", percentage * 100.),
&LengthOrPercentageOrAuto::Auto => write!(f, "auto"), &LengthOrPercentageOrAuto::Auto => write!(f, "auto"),
// XXX HACK WRONG
&LengthOrPercentageOrAuto::Calc(calc) => write!(f, "{}%", 100.),
} }
} }
} }
@ -1148,6 +1157,9 @@ pub mod computed {
specified::LengthOrPercentageOrAuto::Auto => { specified::LengthOrPercentageOrAuto::Auto => {
LengthOrPercentageOrAuto::Auto LengthOrPercentageOrAuto::Auto
} }
specified::LengthOrPercentageOrAuto::Calc(calc) => {
LengthOrPercentageOrAuto::Calc(calc.to_computed_value(context))
}
} }
} }
} }
@ -1159,6 +1171,7 @@ pub mod computed {
&LengthOrPercentageOrAuto::Percentage(percentage) &LengthOrPercentageOrAuto::Percentage(percentage)
=> write!(dest, "{}%", percentage * 100.), => write!(dest, "{}%", percentage * 100.),
&LengthOrPercentageOrAuto::Auto => dest.write_str("auto"), &LengthOrPercentageOrAuto::Auto => dest.write_str("auto"),
&LengthOrPercentageOrAuto::Calc(calc) => calc.to_css(dest),
} }
} }
} }

View file

@ -437,6 +437,8 @@ impl ViewportConstraints {
LengthOrPercentageOrAuto::Percentage(value) => LengthOrPercentageOrAuto::Percentage(value) =>
Some(initial_viewport.$dimension.scale_by(value)), Some(initial_viewport.$dimension.scale_by(value)),
LengthOrPercentageOrAuto::Auto => None, LengthOrPercentageOrAuto::Auto => None,
// XXX WRONG HACK
LengthOrPercentageOrAuto::Calc(calc) => None,
} }
} else { } else {
None None