mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
Introduce ComputedUrl
Add web platform tests for computed URL styles Mark url with no original or resolved unreachable Update the WPT manifest for new url tests
This commit is contained in:
parent
f6aa17add9
commit
14c5a1b8d3
17 changed files with 197 additions and 46 deletions
|
@ -9,17 +9,17 @@
|
|||
|
||||
use std::fmt;
|
||||
use style_traits::ToCss;
|
||||
use values::computed::LengthOrPercentage;
|
||||
use values::computed::{LengthOrPercentage, ComputedUrl};
|
||||
use values::generics::basic_shape::{BasicShape as GenericBasicShape};
|
||||
use values::generics::basic_shape::{Circle as GenericCircle, ClippingShape as GenericClippingShape};
|
||||
use values::generics::basic_shape::{Ellipse as GenericEllipse, FloatAreaShape as GenericFloatAreaShape};
|
||||
use values::generics::basic_shape::{InsetRect as GenericInsetRect, ShapeRadius as GenericShapeRadius};
|
||||
|
||||
/// A specified clipping shape.
|
||||
pub type ClippingShape = GenericClippingShape<BasicShape>;
|
||||
pub type ClippingShape = GenericClippingShape<BasicShape, ComputedUrl>;
|
||||
|
||||
/// A specified float area shape.
|
||||
pub type FloatAreaShape = GenericFloatAreaShape<BasicShape>;
|
||||
pub type FloatAreaShape = GenericFloatAreaShape<BasicShape, ComputedUrl>;
|
||||
|
||||
/// A computed basic shape.
|
||||
pub type BasicShape = GenericBasicShape<LengthOrPercentage, LengthOrPercentage, LengthOrPercentage>;
|
||||
|
|
|
@ -12,7 +12,7 @@ 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::{Angle, ComputedUrl, Context, Length, LengthOrPercentage, NumberOrPercentage, ToComputedValue};
|
||||
use values::computed::position::Position;
|
||||
use values::generics::image::{CompatMode, ColorStop as GenericColorStop, EndingShape as GenericEndingShape};
|
||||
use values::generics::image::{Gradient as GenericGradient, GradientItem as GenericGradientItem};
|
||||
|
@ -27,7 +27,7 @@ pub type ImageLayer = Either<None_, Image>;
|
|||
|
||||
/// Computed values for an image according to CSS-IMAGES.
|
||||
/// https://drafts.csswg.org/css-images/#image-values
|
||||
pub type Image = GenericImage<Gradient, MozImageRect>;
|
||||
pub type Image = GenericImage<Gradient, MozImageRect, ComputedUrl>;
|
||||
|
||||
/// Computed values for a CSS gradient.
|
||||
/// https://drafts.csswg.org/css-images/#gradients
|
||||
|
@ -76,7 +76,7 @@ pub type GradientItem = GenericGradientItem<RGBA, LengthOrPercentage>;
|
|||
pub type ColorStop = GenericColorStop<RGBA, LengthOrPercentage>;
|
||||
|
||||
/// Computed values for `-moz-image-rect(...)`.
|
||||
pub type MozImageRect = GenericMozImageRect<NumberOrPercentage>;
|
||||
pub type MozImageRect = GenericMozImageRect<NumberOrPercentage, ComputedUrl>;
|
||||
|
||||
impl GenericLineDirection for LineDirection {
|
||||
fn points_downwards(&self) -> bool {
|
||||
|
|
|
@ -12,10 +12,14 @@ use media_queries::Device;
|
|||
#[cfg(feature = "gecko")]
|
||||
use properties;
|
||||
use properties::{ComputedValues, StyleBuilder};
|
||||
#[cfg(feature = "servo")]
|
||||
use servo_url::ServoUrl;
|
||||
use std::f32;
|
||||
use std::f64;
|
||||
use std::f64::consts::PI;
|
||||
use std::fmt;
|
||||
#[cfg(feature = "servo")]
|
||||
use std::sync::Arc;
|
||||
use style_traits::ToCss;
|
||||
use super::{CSSFloat, CSSInteger};
|
||||
use super::generics::{GreaterThanOrEqualToOne, NonNegative};
|
||||
|
@ -39,9 +43,8 @@ pub use self::image::{Gradient, GradientItem, Image, ImageLayer, LineDirection,
|
|||
pub use self::gecko::ScrollSnapPoint;
|
||||
pub use self::rect::LengthOrNumberRect;
|
||||
pub use super::{Auto, Either, None_};
|
||||
pub use super::specified::{BorderStyle, UrlOrNone};
|
||||
pub use super::specified::BorderStyle;
|
||||
pub use super::generics::grid::GridLine;
|
||||
pub use super::specified::url::SpecifiedUrl;
|
||||
pub use self::length::{CalcLengthOrPercentage, Length, LengthOrNone, LengthOrNumber, LengthOrPercentage};
|
||||
pub use self::length::{LengthOrPercentageOrAuto, LengthOrPercentageOrNone, MaxLength, MozLength};
|
||||
pub use self::length::NonNegativeLengthOrPercentage;
|
||||
|
@ -684,3 +687,45 @@ impl ToComputedValue for specified::Percentage {
|
|||
specified::Percentage::new(computed.0)
|
||||
}
|
||||
}
|
||||
|
||||
/// The computed value of a CSS `url()`, resolved relative to the stylesheet URL.
|
||||
#[cfg(feature = "servo")]
|
||||
#[derive(Clone, Debug, HeapSizeOf, Serialize, Deserialize, PartialEq)]
|
||||
pub enum ComputedUrl {
|
||||
/// The `url()` was invalid or it wasn't specified by the user.
|
||||
Invalid(Arc<String>),
|
||||
/// The resolved `url()` relative to the stylesheet URL.
|
||||
Valid(ServoUrl),
|
||||
}
|
||||
|
||||
/// TODO: Properly build ComputedUrl for gecko
|
||||
#[cfg(feature = "gecko")]
|
||||
pub type ComputedUrl = specified::url::SpecifiedUrl;
|
||||
|
||||
#[cfg(feature = "servo")]
|
||||
impl ComputedUrl {
|
||||
/// Returns the resolved url if it was valid.
|
||||
pub fn url(&self) -> Option<&ServoUrl> {
|
||||
match *self {
|
||||
ComputedUrl::Valid(ref url) => Some(url),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "servo")]
|
||||
impl ToCss for ComputedUrl {
|
||||
fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
|
||||
let string = match *self {
|
||||
ComputedUrl::Valid(ref url) => url.as_str(),
|
||||
ComputedUrl::Invalid(ref invalid_string) => invalid_string,
|
||||
};
|
||||
|
||||
dest.write_str("url(")?;
|
||||
string.to_css(dest)?;
|
||||
dest.write_str(")")
|
||||
}
|
||||
}
|
||||
|
||||
/// <url> | <none>
|
||||
pub type UrlOrNone = Either<ComputedUrl, None_>;
|
||||
|
|
|
@ -8,12 +8,13 @@ use app_units::Au;
|
|||
use values::{Either, RGBA};
|
||||
use values::computed::{LengthOrPercentageOrNumber, Opacity};
|
||||
use values::computed::{NonNegativeAu, NonNegativeLengthOrPercentageOrNumber};
|
||||
use values::computed::ComputedUrl;
|
||||
use values::generics::svg as generic;
|
||||
|
||||
/// Computed SVG Paint value
|
||||
pub type SVGPaint = generic::SVGPaint<RGBA>;
|
||||
pub type SVGPaint = generic::SVGPaint<RGBA, ComputedUrl>;
|
||||
/// Computed SVG Paint Kind value
|
||||
pub type SVGPaintKind = generic::SVGPaintKind<RGBA>;
|
||||
pub type SVGPaintKind = generic::SVGPaintKind<RGBA, ComputedUrl>;
|
||||
|
||||
impl Default for SVGPaint {
|
||||
fn default() -> Self {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue