mirror of
https://github.com/servo/servo.git
synced 2025-07-24 15:50:21 +01:00
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.
This commit is contained in:
parent
a91f48ee05
commit
5dfcb07f6a
7 changed files with 23 additions and 23 deletions
|
@ -359,8 +359,7 @@ impl FetchResponseListener for StylesheetContext {
|
||||||
Some(environment_encoding), Origin::Author,
|
Some(environment_encoding), Origin::Author,
|
||||||
win.css_error_reporter(),
|
win.css_error_reporter(),
|
||||||
ParserContextExtraData::default());
|
ParserContextExtraData::default());
|
||||||
let media = self.media.take().unwrap();
|
sheet.set_media(self.media.take().unwrap());
|
||||||
sheet.set_media(Some(media));
|
|
||||||
let sheet = Arc::new(sheet);
|
let sheet = Arc::new(sheet);
|
||||||
|
|
||||||
let win = window_from_node(&*elem);
|
let win = window_from_node(&*elem);
|
||||||
|
|
|
@ -83,7 +83,7 @@ impl HTMLMetaElement {
|
||||||
*self.stylesheet.borrow_mut() = Some(Arc::new(Stylesheet {
|
*self.stylesheet.borrow_mut() = Some(Arc::new(Stylesheet {
|
||||||
rules: vec![CSSRule::Viewport(Arc::new(RwLock::new(translated_rule)))],
|
rules: vec![CSSRule::Viewport(Arc::new(RwLock::new(translated_rule)))],
|
||||||
origin: Origin::Author,
|
origin: Origin::Author,
|
||||||
media: None,
|
media: Default::default(),
|
||||||
// Viewport constraints are always recomputed on resize; they don't need to
|
// Viewport constraints are always recomputed on resize; they don't need to
|
||||||
// force all styles to be recomputed.
|
// force all styles to be recomputed.
|
||||||
dirty_on_viewport_size_change: false,
|
dirty_on_viewport_size_change: false,
|
||||||
|
|
|
@ -65,8 +65,7 @@ impl HTMLStyleElement {
|
||||||
let mut sheet = Stylesheet::from_str(&data, url, Origin::Author, win.css_error_reporter(),
|
let mut sheet = Stylesheet::from_str(&data, url, Origin::Author, win.css_error_reporter(),
|
||||||
ParserContextExtraData::default());
|
ParserContextExtraData::default());
|
||||||
let mut css_parser = CssParser::new(&mq_str);
|
let mut css_parser = CssParser::new(&mq_str);
|
||||||
let media = parse_media_query_list(&mut css_parser);
|
sheet.set_media(parse_media_query_list(&mut css_parser));
|
||||||
sheet.set_media(Some(media));
|
|
||||||
let sheet = Arc::new(sheet);
|
let sheet = Arc::new(sheet);
|
||||||
|
|
||||||
win.layout_chan().send(Msg::AddStylesheet(sheet.clone())).unwrap();
|
win.layout_chan().send(Msg::AddStylesheet(sheet.clone())).unwrap();
|
||||||
|
|
|
@ -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)]
|
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
|
||||||
#[cfg_attr(feature = "servo", derive(HeapSizeOf))]
|
#[cfg_attr(feature = "servo", derive(HeapSizeOf))]
|
||||||
pub enum Range<T> {
|
pub enum Range<T> {
|
||||||
|
@ -253,8 +259,8 @@ impl MediaQuery {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse_media_query_list(input: &mut Parser) -> MediaList {
|
pub fn parse_media_query_list(input: &mut Parser) -> MediaList {
|
||||||
let queries = if input.is_exhausted() {
|
if input.is_exhausted() {
|
||||||
vec![MediaQuery::new(None, MediaQueryType::All, vec!())]
|
Default::default()
|
||||||
} else {
|
} else {
|
||||||
let mut media_queries = vec![];
|
let mut media_queries = vec![];
|
||||||
loop {
|
loop {
|
||||||
|
@ -269,17 +275,17 @@ pub fn parse_media_query_list(input: &mut Parser) -> MediaList {
|
||||||
Err(()) => break,
|
Err(()) => break,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
media_queries
|
MediaList { media_queries: media_queries }
|
||||||
};
|
}
|
||||||
MediaList { media_queries: queries }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MediaList {
|
impl MediaList {
|
||||||
pub fn evaluate(&self, device: &Device) -> bool {
|
pub fn evaluate(&self, device: &Device) -> bool {
|
||||||
let viewport_size = device.au_viewport_size();
|
let viewport_size = device.au_viewport_size();
|
||||||
|
|
||||||
// Check if any queries match (OR condition)
|
// Check if it is an empty media query list or any queries match (OR condition)
|
||||||
self.media_queries.iter().any(|mq| {
|
// 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.
|
// Check if media matches. Unknown media never matches.
|
||||||
let media_match = match mq.media_type {
|
let media_match = match mq.media_type {
|
||||||
MediaQueryType::MediaType(MediaType::Unknown(_)) => false,
|
MediaQueryType::MediaType(MediaType::Unknown(_)) => false,
|
||||||
|
|
|
@ -45,8 +45,8 @@ pub struct Stylesheet {
|
||||||
/// List of rules in the order they were found (important for
|
/// List of rules in the order they were found (important for
|
||||||
/// cascading order)
|
/// cascading order)
|
||||||
pub rules: Vec<CSSRule>,
|
pub rules: Vec<CSSRule>,
|
||||||
/// List of media associated with the Stylesheet, if any.
|
/// List of media associated with the Stylesheet.
|
||||||
pub media: Option<MediaList>,
|
pub media: MediaList,
|
||||||
pub origin: Origin,
|
pub origin: Origin,
|
||||||
pub dirty_on_viewport_size_change: bool,
|
pub dirty_on_viewport_size_change: bool,
|
||||||
}
|
}
|
||||||
|
@ -181,14 +181,14 @@ impl Stylesheet {
|
||||||
Stylesheet {
|
Stylesheet {
|
||||||
origin: origin,
|
origin: origin,
|
||||||
rules: rules,
|
rules: rules,
|
||||||
media: None,
|
media: Default::default(),
|
||||||
dirty_on_viewport_size_change:
|
dirty_on_viewport_size_change:
|
||||||
input.seen_viewport_percentages(),
|
input.seen_viewport_percentages(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the MediaList associated with the style-sheet.
|
/// 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;
|
self.media = media;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,7 +197,7 @@ impl Stylesheet {
|
||||||
///
|
///
|
||||||
/// Always true if no associated MediaList exists.
|
/// Always true if no associated MediaList exists.
|
||||||
pub fn is_effective_for_device(&self, device: &Device) -> bool {
|
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
|
/// Return an iterator over the effective rules within the style-sheet, as
|
||||||
|
|
|
@ -59,11 +59,7 @@ fn media_query_test(device: &Device, css: &str, expected_rule_count: usize) {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_mq_empty() {
|
fn test_mq_empty() {
|
||||||
test_media_rule("@media { }", |list, css| {
|
test_media_rule("@media { }", |list, css| {
|
||||||
assert!(list.media_queries.len() == 1, css.to_owned());
|
assert!(list.media_queries.len() == 0, 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());
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ fn test_parse_stylesheet() {
|
||||||
ParserContextExtraData::default());
|
ParserContextExtraData::default());
|
||||||
let expected = Stylesheet {
|
let expected = Stylesheet {
|
||||||
origin: Origin::UserAgent,
|
origin: Origin::UserAgent,
|
||||||
media: None,
|
media: Default::default(),
|
||||||
dirty_on_viewport_size_change: false,
|
dirty_on_viewport_size_change: false,
|
||||||
rules: vec![
|
rules: vec![
|
||||||
CSSRule::Namespace(Arc::new(RwLock::new(NamespaceRule {
|
CSSRule::Namespace(Arc::new(RwLock::new(NamespaceRule {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue