mirror of
https://github.com/servo/servo.git
synced 2025-08-14 01:45:33 +01:00
style: Experiment with implementing zoom as a transform + transform-origin shorthand.
This is a gross hack, of course, but has the advantage of not breaking sites that use both zoom and -moz-transform / -moz-transform-origin. There should be no behavior change when the pref is off, of course, and the webcompat team wanted to experiment with this. Differential Revision: https://phabricator.services.mozilla.com/D49792
This commit is contained in:
parent
ca05003ef6
commit
854c480177
7 changed files with 136 additions and 24 deletions
|
@ -13,7 +13,6 @@
|
|||
# "offset"
|
||||
COUNTED_UNKNOWN_PROPERTIES = [
|
||||
"-webkit-font-smoothing",
|
||||
"zoom",
|
||||
"-webkit-tap-highlight-color",
|
||||
"speak",
|
||||
"text-size-adjust",
|
||||
|
|
|
@ -1876,7 +1876,16 @@ impl PropertyId {
|
|||
if let Some(id) = static_id(property_name) {
|
||||
return Ok(match *id {
|
||||
StaticId::Longhand(id) => PropertyId::Longhand(id),
|
||||
StaticId::Shorthand(id) => PropertyId::Shorthand(id),
|
||||
StaticId::Shorthand(id) => {
|
||||
// We want to count `zoom` even if disabled.
|
||||
if matches!(id, ShorthandId::Zoom) {
|
||||
if let Some(counters) = use_counters {
|
||||
counters.non_custom_properties.record(id.into());
|
||||
}
|
||||
}
|
||||
|
||||
PropertyId::Shorthand(id)
|
||||
},
|
||||
StaticId::LonghandAlias(id, alias) => PropertyId::LonghandAlias(id, alias),
|
||||
StaticId::ShorthandAlias(id, alias) => PropertyId::ShorthandAlias(id, alias),
|
||||
StaticId::CountedUnknown(unknown_prop) => {
|
||||
|
|
|
@ -441,3 +441,58 @@ ${helpers.two_properties_shorthand(
|
|||
}
|
||||
}
|
||||
</%helpers:shorthand>
|
||||
|
||||
<%helpers:shorthand name="zoom" engines="gecko"
|
||||
sub_properties="transform transform-origin"
|
||||
gecko_pref="layout.css.zoom-transform-hack.enabled"
|
||||
flags="SHORTHAND_IN_GETCS IS_LEGACY_SHORTHAND"
|
||||
spec="Not a standard, only a compat hack">
|
||||
use crate::parser::Parse;
|
||||
use crate::values::specified::{Number, NumberOrPercentage, TransformOrigin};
|
||||
use crate::values::generics::transform::{Transform, TransformOperation};
|
||||
|
||||
pub fn parse_value<'i, 't>(
|
||||
context: &ParserContext,
|
||||
input: &mut Parser<'i, 't>,
|
||||
) -> Result<Longhands, ParseError<'i>> {
|
||||
let zoom = match input.try(|input| NumberOrPercentage::parse(context, input)) {
|
||||
Ok(number_or_percent) => number_or_percent.to_number(),
|
||||
Err(..) => {
|
||||
input.expect_ident_matching("normal")?;
|
||||
Number::new(1.0)
|
||||
},
|
||||
};
|
||||
|
||||
// Make sure that the initial value matches the values for the
|
||||
// longhands, just for general sanity.
|
||||
//
|
||||
// FIXME: Should we just do this for the "normal" case? Seems weird
|
||||
// either way, so maybe not?
|
||||
Ok(if zoom.get() == 1.0 {
|
||||
expanded! {
|
||||
transform: Transform::none(),
|
||||
transform_origin: TransformOrigin::initial_value(),
|
||||
}
|
||||
} else {
|
||||
expanded! {
|
||||
transform: Transform(vec![TransformOperation::Scale(zoom, zoom)].into()),
|
||||
transform_origin: TransformOrigin::zero_zero(),
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
impl<'a> ToCss for LonghandsToSerialize<'a> {
|
||||
fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
|
||||
if self.transform.0.is_empty() && *self.transform_origin == TransformOrigin::initial_value() {
|
||||
return 1.0f32.to_css(dest);
|
||||
}
|
||||
if *self.transform_origin != TransformOrigin::zero_zero() {
|
||||
return Ok(())
|
||||
}
|
||||
match &*self.transform.0 {
|
||||
[TransformOperation::Scale(x, y)] if x == y => x.to_css(dest),
|
||||
_ => Ok(()),
|
||||
}
|
||||
}
|
||||
}
|
||||
</%helpers:shorthand>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue