diff --git a/components/style/properties.mako.rs b/components/style/properties.mako.rs index fd2267a0a94..ca4af9f18ff 100644 --- a/components/style/properties.mako.rs +++ b/components/style/properties.mako.rs @@ -294,13 +294,38 @@ pub mod longhands { <%self:longhand name="outline-width"> - pub use super::border_top_width::get_initial_value; - pub type SpecifiedValue = specified::Length; - pub mod computed_value { - pub use util::geometry::Au as T; + use values::computed::{ToComputedValue, Context}; + use util::geometry::Au; + use cssparser::ToCss; + use std::fmt; + + impl ToCss for SpecifiedValue { + fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + self.0.to_css(dest) + } } + pub fn parse(_context: &ParserContext, input: &mut Parser) -> Result { - specified::parse_border_width(input) + specified::parse_border_width(input).map(SpecifiedValue) + } + #[derive(Clone, PartialEq)] + pub struct SpecifiedValue(pub specified::Length); + pub mod computed_value { + use util::geometry::Au; + pub type T = Au; + } + pub use super::border_top_width::get_initial_value; + impl ToComputedValue for SpecifiedValue { + type ComputedValue = computed_value::T; + + #[inline] + fn to_computed_value(&self, context: &Context) -> computed_value::T { + if !context.outline_style_present { + Au(0) + } else { + self.0.to_computed_value(context) + } + } } @@ -4518,6 +4543,7 @@ pub mod shorthands { <%self:shorthand name="outline" sub_properties="outline-color outline-style outline-width"> use values::specified; + use properties::longhands::outline_width; let _unused = context; let mut color = None; @@ -4540,7 +4566,7 @@ pub mod shorthands { } } if width.is_none() { - if let Ok(value) = input.try(specified::parse_border_width) { + if let Ok(value) = input.try(|input| outline_width::parse(context, input)) { width = Some(value); any = true; continue @@ -5542,6 +5568,7 @@ pub fn cascade(viewport_size: Size2D, border_right_present: false, border_bottom_present: false, border_left_present: false, + outline_style_present: false, } }; @@ -5612,13 +5639,20 @@ pub fn cascade(viewport_size: Size2D, PropertyDeclaration::TextDecoration(ref value) => { context.text_decoration = get_specified!(get_text, text_decoration, value); } + PropertyDeclaration::OutlineStyle(ref value) => { + context.outline_style_present = + match get_specified!(get_outline, outline_style, value) { + BorderStyle::none => false, + _ => true, + }; + } % for side in ["top", "right", "bottom", "left"]: PropertyDeclaration::Border${side.capitalize()}Style(ref value) => { context.border_${side}_present = - match get_specified!(get_border, border_${side}_style, value) { - BorderStyle::none | BorderStyle::hidden => false, - _ => true, - }; + match get_specified!(get_border, border_${side}_style, value) { + BorderStyle::none | BorderStyle::hidden => false, + _ => true, + }; } % endfor _ => {} diff --git a/components/style/values.rs b/components/style/values.rs index 9c74dc47fd4..992ee08a79d 100644 --- a/components/style/values.rs +++ b/components/style/values.rs @@ -919,7 +919,8 @@ pub mod computed { pub border_bottom_present: bool, pub border_left_present: bool, pub is_root_element: bool, - pub viewport_size: Size2D + pub viewport_size: Size2D, + pub outline_style_present: bool, // TODO, as needed: viewport size, etc. } diff --git a/tests/ref/inline_block_stacking_context_a.html b/tests/ref/inline_block_stacking_context_a.html index 7580f853735..7f203821786 100644 --- a/tests/ref/inline_block_stacking_context_a.html +++ b/tests/ref/inline_block_stacking_context_a.html @@ -1,6 +1,7 @@ +