Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(439)

Unified Diff: Source/core/css/CSSGrammar.y.in

Issue 14065029: Improved parse error handling for CSSMQ. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « LayoutTests/fast/media/mq-js-stylesheet-media-02-expected.html ('k') | Source/core/css/CSSParser.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/css/CSSGrammar.y.in
diff --git a/Source/core/css/CSSGrammar.y.in b/Source/core/css/CSSGrammar.y.in
index a400d8c0c24d2c8532a52416570a6cf70db53410..9a25a37363eff28b23ff2ce21ed765ee428a88bf 100644
--- a/Source/core/css/CSSGrammar.y.in
+++ b/Source/core/css/CSSGrammar.y.in
@@ -4,6 +4,7 @@
* Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com)
* Copyright (C) 2008 Eric Seidel <eric@webkit.org>
* Copyright (C) 2012 Intel Corporation. All rights reserved.
+ * Copyright (C) 2013 Opera Software ASA. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -87,7 +88,7 @@ static inline bool isCSSTokenAString(int yytype)
%}
-%expect 38
+%expect 36
%nonassoc LOWEST_PREC
@@ -249,7 +250,7 @@ static inline bool isCSSTokenAString(int yytype)
%type <string> media_feature
%type <mediaList> media_list
%type <mediaList> maybe_media_list
-%type <mediaQuery> media_query
+%type <mediaQuery> media_query invalid_media_query
%type <mediaQueryRestrictor> maybe_media_restrictor
%type <valueList> maybe_media_value
%type <mediaQueryExp> media_query_exp
@@ -361,8 +362,14 @@ internal_value:
;
webkit_mediaquery:
- WEBKIT_MEDIAQUERY_SYM WHITESPACE maybe_space media_query '}' {
- parser->m_mediaQuery = parser->sinkFloatingMediaQuery($4);
+ WEBKIT_MEDIAQUERY_SYM maybe_space media_query TOKEN_EOF {
+ parser->m_mediaQuery = parser->sinkFloatingMediaQuery($3);
+ }
+ | WEBKIT_MEDIAQUERY_SYM maybe_space media_query error TOKEN_EOF {
+ parser->m_mediaQuery = parser->sinkFloatingMediaQuery(parser->createFloatingMediaQuery(MediaQuery::Not, "all", parser->sinkFloatingMediaQueryExpList(parser->createFloatingMediaQueryExpList())));
+ }
+ | WEBKIT_MEDIAQUERY_SYM maybe_space error TOKEN_EOF {
+ parser->m_mediaQuery = parser->sinkFloatingMediaQuery(parser->createFloatingMediaQuery(MediaQuery::Not, "all", parser->sinkFloatingMediaQueryExpList(parser->createFloatingMediaQueryExpList())));
}
;
@@ -582,15 +589,9 @@ maybe_media_value:
;
media_query_exp:
- maybe_media_restrictor maybe_space '(' maybe_space media_feature maybe_space maybe_media_value ')' maybe_space {
- // If restrictor is specified, media query expression is invalid.
- // Create empty media query expression and continue parsing media query.
- if ($1 != MediaQuery::None)
- $$ = parser->createFloatingMediaQueryExp("", 0);
- else {
- $5.lower();
- $$ = parser->createFloatingMediaQueryExp($5, $7);
- }
+ '(' maybe_space media_feature maybe_space maybe_media_value ')' maybe_space {
+ $3.lower();
+ $$ = parser->createFloatingMediaQueryExp($3, $5);
}
;
@@ -630,35 +631,56 @@ media_query:
media_query_exp_list {
$$ = parser->createFloatingMediaQuery(parser->sinkFloatingMediaQueryExpList($1));
}
- |
- maybe_media_restrictor maybe_space medium maybe_and_media_query_exp_list {
+ | maybe_media_restrictor maybe_space medium maybe_and_media_query_exp_list {
$3.lower();
$$ = parser->createFloatingMediaQuery($1, $3, parser->sinkFloatingMediaQueryExpList($4));
}
+ | invalid_media_query maybe_space {
+ $$ = $1;
+ }
+ ;
+
+invalid_media_query:
+ error ',' {
+ $$ = parser->recoverMediaQuery();
+ }
+ | error '{' {
+ $$ = parser->recoverMediaQuery();
+ }
+ | error ';' {
+ $$ = parser->recoverMediaQuery();
+ }
+ | error '}' {
+ $$ = parser->recoverMediaQuery();
+ }
;
maybe_media_list:
- /* empty */ {
+ /* empty */ {
$$ = parser->createMediaQuerySet();
- }
- | media_list
- ;
+ }
+ | media_list
+ ;
+
+at_media_list_start:
+ /* empty */ {
+ parser->markMediaListStart();
+ }
+ ;
media_list:
- media_query {
+ at_media_list_start media_query {
$$ = parser->createMediaQuerySet();
- $$->addMediaQuery(parser->sinkFloatingMediaQuery($1));
+ $$->addMediaQuery(parser->sinkFloatingMediaQuery($2));
parser->updateLastMediaLine($$);
}
| media_list ',' maybe_space media_query {
$$ = $1;
- if ($$) {
- $$->addMediaQuery(parser->sinkFloatingMediaQuery($4));
- parser->updateLastMediaLine($$);
- }
+ $$->addMediaQuery(parser->sinkFloatingMediaQuery($4));
+ parser->updateLastMediaLine($$);
}
- | media_list error {
- $$ = 0;
+ | media_list invalid_media_query maybe_space {
+ $$->replaceLastMediaQuery(parser->sinkFloatingMediaQuery($2));
}
;
@@ -687,7 +709,11 @@ media:
| before_media_rule MEDIA_SYM at_rule_header_end_maybe_space '{' at_rule_body_start maybe_space block_rule_list save_block {
$$ = parser->createMediaRule(0, $7);
}
- | before_media_rule MEDIA_SYM at_rule_header_end_maybe_space ';' {
+ | before_media_rule MEDIA_SYM maybe_space media_list at_rule_header_end ';' {
+ $$ = 0;
+ parser->endRuleBody(true);
+ }
+ | before_media_rule MEDIA_SYM maybe_space media_list at_rule_header_end '}' {
$$ = 0;
parser->endRuleBody(true);
}
« no previous file with comments | « LayoutTests/fast/media/mq-js-stylesheet-media-02-expected.html ('k') | Source/core/css/CSSParser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698