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); |
} |