aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXidorn Quan <me@upsuper.org>2016-11-10 15:32:16 +1100
committerXidorn Quan <me@upsuper.org>2016-11-10 17:42:16 +1100
commit5dfcb07f6a8c86f61ecf78fb628939e0b484ea68 (patch)
treeefe3e33a03a85c1efcf2f4262a624b410e53280d
parenta91f48ee05933784630fdf918fc4b66037dba9f1 (diff)
downloadservo-5dfcb07f6a8c86f61ecf78fb628939e0b484ea68.tar.gz
servo-5dfcb07f6a8c86f61ecf78fb628939e0b484ea68.zip
Allow empty media query list
And make empty list the default value of MediaList. This commit also removes Option wrapper of Stylesheet.media because a stylesheet should always have an associated media query list.
-rw-r--r--components/script/dom/htmllinkelement.rs3
-rw-r--r--components/script/dom/htmlmetaelement.rs2
-rw-r--r--components/script/dom/htmlstyleelement.rs3
-rw-r--r--components/style/media_queries.rs20
-rw-r--r--components/style/stylesheets.rs10
-rw-r--r--tests/unit/style/media_queries.rs6
-rw-r--r--tests/unit/style/stylesheets.rs2
7 files changed, 23 insertions, 23 deletions
diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs
index 9fb5a5609f1..90499388153 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 14f9cd78555..7ddca9f2f8a 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 34d5ba79ec9..8c1bc031dc0 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 4970ef8b2c2..28fc662d126 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<T> {
@@ -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 2f37415351c..d8ccc754315 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<CSSRule>,
- /// List of media associated with the Stylesheet, if any.
- pub media: Option<MediaList>,
+ /// 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<MediaList>) {
+ 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 7cc55c412c4..7c9d0439051 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 4ec9388d4c2..6a3e299f6c7 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 {