From 73f77e0a5369ede557afa1f4347c9a146bc5dc39 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Fri, 12 May 2017 22:24:30 +0200 Subject: [PATCH] Rename LayerImage to ImageLayer and make it a type alias --- components/layout/display_list_builder.rs | 24 ++++----- components/script/dom/element.rs | 6 +-- components/style/properties/gecko.mako.rs | 4 +- .../properties/longhand/background.mako.rs | 6 +-- .../style/properties/longhand/border.mako.rs | 6 +-- .../style/properties/longhand/svg.mako.rs | 7 +-- components/style/values/computed/image.rs | 18 ++----- components/style/values/computed/mod.rs | 2 +- components/style/values/specified/image.rs | 52 ++----------------- components/style/values/specified/mod.rs | 2 +- ports/geckolib/glue.rs | 6 +-- tests/unit/style/properties/serialization.rs | 15 +++--- 12 files changed, 47 insertions(+), 101 deletions(-) diff --git a/components/layout/display_list_builder.rs b/components/layout/display_list_builder.rs index 5f33702d693..c3ac7f09048 100644 --- a/components/layout/display_list_builder.rs +++ b/components/layout/display_list_builder.rs @@ -865,9 +865,9 @@ impl FragmentDisplayListBuilding for Fragment { // http://www.w3.org/TR/CSS21/colors.html#background let background = style.get_background(); for (i, background_image) in background.background_image.0.iter().enumerate().rev() { - match background_image.0 { - None => {} - Some(Image::Gradient(ref gradient)) => { + match *background_image { + Either::First(_) => {} + Either::Second(Image::Gradient(ref gradient)) => { self.build_display_list_for_background_gradient(state, display_list_section, &absolute_bounds, @@ -876,7 +876,7 @@ impl FragmentDisplayListBuilding for Fragment { gradient, style); } - Some(Image::Url(ref image_url)) => { + Either::Second(Image::Url(ref image_url)) => { if let Some(url) = image_url.url() { self.build_display_list_for_background_image(state, style, @@ -887,10 +887,10 @@ impl FragmentDisplayListBuilding for Fragment { i); } } - Some(Image::Rect(_)) => { + Either::Second(Image::Rect(_)) => { // TODO: Implement `-moz-image-rect` } - Some(Image::Element(_)) => { + Either::Second(Image::Element(_)) => { // TODO: Implement `-moz-element` } } @@ -1356,8 +1356,8 @@ impl FragmentDisplayListBuilding for Fragment { style.get_cursor(Cursor::Default), display_list_section); - match border_style_struct.border_image_source.0 { - None => { + match border_style_struct.border_image_source { + Either::First(_) => { state.add_display_item(DisplayItem::Border(box BorderDisplayItem { base: base, border_widths: border.to_physical(style.writing_mode), @@ -1371,7 +1371,7 @@ impl FragmentDisplayListBuilding for Fragment { }), })); } - Some(Image::Gradient(ref gradient)) => { + Either::Second(Image::Gradient(ref gradient)) => { match gradient.kind { GradientKind::Linear(angle_or_corner) => { let grad = self.convert_linear_gradient(&bounds, @@ -1412,13 +1412,13 @@ impl FragmentDisplayListBuilding for Fragment { } } } - Some(Image::Rect(..)) => { + Either::Second(Image::Rect(..)) => { // TODO: Handle border-image with `-moz-image-rect`. } - Some(Image::Element(..)) => { + Either::Second(Image::Element(..)) => { // TODO: Handle border-image with `-moz-element`. } - Some(Image::Url(ref image_url)) => { + Either::Second(Image::Url(ref image_url)) => { if let Some(url) = image_url.url() { let webrender_image = state.layout_context .get_webrender_image_for_url(self.node, diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index d54b79cdc28..aa32370127c 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -109,7 +109,7 @@ use style::sink::Push; use style::stylearc::Arc; use style::stylist::ApplicableDeclarationBlock; use style::thread_state; -use style::values::CSSFloat; +use style::values::{CSSFloat, Either}; use style::values::specified::{self, CSSColor}; use stylesheet_loader::StylesheetOwner; @@ -427,9 +427,7 @@ impl LayoutElementHelpers for LayoutJS { shared_lock, PropertyDeclaration::BackgroundImage( background_image::SpecifiedValue(vec![ - background_image::single_value::SpecifiedValue(Some( - specified::Image::for_cascade(url.into()) - )) + Either::Second(specified::Image::for_cascade(url.into())) ])))); } diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 4271b424bf1..f759bc680ce 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -927,7 +927,7 @@ fn static_assert() { Gecko_SetNullImageValue(&mut self.gecko.mBorderImageSource); } - if let Some(image) = image.0 { + if let Either::Second(image) = image { self.gecko.mBorderImageSource.set(image, &mut false) } } @@ -2883,7 +2883,7 @@ fn static_assert() { for (image, geckoimage) in images.zip(self.gecko.${image_layers_field} .mLayers.iter_mut()) { - if let Some(image) = image.0 { + if let Either::Second(image) = image { geckoimage.mImage.set(image, cacheable) } } diff --git a/components/style/properties/longhand/background.mako.rs b/components/style/properties/longhand/background.mako.rs index b0c998d59fd..563fdecfc5a 100644 --- a/components/style/properties/longhand/background.mako.rs +++ b/components/style/properties/longhand/background.mako.rs @@ -12,9 +12,9 @@ ${helpers.predefined_type("background-color", "CSSColor", spec="https://drafts.csswg.org/css-backgrounds/#background-color", animation_value_type="IntermediateColor", complex_color=True)} -${helpers.predefined_type("background-image", "LayerImage", - initial_value="computed_value::T(None)", - initial_specified_value="SpecifiedValue(None)", +${helpers.predefined_type("background-image", "ImageLayer", + initial_value="Either::First(None_)", + initial_specified_value="Either::First(None_)", spec="https://drafts.csswg.org/css-backgrounds/#the-background-image", vector="True", animation_value_type="none", diff --git a/components/style/properties/longhand/border.mako.rs b/components/style/properties/longhand/border.mako.rs index 6f07db69038..86cf3bd0e7f 100644 --- a/components/style/properties/longhand/border.mako.rs +++ b/components/style/properties/longhand/border.mako.rs @@ -190,9 +190,9 @@ ${helpers.single_keyword("-moz-float-edge", "content-box margin-box", spec="Nonstandard (https://developer.mozilla.org/en-US/docs/Web/CSS/-moz-float-edge)", animation_value_type="none")} -${helpers.predefined_type("border-image-source", "LayerImage", - initial_value="computed_value::T(None)", - initial_specified_value="SpecifiedValue(None)", +${helpers.predefined_type("border-image-source", "ImageLayer", + initial_value="Either::First(None_)", + initial_specified_value="Either::First(None_)", spec="https://drafts.csswg.org/css-backgrounds/#the-background-image", vector=False, animation_value_type="none", diff --git a/components/style/properties/longhand/svg.mako.rs b/components/style/properties/longhand/svg.mako.rs index c1327a6ca2e..540c522c09d 100644 --- a/components/style/properties/longhand/svg.mako.rs +++ b/components/style/properties/longhand/svg.mako.rs @@ -141,9 +141,10 @@ ${helpers.single_keyword("mask-composite", extra_prefixes="webkit", animation_value_type="none", spec="https://drafts.fxtf.org/css-masking/#propdef-mask-composite")} -${helpers.predefined_type("mask-image", "LayerImage", - initial_value="computed_value::T(None)", - initial_specified_value="SpecifiedValue(None)", + +${helpers.predefined_type("mask-image", "ImageLayer", + initial_value="Either::First(None_)", + initial_specified_value="Either::First(None_)", spec="https://drafts.fxtf.org/css-masking/#propdef-mask-image", vector=True, products="gecko", diff --git a/components/style/values/computed/image.rs b/components/style/values/computed/image.rs index 2141880895a..5f51dd22f85 100644 --- a/components/style/values/computed/image.rs +++ b/components/style/values/computed/image.rs @@ -11,6 +11,7 @@ use cssparser::Color as CSSColor; use std::f32::consts::PI; use std::fmt; use style_traits::ToCss; +use values::{Either, None_}; use values::computed::{Angle, Context, Length, LengthOrPercentage, NumberOrPercentage, ToComputedValue}; use values::computed::position::Position; use values::generics::image::{CompatMode, ColorStop as GenericColorStop, EndingShape as GenericEndingShape}; @@ -20,6 +21,9 @@ use values::generics::image::{ImageRect as GenericImageRect, LineDirection as Ge use values::specified::image::LineDirection as SpecifiedLineDirection; use values::specified::position::{X, Y}; +/// A computed image layer. +pub type ImageLayer = Either; + /// Computed values for an image according to CSS-IMAGES. /// https://drafts.csswg.org/css-images/#image-values pub type Image = GenericImage; @@ -126,17 +130,3 @@ impl ToComputedValue for SpecifiedLineDirection { } } } - -/// Computed values for none | | . -#[derive(Debug, Clone, PartialEq)] -#[cfg_attr(feature = "servo", derive(HeapSizeOf))] -pub struct LayerImage(pub Option); - -impl ToCss for LayerImage { - fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { - match self.0 { - None => dest.write_str("none"), - Some(ref image) => image.to_css(dest), - } - } -} diff --git a/components/style/values/computed/mod.rs b/components/style/values/computed/mod.rs index 56aeb62ee25..02a71c6b313 100644 --- a/components/style/values/computed/mod.rs +++ b/components/style/values/computed/mod.rs @@ -22,7 +22,7 @@ use super::specified::grid::{TrackBreadth as GenericTrackBreadth, TrackSize as G pub use app_units::Au; pub use cssparser::Color as CSSColor; -pub use self::image::{Gradient, GradientItem, LayerImage, LineDirection, Image, ImageRect}; +pub use self::image::{Gradient, GradientItem, ImageLayer, LineDirection, Image, ImageRect}; pub use super::{Auto, Either, None_}; #[cfg(feature = "gecko")] pub use super::specified::{AlignItems, AlignJustifyContent, AlignJustifySelf, JustifyItems}; diff --git a/components/style/values/specified/image.rs b/components/style/values/specified/image.rs index 692a01ffdae..7ec97ad4db3 100644 --- a/components/style/values/specified/image.rs +++ b/components/style/values/specified/image.rs @@ -15,6 +15,7 @@ use servo_url::ServoUrl; use std::f32::consts::PI; use std::fmt; use style_traits::ToCss; +use values::{Either, None_}; use values::generics::image::{Circle, CompatMode, Ellipse, ColorStop as GenericColorStop}; use values::generics::image::{EndingShape as GenericEndingShape, Gradient as GenericGradient}; use values::generics::image::{GradientItem as GenericGradientItem, GradientKind as GenericGradientKind}; @@ -24,6 +25,9 @@ use values::specified::{Angle, CSSColor, Length, LengthOrPercentage, NumberOrPer use values::specified::position::{Position, X, Y}; use values::specified::url::SpecifiedUrl; +/// A specified image layer. +pub type ImageLayer = Either; + /// Specified values for an image according to CSS-IMAGES. /// https://drafts.csswg.org/css-images/#image-values pub type Image = GenericImage; @@ -424,51 +428,3 @@ impl Parse for ColorStop { }) } } - -/// Specified values for none | | . -#[derive(Debug, Clone, PartialEq)] -#[cfg_attr(feature = "servo", derive(HeapSizeOf))] -pub struct LayerImage(pub Option); -no_viewport_percentage!(LayerImage); - -impl ToCss for LayerImage { - fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { - match *self { - LayerImage(Some(ref image)) => image.to_css(dest), - LayerImage(None) => dest.write_str("none"), - } - } -} - -use super::computed::{ToComputedValue, Context}; -impl ToComputedValue for LayerImage { - type ComputedValue = super::computed::LayerImage; - - #[inline] - fn to_computed_value(&self, context: &Context) -> Self::ComputedValue { - match *self { - LayerImage(None) => super::computed::LayerImage(None), - LayerImage(Some(ref image)) => - super::computed::LayerImage(Some(image.to_computed_value(context))), - } - } - - #[inline] - fn from_computed_value(computed: &Self::ComputedValue) -> Self { - match *computed { - super::computed::LayerImage(None) => LayerImage(None), - super::computed::LayerImage(Some(ref image)) => - LayerImage(Some(ToComputedValue::from_computed_value(image))), - } - } -} - -impl Parse for LayerImage { - fn parse(context: &ParserContext, input: &mut Parser) -> Result { - if input.try(|input| input.expect_ident_matching("none")).is_ok() { - Ok(LayerImage(None)) - } else { - Ok(LayerImage(Some(try!(Image::parse(context, input))))) - } - } -} diff --git a/components/style/values/specified/mod.rs b/components/style/values/specified/mod.rs index c0e9bfbd0fb..70e0ea75e8d 100644 --- a/components/style/values/specified/mod.rs +++ b/components/style/values/specified/mod.rs @@ -29,7 +29,7 @@ pub use self::align::{AlignItems, AlignJustifyContent, AlignJustifySelf, Justify pub use self::color::Color; pub use self::grid::{GridLine, TrackKeyword}; pub use self::image::{ColorStop, EndingShape as GradientEndingShape, Gradient}; -pub use self::image::{GradientItem, GradientKind, Image, ImageRect, LayerImage}; +pub use self::image::{GradientItem, GradientKind, Image, ImageRect, ImageLayer}; pub use self::length::AbsoluteLength; pub use self::length::{FontRelativeLength, ViewportPercentageLength, CharacterWidth, Length, CalcLengthOrPercentage}; pub use self::length::{Percentage, LengthOrNone, LengthOrNumber, LengthOrPercentage, LengthOrPercentageOrAuto}; diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index 822f34056e4..966d6785049 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -1800,7 +1800,7 @@ pub extern "C" fn Servo_DeclarationBlock_SetBackgroundImage(declarations: raw_extra_data: *mut URLExtraData) { use style::properties::PropertyDeclaration; use style::properties::longhands::background_image::SpecifiedValue as BackgroundImage; - use style::properties::longhands::background_image::single_value::SpecifiedValue as SingleBackgroundImage; + use style::values::Either; use style::values::generics::image::Image; use style::values::specified::url::SpecifiedUrl; @@ -1812,9 +1812,7 @@ pub extern "C" fn Servo_DeclarationBlock_SetBackgroundImage(declarations: QuirksMode::NoQuirks); if let Ok(url) = SpecifiedUrl::parse_from_string(string.into(), &context) { let decl = PropertyDeclaration::BackgroundImage(BackgroundImage( - vec![SingleBackgroundImage( - Some(Image::Url(url)) - )] + vec![Either::Second(Image::Url(url))] )); write_locked_arc(declarations, |decls: &mut PropertyDeclarationBlock| { decls.push(decl, Importance::Normal); diff --git a/tests/unit/style/properties/serialization.rs b/tests/unit/style/properties/serialization.rs index d784454f712..385aa900214 100644 --- a/tests/unit/style/properties/serialization.rs +++ b/tests/unit/style/properties/serialization.rs @@ -799,6 +799,7 @@ mod shorthand_serialization { use style::properties::longhands::mask_position_y as position_y; use style::properties::longhands::mask_repeat as repeat; use style::properties::longhands::mask_size as size; + use style::values::Either; use style::values::generics::image::Image; use super::*; @@ -828,9 +829,10 @@ mod shorthand_serialization { fn mask_should_serialize_all_available_properties_when_specified() { let mut properties = Vec::new(); - let image = single_vec_value_typedef!(image, - image::single_value::SpecifiedValue( - Some(Image::Url(SpecifiedUrl::new_for_testing("http://servo/test.png"))))); + let image = single_vec_value_typedef!( + image, + Either::Second(Image::Url(SpecifiedUrl::new_for_testing("http://servo/test.png"))) + ); let mode = single_vec_keyword_value!(mode, luminance); @@ -880,9 +882,10 @@ mod shorthand_serialization { fn mask_should_combine_origin_and_clip_properties_when_equal() { let mut properties = Vec::new(); - let image = single_vec_value_typedef!(image, - image::single_value::SpecifiedValue( - Some(Image::Url(SpecifiedUrl::new_for_testing("http://servo/test.png"))))); + let image = single_vec_value_typedef!( + image, + Either::Second(Image::Url(SpecifiedUrl::new_for_testing("http://servo/test.png"))) + ); let mode = single_vec_keyword_value!(mode, luminance);