Skip to content

Commit 29a9e41

Browse files
committed
downlevel relative colors with unknown alpha values
1 parent 4994306 commit 29a9e41

File tree

3 files changed

+16
-10
lines changed

3 files changed

+16
-10
lines changed

src/lib.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16376,6 +16376,7 @@ mod tests {
1637616376
--g: rgb(0 var(--x) 0 / var(--alpha));
1637716377
--h: rgb(0 0 var(--x) / var(--alpha));
1637816378
--i: rgb(none 0 0 / var(--alpha));
16379+
--j: rgb(from yellow r g b / var(--alpha));
1637916380
}
1638016381
"#,
1638116382
indoc! { r#"
@@ -16389,6 +16390,7 @@ mod tests {
1638916390
--g: rgb(0 var(--x) 0 / var(--alpha));
1639016391
--h: rgb(0 0 var(--x) / var(--alpha));
1639116392
--i: rgb(none 0 0 / var(--alpha));
16393+
--j: rgba(255, 255, 0, var(--alpha));
1639216394
}
1639316395
"#},
1639416396
Browsers {
@@ -16409,6 +16411,7 @@ mod tests {
1640916411
--g: rgb(0 var(--x) 0 / var(--alpha));
1641016412
--h: rgb(0 0 var(--x) / var(--alpha));
1641116413
--i: rgb(none 0 0 / var(--alpha));
16414+
--j: rgb(from yellow r g b / var(--alpha));
1641216415
}
1641316416
"#,
1641416417
indoc! { r#"
@@ -16422,6 +16425,7 @@ mod tests {
1642216425
--g: rgb(0 var(--x) 0 / var(--alpha));
1642316426
--h: rgb(0 0 var(--x) / var(--alpha));
1642416427
--i: rgb(none 0 0 / var(--alpha));
16428+
--j: rgb(255 255 0 / var(--alpha));
1642516429
}
1642616430
"#},
1642716431
Browsers {
@@ -16442,6 +16446,7 @@ mod tests {
1644216446
--g: hsl(0 0 var(--x) / var(--alpha));
1644316447
--h: hsl(270 100% 50% / calc(var(--alpha) / 2));
1644416448
--i: hsl(none 100% 50% / var(--alpha));
16449+
--j: hsl(from yellow h s l / var(--alpha));
1644516450
}
1644616451
"#,
1644716452
indoc! { r#"
@@ -16455,6 +16460,7 @@ mod tests {
1645516460
--g: hsl(0 0 var(--x) / var(--alpha));
1645616461
--h: hsla(270, 100%, 50%, calc(var(--alpha) / 2));
1645716462
--i: hsl(none 100% 50% / var(--alpha));
16463+
--j: hsla(60, 100%, 50%, var(--alpha));
1645816464
}
1645916465
"#},
1646016466
Browsers {

src/properties/custom.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::targets::{should_compile, Targets};
1111
use crate::traits::{Parse, ParseWithOptions, ToCss};
1212
use crate::values::angle::Angle;
1313
use crate::values::color::{
14-
parse_hsl_hwb_components, parse_rgb_components, ColorFallbackKind, ComponentParser, CssColor, RGBA,
14+
parse_hsl_hwb_components, parse_rgb_components, ColorFallbackKind, ComponentParser, CssColor, HSL, RGBA,
1515
};
1616
use crate::values::ident::{CustomIdent, DashedIdent, DashedIdentReference, Ident};
1717
use crate::values::length::{serialize_dimension, LengthValue};
@@ -1526,11 +1526,11 @@ impl<'i> UnresolvedColor<'i> {
15261526
input: &mut Parser<'i, 't>,
15271527
options: &ParserOptions<'_, 'i>,
15281528
) -> Result<Self, ParseError<'i, ParserError<'i>>> {
1529-
let parser = ComponentParser::new(false);
1529+
let mut parser = ComponentParser::new(false);
15301530
match_ignore_ascii_case! { &*f,
15311531
"rgb" => {
15321532
input.parse_nested_block(|input| {
1533-
let (r, g, b, is_legacy) = parse_rgb_components(input, &parser)?;
1533+
let (r, g, b, is_legacy) = parse_rgb_components(input, &mut parser)?;
15341534
if is_legacy {
15351535
return Err(input.new_custom_error(ParserError::InvalidValue))
15361536
}
@@ -1541,7 +1541,7 @@ impl<'i> UnresolvedColor<'i> {
15411541
},
15421542
"hsl" => {
15431543
input.parse_nested_block(|input| {
1544-
let (h, s, l, is_legacy) = parse_hsl_hwb_components(input, &parser, false)?;
1544+
let (h, s, l, is_legacy) = parse_hsl_hwb_components::<HSL>(input, &mut parser, false)?;
15451545
if is_legacy {
15461546
return Err(input.new_custom_error(ParserError::InvalidValue))
15471547
}

src/values/color.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1040,8 +1040,7 @@ fn parse_hsl_hwb<'i, 't, T: TryFrom<CssColor> + ColorSpace>(
10401040
) -> Result<(f32, f32, f32, f32), ParseError<'i, ParserError<'i>>> {
10411041
// https://drafts.csswg.org/css-color-4/#the-hsl-notation
10421042
let res = input.parse_nested_block(|input| {
1043-
parser.parse_relative::<T>(input)?;
1044-
let (h, a, b, is_legacy) = parse_hsl_hwb_components(input, parser, allows_legacy)?;
1043+
let (h, a, b, is_legacy) = parse_hsl_hwb_components::<T>(input, parser, allows_legacy)?;
10451044
let alpha = if is_legacy {
10461045
parse_legacy_alpha(input, parser)?
10471046
} else {
@@ -1055,11 +1054,12 @@ fn parse_hsl_hwb<'i, 't, T: TryFrom<CssColor> + ColorSpace>(
10551054
}
10561055

10571056
#[inline]
1058-
pub(crate) fn parse_hsl_hwb_components<'i, 't>(
1057+
pub(crate) fn parse_hsl_hwb_components<'i, 't, T: TryFrom<CssColor> + ColorSpace>(
10591058
input: &mut Parser<'i, 't>,
1060-
parser: &ComponentParser,
1059+
parser: &mut ComponentParser,
10611060
allows_legacy: bool,
10621061
) -> Result<(f32, f32, f32, bool), ParseError<'i, ParserError<'i>>> {
1062+
parser.parse_relative::<T>(input)?;
10631063
let h = parse_angle_or_number(input, parser)?;
10641064
let is_legacy_syntax =
10651065
allows_legacy && parser.from.is_none() && !h.is_nan() && input.try_parse(|p| p.expect_comma()).is_ok();
@@ -1081,7 +1081,6 @@ fn parse_rgb<'i, 't>(
10811081
) -> Result<CssColor, ParseError<'i, ParserError<'i>>> {
10821082
// https://drafts.csswg.org/css-color-4/#rgb-functions
10831083
let res = input.parse_nested_block(|input| {
1084-
parser.parse_relative::<SRGB>(input)?;
10851084
let (r, g, b, is_legacy) = parse_rgb_components(input, parser)?;
10861085
let alpha = if is_legacy {
10871086
parse_legacy_alpha(input, parser)?
@@ -1106,8 +1105,9 @@ fn parse_rgb<'i, 't>(
11061105
#[inline]
11071106
pub(crate) fn parse_rgb_components<'i, 't>(
11081107
input: &mut Parser<'i, 't>,
1109-
parser: &ComponentParser,
1108+
parser: &mut ComponentParser,
11101109
) -> Result<(f32, f32, f32, bool), ParseError<'i, ParserError<'i>>> {
1110+
parser.parse_relative::<SRGB>(input)?;
11111111
let red = parser.parse_number_or_percentage(input)?;
11121112
let is_legacy_syntax =
11131113
parser.from.is_none() && !red.unit_value().is_nan() && input.try_parse(|p| p.expect_comma()).is_ok();

0 commit comments

Comments
 (0)