diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs index 9fb5a5609f14..90499388153a 100644 --- a/components/script/dom/htmllinkelement.rs +++ b/components/script/dom/htmllinkelement.rs @@ -359,8 +359,7 @@ impl FetchResponseListener for StylesheetContext { Some(environment_encoding), Origin::Author, win.css_error_reporter(), ParserContextExtraData::default()); - let media = self.media.take().unwrap(); - sheet.set_media(Some(media)); + sheet.set_media(self.media.take().unwrap()); let sheet = Arc::new(sheet); let win = window_from_node(&*elem); diff --git a/components/script/dom/htmlmetaelement.rs b/components/script/dom/htmlmetaelement.rs index 14f9cd78555c..7ddca9f2f8a0 100644 --- a/components/script/dom/htmlmetaelement.rs +++ b/components/script/dom/htmlmetaelement.rs @@ -83,7 +83,7 @@ impl HTMLMetaElement { *self.stylesheet.borrow_mut() = Some(Arc::new(Stylesheet { rules: vec![CSSRule::Viewport(Arc::new(RwLock::new(translated_rule)))], origin: Origin::Author, - media: None, + media: Default::default(), // Viewport constraints are always recomputed on resize; they don't need to // force all styles to be recomputed. dirty_on_viewport_size_change: false, diff --git a/components/script/dom/htmlstyleelement.rs b/components/script/dom/htmlstyleelement.rs index 34d5ba79ec94..8c1bc031dc0d 100644 --- a/components/script/dom/htmlstyleelement.rs +++ b/components/script/dom/htmlstyleelement.rs @@ -65,8 +65,7 @@ impl HTMLStyleElement { let mut sheet = Stylesheet::from_str(&data, url, Origin::Author, win.css_error_reporter(), ParserContextExtraData::default()); let mut css_parser = CssParser::new(&mq_str); - let media = parse_media_query_list(&mut css_parser); - sheet.set_media(Some(media)); + sheet.set_media(parse_media_query_list(&mut css_parser)); let sheet = Arc::new(sheet); win.layout_chan().send(Msg::AddStylesheet(sheet.clone())).unwrap(); diff --git a/components/style/media_queries.rs b/components/style/media_queries.rs index 4970ef8b2c2b..28fc662d1261 100644 --- a/components/style/media_queries.rs +++ b/components/style/media_queries.rs @@ -31,6 +31,12 @@ impl ToCss for MediaList { } } +impl Default for MediaList { + fn default() -> MediaList { + MediaList { media_queries: vec![] } + } +} + #[derive(PartialEq, Eq, Copy, Clone, Debug)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub enum Range { @@ -253,8 +259,8 @@ impl MediaQuery { } pub fn parse_media_query_list(input: &mut Parser) -> MediaList { - let queries = if input.is_exhausted() { - vec![MediaQuery::new(None, MediaQueryType::All, vec!())] + if input.is_exhausted() { + Default::default() } else { let mut media_queries = vec![]; loop { @@ -269,17 +275,17 @@ pub fn parse_media_query_list(input: &mut Parser) -> MediaList { Err(()) => break, } } - media_queries - }; - MediaList { media_queries: queries } + MediaList { media_queries: media_queries } + } } impl MediaList { pub fn evaluate(&self, device: &Device) -> bool { let viewport_size = device.au_viewport_size(); - // Check if any queries match (OR condition) - self.media_queries.iter().any(|mq| { + // Check if it is an empty media query list or any queries match (OR condition) + // https://drafts.csswg.org/mediaqueries-4/#mq-list + self.media_queries.is_empty() || self.media_queries.iter().any(|mq| { // Check if media matches. Unknown media never matches. let media_match = match mq.media_type { MediaQueryType::MediaType(MediaType::Unknown(_)) => false, diff --git a/components/style/stylesheets.rs b/components/style/stylesheets.rs index 2f37415351ce..d8ccc7543156 100644 --- a/components/style/stylesheets.rs +++ b/components/style/stylesheets.rs @@ -45,8 +45,8 @@ pub struct Stylesheet { /// List of rules in the order they were found (important for /// cascading order) pub rules: Vec, - /// List of media associated with the Stylesheet, if any. - pub media: Option, + /// List of media associated with the Stylesheet. + pub media: MediaList, pub origin: Origin, pub dirty_on_viewport_size_change: bool, } @@ -181,14 +181,14 @@ impl Stylesheet { Stylesheet { origin: origin, rules: rules, - media: None, + media: Default::default(), dirty_on_viewport_size_change: input.seen_viewport_percentages(), } } /// Set the MediaList associated with the style-sheet. - pub fn set_media(&mut self, media: Option) { + pub fn set_media(&mut self, media: MediaList) { self.media = media; } @@ -197,7 +197,7 @@ impl Stylesheet { /// /// Always true if no associated MediaList exists. pub fn is_effective_for_device(&self, device: &Device) -> bool { - self.media.as_ref().map_or(true, |ref media| media.evaluate(device)) + self.media.evaluate(device) } /// Return an iterator over the effective rules within the style-sheet, as diff --git a/tests/unit/style/media_queries.rs b/tests/unit/style/media_queries.rs index 7cc55c412c4f..7c9d04390519 100644 --- a/tests/unit/style/media_queries.rs +++ b/tests/unit/style/media_queries.rs @@ -59,11 +59,7 @@ fn media_query_test(device: &Device, css: &str, expected_rule_count: usize) { #[test] fn test_mq_empty() { test_media_rule("@media { }", |list, css| { - assert!(list.media_queries.len() == 1, css.to_owned()); - let q = &list.media_queries[0]; - assert!(q.qualifier == None, css.to_owned()); - assert!(q.media_type == MediaQueryType::All, css.to_owned()); - assert!(q.expressions.len() == 0, css.to_owned()); + assert!(list.media_queries.len() == 0, css.to_owned()); }); } diff --git a/tests/unit/style/stylesheets.rs b/tests/unit/style/stylesheets.rs index 4ec9388d4c23..6a3e299f6c7c 100644 --- a/tests/unit/style/stylesheets.rs +++ b/tests/unit/style/stylesheets.rs @@ -54,7 +54,7 @@ fn test_parse_stylesheet() { ParserContextExtraData::default()); let expected = Stylesheet { origin: Origin::UserAgent, - media: None, + media: Default::default(), dirty_on_viewport_size_change: false, rules: vec![ CSSRule::Namespace(Arc::new(RwLock::new(NamespaceRule {