style: Serialize a 0/0 ratio as 0/0 in all value stages.

Based on the update of github.com/w3c/csswg-drafts/issues/5084,
a 0/0 ratio will serialize as 0/0 in all value stages.

Differential Revision: https://phabricator.services.mozilla.com/D93182
This commit is contained in:
Boris Chiou 2020-10-12 15:05:46 +00:00 committed by Emilio Cobos Álvarez
parent 436632f378
commit 61685ca9b3
3 changed files with 17 additions and 10 deletions

View file

@ -87,8 +87,12 @@ fn eval_aspect_ratio_for<F>(
where where
F: FnOnce(&Device) -> Size2D<Au>, F: FnOnce(&Device) -> Size2D<Au>,
{ {
// A ratio of 0/0 behaves as the ratio 1/0, so we need to call used_value()
// to convert it if necessary.
// FIXME: we may need to update here once
// https://github.com/w3c/csswg-drafts/issues/4954 got resolved.
let query_value = match query_value { let query_value = match query_value {
Some(v) => v, Some(v) => v.used_value(),
None => return true, None => return true,
}; };

View file

@ -15,7 +15,7 @@ use crate::values::generics::position::PositionOrAuto as GenericPositionOrAuto;
use crate::values::generics::position::Ratio as GenericRatio; use crate::values::generics::position::Ratio as GenericRatio;
use crate::values::generics::position::ZIndex as GenericZIndex; use crate::values::generics::position::ZIndex as GenericZIndex;
pub use crate::values::specified::position::{GridAutoFlow, GridTemplateAreas, MasonryAutoFlow}; pub use crate::values::specified::position::{GridAutoFlow, GridTemplateAreas, MasonryAutoFlow};
use crate::Zero; use crate::{One, Zero};
use std::cmp::{Ordering, PartialOrd}; use std::cmp::{Ordering, PartialOrd};
use std::fmt::{self, Write}; use std::fmt::{self, Write};
use style_traits::{CssWriter, ToCss}; use style_traits::{CssWriter, ToCss};
@ -89,6 +89,16 @@ impl Ratio {
pub fn new(a: f32, b: f32) -> Self { pub fn new(a: f32, b: f32) -> Self {
GenericRatio(a.into(), b.into()) GenericRatio(a.into(), b.into())
} }
/// Returns the used value. A ratio of 0/0 behaves as the ratio 1/0.
/// https://drafts.csswg.org/css-values-4/#ratios
pub fn used_value(self) -> Self {
if self.0.is_zero() && self.1.is_zero() {
Ratio::new(One::one(), Zero::zero())
} else {
self
}
}
} }
/// A computed value for the `aspect-ratio` property. /// A computed value for the `aspect-ratio` property.

View file

@ -951,13 +951,6 @@ impl Parse for Ratio {
_ => One::one(), _ => One::one(),
}; };
// The computed value of a <ratio> is the pair of numbers provided, unless Ok(GenericRatio(a, b))
// both numbers are zero, in which case the computed value is the pair (1, 0)
// (same as 1 / 0).
// https://drafts.csswg.org/css-values-4/#ratios
if a.is_zero() && b.is_zero() {
return Ok(GenericRatio(One::one(), Zero::zero()));
}
return Ok(GenericRatio(a, b));
} }
} }