Skip to content

Commit c85cd37

Browse files
committed
Add remaining preference media queries
This adds `prefers-contrast`, `prefers-reduced-motion`, and `prefers-reduced-transparency`. Signed-off-by: Luke Warlow <lwarlow@igalia.com>
1 parent 9a413b4 commit c85cd37

4 files changed

Lines changed: 155 additions & 32 deletions

File tree

style/gecko/media_features.rs

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ use crate::gecko_bindings::structs;
1010
use crate::media_queries::{Device, MediaType};
1111
use crate::parser::ParserContext;
1212
use crate::queries::feature::{AllowsRanges, Evaluator, FeatureFlags, QueryFeatureDescription};
13-
use crate::queries::values::{Orientation, PrefersColorScheme};
13+
use crate::queries::values::{
14+
Orientation, PrefersColorScheme, PrefersContrast, PrefersReducedMotion,
15+
PrefersReducedTransparency,
16+
};
1417
use crate::values::computed::{CSSPixelLength, Context, Ratio, Resolution};
1518
use crate::values::specified::color::ForcedColors;
1619
use app_units::Au;
@@ -183,20 +186,6 @@ fn eval_resolution(context: &Context) -> Resolution {
183186
Resolution::from_dppx(resolution_dppx)
184187
}
185188

186-
#[derive(Clone, Copy, Debug, FromPrimitive, Parse, ToCss)]
187-
#[repr(u8)]
188-
enum PrefersReducedMotion {
189-
NoPreference,
190-
Reduce,
191-
}
192-
193-
#[derive(Clone, Copy, Debug, FromPrimitive, Parse, ToCss)]
194-
#[repr(u8)]
195-
enum PrefersReducedTransparency {
196-
NoPreference,
197-
Reduce,
198-
}
199-
200189
/// Values for the dynamic-range and video-dynamic-range media features.
201190
/// https://drafts.csswg.org/mediaqueries-5/#dynamic-range
202191
/// This implements PartialOrd so that lower values will correctly match
@@ -246,21 +235,6 @@ fn eval_prefers_reduced_transparency(
246235
}
247236
}
248237

249-
/// Possible values for prefers-contrast media query.
250-
/// https://drafts.csswg.org/mediaqueries-5/#prefers-contrast
251-
#[derive(Clone, Copy, Debug, FromPrimitive, Parse, PartialEq, ToCss)]
252-
#[repr(u8)]
253-
pub enum PrefersContrast {
254-
/// More contrast is preferred.
255-
More,
256-
/// Low contrast is preferred.
257-
Less,
258-
/// Custom (not more, not less).
259-
Custom,
260-
/// The default value if neither high or low contrast is enabled.
261-
NoPreference,
262-
}
263-
264238
/// https://drafts.csswg.org/mediaqueries-5/#prefers-contrast
265239
fn eval_prefers_contrast(context: &Context, query_value: Option<PrefersContrast>) -> bool {
266240
let prefers_contrast =

style/queries/values.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,36 @@ pub enum PrefersColorScheme {
4444
Light,
4545
Dark,
4646
}
47+
48+
/// Possible values for prefers-contrast media query.
49+
/// https://drafts.csswg.org/mediaqueries-5/#prefers-contrast
50+
#[derive(Clone, Copy, Debug, FromPrimitive, Parse, PartialEq, ToCss)]
51+
#[repr(u8)]
52+
pub enum PrefersContrast {
53+
/// More contrast is preferred.
54+
More,
55+
/// Low contrast is preferred.
56+
Less,
57+
/// Custom (not more, not less).
58+
Custom,
59+
/// The default value if neither high or low contrast is enabled.
60+
NoPreference,
61+
}
62+
63+
/// Values for the prefers-reduced-motion media feature.
64+
#[derive(Clone, Copy, Debug, FromPrimitive, Parse, PartialEq, ToCss)]
65+
#[repr(u8)]
66+
#[allow(missing_docs)]
67+
pub enum PrefersReducedMotion {
68+
NoPreference,
69+
Reduce,
70+
}
71+
72+
/// Values for the prefers-reduced-transparency media feature.
73+
#[derive(Clone, Copy, Debug, FromPrimitive, Parse, PartialEq, ToCss)]
74+
#[repr(u8)]
75+
#[allow(missing_docs)]
76+
pub enum PrefersReducedTransparency {
77+
NoPreference,
78+
Reduce,
79+
}

style/servo/media_queries.rs

Lines changed: 115 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ use crate::media_queries::MediaType;
1414
use crate::properties::style_structs::Font;
1515
use crate::properties::ComputedValues;
1616
use crate::queries::feature::{AllowsRanges, Evaluator, FeatureFlags, QueryFeatureDescription};
17-
use crate::queries::values::PrefersColorScheme;
17+
use crate::queries::values::{
18+
PrefersColorScheme, PrefersContrast, PrefersReducedMotion, PrefersReducedTransparency,
19+
};
1820
use crate::values::computed::font::GenericFontFamily;
1921
use crate::values::computed::{
2022
CSSPixelLength, Context, Length, LineHeight, NonNegativeLength, Resolution,
@@ -117,6 +119,15 @@ pub struct Device {
117119
/// Whether the user prefers light mode or dark mode
118120
#[ignore_malloc_size_of = "Pure stack type"]
119121
prefers_color_scheme: PrefersColorScheme,
122+
/// The users contrast preference
123+
#[ignore_malloc_size_of = "Pure stack type"]
124+
prefers_contrast: PrefersContrast,
125+
/// The users motion preference
126+
#[ignore_malloc_size_of = "Pure stack type"]
127+
prefers_reduced_motion: PrefersReducedMotion,
128+
/// The users transparency preference
129+
#[ignore_malloc_size_of = "Pure stack type"]
130+
prefers_reduced_transparency: PrefersReducedTransparency,
120131
/// The CssEnvironment object responsible of getting CSS environment
121132
/// variables.
122133
environment: CssEnvironment,
@@ -138,6 +149,9 @@ impl Device {
138149
font_metrics_provider: Box<dyn FontMetricsProvider>,
139150
default_computed_values: Arc<ComputedValues>,
140151
prefers_color_scheme: PrefersColorScheme,
152+
prefers_contrast: PrefersContrast,
153+
prefers_reduced_motion: PrefersReducedMotion,
154+
prefers_reduced_transparency: PrefersReducedTransparency,
141155
) -> Device {
142156
let default_values =
143157
ComputedValues::initial_values_with_font_override(Font::initial_values());
@@ -160,6 +174,9 @@ impl Device {
160174
used_font_metrics: AtomicBool::new(false),
161175
used_viewport_units: AtomicBool::new(false),
162176
prefers_color_scheme,
177+
prefers_contrast,
178+
prefers_reduced_motion,
179+
prefers_reduced_transparency,
163180
environment: CssEnvironment,
164181
font_metrics_provider,
165182
default_computed_values,
@@ -505,6 +522,51 @@ impl Device {
505522
false
506523
}
507524

525+
/// Set the [`PrefersContrast`] value on this [`Device`].
526+
///
527+
/// Note that this does not update any associated `Stylist`. For this you must call
528+
/// `Stylist::media_features_change_changed_style` and
529+
/// `Stylist::force_stylesheet_origins_dirty`.
530+
pub fn set_prefers_contrast(&mut self, new_prefers_contrast: PrefersContrast) {
531+
self.prefers_contrast = new_prefers_contrast;
532+
}
533+
534+
/// Returns the preferred contrast of this [`Device`].
535+
pub fn prefers_contrast(&self) -> PrefersContrast {
536+
self.prefers_contrast
537+
}
538+
539+
/// Set the [`PrefersReducedMotion`] value on this [`Device`].
540+
///
541+
/// Note that this does not update any associated `Stylist`. For this you must call
542+
/// `Stylist::media_features_change_changed_style` and
543+
/// `Stylist::force_stylesheet_origins_dirty`.
544+
pub fn set_prefers_reduced_motion(&mut self, new_prefers_reduced_motion: PrefersReducedMotion) {
545+
self.prefers_reduced_motion = new_prefers_reduced_motion;
546+
}
547+
548+
/// Returns the preferred contrast of this [`Device`].
549+
pub fn prefers_reduced_motion(&self) -> PrefersReducedMotion {
550+
self.prefers_reduced_motion
551+
}
552+
553+
/// Set the [`PrefersReducedTransparency`] value on this [`Device`].
554+
///
555+
/// Note that this does not update any associated `Stylist`. For this you must call
556+
/// `Stylist::media_features_change_changed_style` and
557+
/// `Stylist::force_stylesheet_origins_dirty`.
558+
pub fn set_prefers_reduced_transparency(
559+
&mut self,
560+
new_prefers_reduced_transparency: PrefersReducedTransparency,
561+
) {
562+
self.prefers_reduced_transparency = new_prefers_reduced_transparency;
563+
}
564+
565+
/// Returns the preferred contrast of this [`Device`].
566+
pub fn prefers_reduced_transparency(&self) -> PrefersReducedTransparency {
567+
self.prefers_reduced_transparency
568+
}
569+
508570
/// Returns safe area insets
509571
pub fn safe_area_insets(&self) -> SideOffsets2D<f32, CSSPixel> {
510572
SideOffsets2D::zero()
@@ -570,8 +632,38 @@ fn eval_prefers_color_scheme(context: &Context, query_value: Option<PrefersColor
570632
}
571633
}
572634

635+
fn eval_prefers_contrast(context: &Context, query_value: Option<PrefersContrast>) -> bool {
636+
let prefers_contrast = context.device().prefers_contrast;
637+
match query_value {
638+
Some(v) => prefers_contrast == v,
639+
None => prefers_contrast != PrefersContrast::NoPreference,
640+
}
641+
}
642+
643+
fn eval_prefers_reduced_motion(
644+
context: &Context,
645+
query_value: Option<PrefersReducedMotion>,
646+
) -> bool {
647+
let prefers_reduced_motion = context.device().prefers_reduced_motion;
648+
match query_value {
649+
Some(v) => prefers_reduced_motion == v,
650+
None => prefers_reduced_motion != PrefersReducedMotion::NoPreference,
651+
}
652+
}
653+
654+
fn eval_prefers_reduced_transparency(
655+
context: &Context,
656+
query_value: Option<PrefersReducedTransparency>,
657+
) -> bool {
658+
let prefers_reduced_transparency = context.device().prefers_reduced_transparency;
659+
match query_value {
660+
Some(v) => prefers_reduced_transparency == v,
661+
None => prefers_reduced_transparency != PrefersReducedTransparency::NoPreference,
662+
}
663+
}
664+
573665
/// A list with all the media features that Servo supports.
574-
pub static MEDIA_FEATURES: [QueryFeatureDescription; 6] = [
666+
pub static MEDIA_FEATURES: [QueryFeatureDescription; 9] = [
575667
feature!(
576668
atom!("width"),
577669
AllowsRanges::Yes,
@@ -608,4 +700,25 @@ pub static MEDIA_FEATURES: [QueryFeatureDescription; 6] = [
608700
keyword_evaluator!(eval_prefers_color_scheme, PrefersColorScheme),
609701
FeatureFlags::empty(),
610702
),
703+
feature!(
704+
atom!("prefers-contrast"),
705+
AllowsRanges::No,
706+
keyword_evaluator!(eval_prefers_contrast, PrefersContrast),
707+
FeatureFlags::empty(),
708+
),
709+
feature!(
710+
atom!("prefers-reduced-motion"),
711+
AllowsRanges::No,
712+
keyword_evaluator!(eval_prefers_reduced_motion, PrefersReducedMotion),
713+
FeatureFlags::empty(),
714+
),
715+
feature!(
716+
atom!("prefers-reduced-transparency"),
717+
AllowsRanges::No,
718+
keyword_evaluator!(
719+
eval_prefers_reduced_transparency,
720+
PrefersReducedTransparency
721+
),
722+
FeatureFlags::empty(),
723+
),
611724
];

stylo_atoms/static_atoms.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@ playing
111111
popstate
112112
postershown
113113
prefers-color-scheme
114+
prefers-contrast
115+
prefers-reduced-motion
116+
prefers-reduced-transparency
114117
print
115118
progress
116119
radio

0 commit comments

Comments
 (0)