servo: Merge #15941 - style: Fix media query parsing when invalid queries are present (from emilio:media); r=heycam

Fixes [bug 1347273](https://bugzil.la/1347273).

Source-Repo: https://github.com/servo/servo
Source-Revision: 304cafe57d45921e460ff408ae18138f4eca10df

--HG--
extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear
extra : subtree_revision : 8afc7ff724ff4f89d1f6d17ca27f74d09fafc1fd
This commit is contained in:
Emilio Cobos Álvarez 2017-03-15 09:56:40 -07:00
parent 6c1254b8e0
commit 1fc41b21ff
2 changed files with 8 additions and 17 deletions

View File

@ -243,19 +243,13 @@ pub fn parse_media_query_list(input: &mut Parser) -> MediaList {
}
let mut media_queries = vec![];
let mut found_invalid = false;
loop {
match input.parse_until_before(Delimiter::Comma, MediaQuery::parse) {
Ok(mq) => if !found_invalid {
Ok(mq) => {
media_queries.push(mq);
},
Err(..) => if !found_invalid {
media_queries.clear();
Err(..) => {
media_queries.push(MediaQuery::never_matching());
// Consume the rest of the input as if they were valid
// expressions (they might be, they might not), but ignore the
// result, this allows correctly parsing invalid media queries.
found_invalid = true;
},
}
@ -266,8 +260,6 @@ pub fn parse_media_query_list(input: &mut Parser) -> MediaList {
}
}
debug_assert!(!found_invalid || media_queries.len() == 1);
MediaList {
media_queries: media_queries,
}

View File

@ -321,11 +321,12 @@ fn test_mq_multiple_expressions() {
#[test]
fn test_mq_malformed_expressions() {
fn check_malformed_expr(list: &MediaList, css: &str) {
assert!(list.media_queries.len() == 1, css.to_owned());
let q = &list.media_queries[0];
assert!(q.qualifier == Some(Qualifier::Not), css.to_owned());
assert!(q.media_type == MediaQueryType::All, css.to_owned());
assert!(q.expressions.len() == 0, css.to_owned());
assert!(!list.media_queries.is_empty(), css.to_owned());
for mq in &list.media_queries {
assert!(mq.qualifier == Some(Qualifier::Not), css.to_owned());
assert!(mq.media_type == MediaQueryType::All, css.to_owned());
assert!(mq.expressions.is_empty(), css.to_owned());
}
}
for rule in &[
@ -335,8 +336,6 @@ fn test_mq_malformed_expressions() {
"@media not {}",
"@media not (min-width: 300px) {}",
"@media , {}",
"@media screen 4px, print {}",
"@media screen, {}",
] {
test_media_rule(rule, check_malformed_expr);
}