mirror of
https://github.com/servo/servo.git
synced 2025-06-21 07:38:59 +01:00
style: Add percentage for opacity (i.e. <alpha-value>).
The following properties accept <alpha-value> [1], which is "<number> | <percentage>", so we update the parser, spec links, and their web-platform-tests. 1. opacity 2. flood-opacity 3. fill-opacity 4. stroke-opacity 5. stop-opacity 6. -moz-window-opacity Besides, shape-image-threshold [2] still only accepts <number>, so we need to support a different version of `Opacity::parse()`. [1] https://drafts.csswg.org/css-color/#typedef-alpha-value [2] https://drafts.csswg.org/css-shapes/#shape-image-threshold-property Differential Revision: https://phabricator.services.mozilla.com/D37493
This commit is contained in:
parent
65bf72f131
commit
87231e676d
5 changed files with 43 additions and 14 deletions
|
@ -601,8 +601,10 @@ ${helpers.predefined_type(
|
|||
spec="https://drafts.csswg.org/css-will-change/#will-change",
|
||||
)}
|
||||
|
||||
// The spec issue for the parse_method: https://github.com/w3c/csswg-drafts/issues/4102.
|
||||
${helpers.predefined_type(
|
||||
"shape-image-threshold", "Opacity", "0.0",
|
||||
parse_method="parse_number",
|
||||
products="gecko",
|
||||
animation_value_type="ComputedValue",
|
||||
spec="https://drafts.csswg.org/css-shapes/#shape-image-threshold-property",
|
||||
|
|
|
@ -13,7 +13,7 @@ ${helpers.predefined_type(
|
|||
"1.0",
|
||||
animation_value_type="ComputedValue",
|
||||
flags="CREATES_STACKING_CONTEXT CAN_ANIMATE_ON_COMPOSITOR",
|
||||
spec="https://drafts.csswg.org/css-color/#opacity",
|
||||
spec="https://drafts.csswg.org/css-color/#transparency",
|
||||
servo_restyle_damage = "reflow_out_of_flow",
|
||||
)}
|
||||
|
||||
|
|
|
@ -52,7 +52,7 @@ ${helpers.predefined_type(
|
|||
"Default::default()",
|
||||
products="gecko",
|
||||
animation_value_type="ComputedValue",
|
||||
spec="https://www.w3.org/TR/SVG11/painting.html#FillOpacityProperty",
|
||||
spec="https://svgwg.org/svg2-draft/painting.html#FillOpacity",
|
||||
)}
|
||||
|
||||
${helpers.predefined_type(
|
||||
|
@ -123,7 +123,7 @@ ${helpers.predefined_type(
|
|||
"Default::default()",
|
||||
products="gecko",
|
||||
animation_value_type="ComputedValue",
|
||||
spec="https://www.w3.org/TR/SVG11/painting.html#StrokeOpacityProperty",
|
||||
spec="https://svgwg.org/svg2-draft/painting.html#StrokeOpacity",
|
||||
)}
|
||||
|
||||
${helpers.predefined_type(
|
||||
|
|
|
@ -40,7 +40,7 @@ ${helpers.predefined_type(
|
|||
"1.0",
|
||||
products="gecko",
|
||||
animation_value_type="ComputedValue",
|
||||
spec="https://www.w3.org/TR/SVGTiny12/painting.html#propdef-stop-opacity",
|
||||
spec="https://svgwg.org/svg2-draft/pservers.html#StopOpacityProperty",
|
||||
)}
|
||||
|
||||
// Section 15 - Filter Effects
|
||||
|
@ -60,7 +60,7 @@ ${helpers.predefined_type(
|
|||
"1.0",
|
||||
products="gecko",
|
||||
animation_value_type="ComputedValue",
|
||||
spec="https://www.w3.org/TR/SVG/filters.html#FloodOpacityProperty",
|
||||
spec="https://drafts.fxtf.org/filter-effects/#FloodOpacityProperty",
|
||||
)}
|
||||
|
||||
${helpers.predefined_type(
|
||||
|
|
|
@ -142,8 +142,8 @@ fn parse_number_with_clamping_mode<'i, 't>(
|
|||
value: value.min(f32::MAX).max(f32::MIN),
|
||||
calc_clamping_mode: None,
|
||||
});
|
||||
},
|
||||
Token::Function(ref name) if name.eq_ignore_ascii_case("calc") => {},
|
||||
}
|
||||
Token::Function(ref name) if name.eq_ignore_ascii_case("calc") => {}
|
||||
ref t => return Err(location.new_unexpected_token_error(t.clone())),
|
||||
}
|
||||
|
||||
|
@ -402,14 +402,18 @@ impl Parse for NonNegativeNumberOrPercentage {
|
|||
}
|
||||
}
|
||||
|
||||
#[allow(missing_docs)]
|
||||
/// The value of Opacity is <alpha-value>, which is "<number> | <percentage>".
|
||||
/// However, we serialize the specified value as number, so it's ok to store
|
||||
/// the Opacity as Number.
|
||||
#[derive(
|
||||
Clone, Copy, Debug, MallocSizeOf, PartialEq, PartialOrd, SpecifiedValueInfo, ToCss, ToShmem,
|
||||
)]
|
||||
pub struct Opacity(Number);
|
||||
|
||||
impl Parse for Opacity {
|
||||
fn parse<'i, 't>(
|
||||
impl Opacity {
|
||||
/// Parse number value only.
|
||||
#[inline]
|
||||
pub fn parse_number<'i, 't>(
|
||||
context: &ParserContext,
|
||||
input: &mut Parser<'i, 't>,
|
||||
) -> Result<Self, ParseError<'i>> {
|
||||
|
@ -417,6 +421,29 @@ impl Parse for Opacity {
|
|||
}
|
||||
}
|
||||
|
||||
impl Parse for Opacity {
|
||||
/// Opacity accepts <number> | <percentage>, so we parse it as NumberOrPercentage,
|
||||
/// and then convert into an Number if it's a Percentage.
|
||||
/// https://drafts.csswg.org/cssom/#serializing-css-values
|
||||
fn parse<'i, 't>(
|
||||
context: &ParserContext,
|
||||
input: &mut Parser<'i, 't>,
|
||||
) -> Result<Self, ParseError<'i>> {
|
||||
let number = match NumberOrPercentage::parse(context, input)? {
|
||||
NumberOrPercentage::Percentage(p) => Number {
|
||||
value: p.get(),
|
||||
calc_clamping_mode: if p.is_calc() {
|
||||
Some(AllowedNumericType::All)
|
||||
} else {
|
||||
None
|
||||
},
|
||||
},
|
||||
NumberOrPercentage::Number(n) => n,
|
||||
};
|
||||
Ok(Opacity(number))
|
||||
}
|
||||
}
|
||||
|
||||
impl ToComputedValue for Opacity {
|
||||
type ComputedValue = CSSFloat;
|
||||
|
||||
|
@ -510,7 +537,7 @@ impl Parse for Integer {
|
|||
Token::Number {
|
||||
int_value: Some(v), ..
|
||||
} => return Ok(Integer::new(v)),
|
||||
Token::Function(ref name) if name.eq_ignore_ascii_case("calc") => {},
|
||||
Token::Function(ref name) if name.eq_ignore_ascii_case("calc") => {}
|
||||
ref t => return Err(location.new_unexpected_token_error(t.clone())),
|
||||
}
|
||||
|
||||
|
@ -786,7 +813,7 @@ impl Attr {
|
|||
None => {
|
||||
return Err(location
|
||||
.new_custom_error(StyleParseErrorKind::UnspecifiedError));
|
||||
},
|
||||
}
|
||||
};
|
||||
Some((prefix, ns))
|
||||
} else {
|
||||
|
@ -796,10 +823,10 @@ impl Attr {
|
|||
namespace: prefix_and_ns,
|
||||
attribute: Atom::from(second_token.as_ref()),
|
||||
});
|
||||
},
|
||||
}
|
||||
// In the case of attr(foobar ) we don't want to error out
|
||||
// because of the trailing whitespace
|
||||
Token::WhiteSpace(..) => {},
|
||||
Token::WhiteSpace(..) => {}
|
||||
ref t => return Err(input.new_unexpected_token_error(t.clone())),
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue