diff --git a/components/style/media_queries/media_feature_expression.rs b/components/style/media_queries/media_feature_expression.rs index 10bf16500ef..1658439da21 100644 --- a/components/style/media_queries/media_feature_expression.rs +++ b/components/style/media_queries/media_feature_expression.rs @@ -196,23 +196,37 @@ fn consume_operation_or_colon(input: &mut Parser) -> Result, () _ => return Err(()), } }; - Ok(Some(match first_delim { - '=' => Operator::Equal, - '>' => { - if input.try_parse(|i| i.expect_delim('=')).is_ok() { - Operator::GreaterThanEqual - } else { - Operator::GreaterThan - } - }, - '<' => { - if input.try_parse(|i| i.expect_delim('=')).is_ok() { - Operator::LessThanEqual - } else { - Operator::LessThan - } - }, + let operator = match first_delim { + '=' => return Ok(Some(Operator::Equal)), + '>' => Operator::GreaterThan, + '<' => Operator::LessThan, _ => return Err(()), + }; + + // https://drafts.csswg.org/mediaqueries-4/#mq-syntax: + // + // No whitespace is allowed between the “<” or “>” + // s and the following “=” , if it’s + // present. + // + // TODO(emilio): Maybe we should ignore comments as well? + // https://github.com/w3c/csswg-drafts/issues/6248 + let parsed_equal = input.try_parse(|i| { + let t = i.next_including_whitespace().map_err(|_| ())?; + if !matches!(t, Token::Delim('=')) { + return Err(()) + } + Ok(()) + }).is_ok(); + + if !parsed_equal { + return Ok(Some(operator)); + } + + Ok(Some(match operator { + Operator::GreaterThan => Operator::GreaterThanEqual, + Operator::LessThan => Operator::LessThanEqual, + _ => unreachable!(), })) }