Index: Source/core/css/CSSGrammar.y.in |
diff --git a/Source/core/css/CSSGrammar.y.in b/Source/core/css/CSSGrammar.y.in |
index 19f6cb1b2f657364d9b32818fadc73be45393a09..63cacac5d92c0b9126962dfc1a6daed64bafde8e 100644 |
--- a/Source/core/css/CSSGrammar.y.in |
+++ b/Source/core/css/CSSGrammar.y.in |
@@ -87,7 +87,7 @@ static inline bool isCSSTokenAString(int yytype) |
%} |
-%expect 11 |
+%expect 3 |
%nonassoc LOWEST_PREC |
@@ -248,10 +248,11 @@ static inline bool isCSSTokenAString(int yytype) |
%type <string> medium |
%type <marginBox> margin_sym |
-%type <string> media_feature |
%type <mediaList> media_list |
%type <mediaList> maybe_media_list |
+%type <mediaList> mq_list |
%type <mediaQuery> media_query |
+%type <mediaQuery> valid_media_query |
%type <mediaQueryRestrictor> maybe_media_restrictor |
%type <valueList> maybe_media_value |
%type <mediaQueryExp> media_query_exp |
@@ -364,8 +365,8 @@ internal_value: |
; |
webkit_mediaquery: |
- WEBKIT_MEDIAQUERY_SYM WHITESPACE maybe_space media_query '}' { |
- parser->m_mediaQuery = parser->sinkFloatingMediaQuery($4); |
+ WEBKIT_MEDIAQUERY_SYM maybe_space valid_media_query '}' { |
+ parser->m_mediaQuery = parser->sinkFloatingMediaQuery($3); |
} |
; |
@@ -574,12 +575,6 @@ STRING |
| URI |
; |
-media_feature: |
- IDENT maybe_space { |
- $$ = $1; |
- } |
- ; |
- |
maybe_media_value: |
/*empty*/ { |
$$ = 0; |
@@ -590,17 +585,11 @@ 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 { |
- parser->tokenToLowerCase($5); |
- $$ = parser->createFloatingMediaQueryExp($5, $7); |
- } |
+ '(' maybe_space IDENT maybe_space maybe_media_value closing_parenthesis maybe_space { |
+ parser->tokenToLowerCase($3); |
+ $$ = parser->createFloatingMediaQueryExp($3, $5); |
} |
- | maybe_media_restrictor maybe_space '(' error error_recovery ')' { |
+ | '(' error error_recovery closing_parenthesis { |
YYERROR; |
} |
; |
@@ -610,9 +599,9 @@ media_query_exp_list: |
$$ = parser->createFloatingMediaQueryExpList(); |
$$->append(parser->sinkFloatingMediaQueryExp($1)); |
} |
- | media_query_exp_list maybe_space MEDIA_AND maybe_space media_query_exp { |
+ | media_query_exp_list MEDIA_AND maybe_space media_query_exp { |
$$ = $1; |
- $$->append(parser->sinkFloatingMediaQueryExp($5)); |
+ $$->append(parser->sinkFloatingMediaQueryExp($4)); |
} |
; |
@@ -629,31 +618,37 @@ maybe_media_restrictor: |
/*empty*/ { |
$$ = MediaQuery::None; |
} |
- | MEDIA_ONLY { |
+ | MEDIA_ONLY maybe_space { |
$$ = MediaQuery::Only; |
} |
- | MEDIA_NOT { |
+ | MEDIA_NOT maybe_space { |
$$ = MediaQuery::Not; |
} |
; |
-media_query: |
+valid_media_query: |
media_query_exp_list { |
$$ = parser->createFloatingMediaQuery(parser->sinkFloatingMediaQueryExpList($1)); |
} |
- | |
- maybe_media_restrictor maybe_space medium maybe_and_media_query_exp_list { |
- parser->tokenToLowerCase($3); |
- $$ = parser->createFloatingMediaQuery($1, $3, parser->sinkFloatingMediaQueryExpList($4)); |
+ | maybe_media_restrictor medium maybe_and_media_query_exp_list { |
+ parser->tokenToLowerCase($2); |
+ $$ = parser->createFloatingMediaQuery($1, $2, parser->sinkFloatingMediaQueryExpList($3)); |
+ } |
+ ; |
+ |
+media_query: |
+ valid_media_query |
+ | error rule_error_recovery { |
+ $$ = parser->createFloatingNotAllQuery(); |
} |
; |
maybe_media_list: |
- /* empty */ { |
+ /* empty */ { |
$$ = parser->createMediaQuerySet(); |
- } |
- | media_list |
- ; |
+ } |
+ | media_list |
+ ; |
media_list: |
media_query { |
@@ -661,15 +656,26 @@ media_list: |
$$->addMediaQuery(parser->sinkFloatingMediaQuery($1)); |
parser->updateLastMediaLine($$); |
} |
- | media_list ',' maybe_space media_query { |
+ | mq_list media_query { |
$$ = $1; |
- if ($$) { |
- $$->addMediaQuery(parser->sinkFloatingMediaQuery($4)); |
- parser->updateLastMediaLine($$); |
- } |
+ $$->addMediaQuery(parser->sinkFloatingMediaQuery($2)); |
+ parser->updateLastMediaLine($$); |
} |
- | media_list error { |
- $$ = 0; |
+ | mq_list { |
+ $$ = $1; |
+ $$->addMediaQuery(parser->sinkFloatingMediaQuery(parser->createFloatingNotAllQuery())); |
+ parser->updateLastMediaLine($$); |
+ } |
+ ; |
+ |
+mq_list: |
+ media_query ',' maybe_space { |
+ $$ = parser->createMediaQuerySet(); |
+ $$->addMediaQuery(parser->sinkFloatingMediaQuery($1)); |
+ } |
+ | mq_list media_query ',' maybe_space { |
+ $$ = $1; |
+ $$->addMediaQuery(parser->sinkFloatingMediaQuery($2)); |
} |
; |
@@ -698,6 +704,10 @@ media: |
| before_media_rule MEDIA_SYM at_rule_header_end_maybe_space '{' at_rule_body_start maybe_space block_rule_body closing_brace { |
$$ = parser->createMediaRule(0, $7); |
} |
+ | before_media_rule MEDIA_SYM maybe_space media_list ';' { |
+ $$ = 0; |
+ parser->endRuleBody(true); |
+ } |
| before_media_rule MEDIA_SYM at_rule_recovery { |
$$ = 0; |
parser->endRuleBody(true); |