Index: Source/core/css/CSSGrammar.y.in |
diff --git a/Source/core/css/CSSGrammar.y.in b/Source/core/css/CSSGrammar.y.in |
index 3ecec22a56556c6e208da31aacfa957ea07de3f8..2b44dbcdf04ebc2014601b51d93360089820c979 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 |
@@ -251,6 +251,7 @@ static inline bool isCSSTokenAString(int yytype) |
%type <string> media_feature |
%type <mediaList> media_list |
%type <mediaList> maybe_media_list |
+%type <mediaList> mq_list |
%type <mediaQuery> media_query |
%type <mediaQueryRestrictor> maybe_media_restrictor |
%type <valueList> maybe_media_value |
@@ -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 media_query '}' { |
+ parser->m_mediaQuery = parser->sinkFloatingMediaQuery($3); |
} |
; |
@@ -575,7 +576,7 @@ STRING |
; |
media_feature: |
SeRya
2013/06/01 06:28:03
May be use just IDENT rather than media_feature?
rune
2013/06/03 09:08:11
Fixed in next patch set.
|
- IDENT maybe_space { |
+ IDENT { |
$$ = $1; |
} |
; |
@@ -590,29 +591,30 @@ 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 media_feature maybe_space maybe_media_value closing_parenthesis maybe_space { |
+ parser->tokenToLowerCase($3); |
+ $$ = parser->createFloatingMediaQueryExp($3, $5); |
} |
- | maybe_media_restrictor maybe_space '(' error error_recovery ')' { |
- YYERROR; |
+ | '(' error error_recovery closing_parenthesis { |
SeRya
2013/06/01 06:28:03
If you remove YYERROR you need to add maybe_space
rune
2013/06/03 09:08:11
Fixed in next patch set.
|
+ $$ = 0; |
} |
; |
media_query_exp_list: |
media_query_exp { |
- $$ = parser->createFloatingMediaQueryExpList(); |
- $$->append(parser->sinkFloatingMediaQueryExp($1)); |
+ $$ = 0; |
+ if ($1) { |
+ $$ = parser->createFloatingMediaQueryExpList(); |
+ $$->append(parser->sinkFloatingMediaQueryExp($1)); |
+ } |
} |
- | media_query_exp_list maybe_space MEDIA_AND maybe_space media_query_exp { |
- $$ = $1; |
- $$->append(parser->sinkFloatingMediaQueryExp($5)); |
+ | media_query_exp_list MEDIA_AND maybe_space media_query_exp { |
+ if ($1 && $4) { |
SeRya
2013/06/01 06:28:03
If you handle errors on higher level you likely ca
rune
2013/06/03 09:08:11
Fixed in next patch set.
|
+ $$ = $1; |
+ $$->append(parser->sinkFloatingMediaQueryExp($4)); |
+ } |
+ else |
+ $$ = 0; |
} |
; |
@@ -629,47 +631,78 @@ maybe_media_restrictor: |
/*empty*/ { |
$$ = MediaQuery::None; |
} |
- | MEDIA_ONLY { |
+ | MEDIA_ONLY maybe_space { |
$$ = MediaQuery::Only; |
} |
- | MEDIA_NOT { |
+ | MEDIA_NOT maybe_space { |
$$ = MediaQuery::Not; |
} |
; |
media_query: |
media_query_exp_list { |
- $$ = parser->createFloatingMediaQuery(parser->sinkFloatingMediaQueryExpList($1)); |
+ if ($1) |
+ $$ = parser->createFloatingMediaQuery(parser->sinkFloatingMediaQueryExpList($1)); |
+ else |
+ $$ = 0; |
} |
- | |
- 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); |
+ if ($3) |
+ $$ = parser->createFloatingMediaQuery($1, $2, parser->sinkFloatingMediaQueryExpList($3)); |
+ else |
+ $$ = 0; |
+ } |
+ | error rule_error_recovery { |
+ $$ = 0; |
} |
; |
maybe_media_list: |
- /* empty */ { |
+ /* empty */ { |
$$ = parser->createMediaQuerySet(); |
- } |
- | media_list |
- ; |
+ } |
+ | media_list |
+ ; |
media_list: |
media_query { |
$$ = parser->createMediaQuerySet(); |
- $$->addMediaQuery(parser->sinkFloatingMediaQuery($1)); |
+ MediaQuery* query = $1; |
+ if (!query) |
+ query = parser->createFloatingNotAllQuery(); |
+ $$->addMediaQuery(parser->sinkFloatingMediaQuery(query)); |
parser->updateLastMediaLine($$); |
} |
- | media_list ',' maybe_space media_query { |
+ | mq_list media_query { |
$$ = $1; |
- if ($$) { |
- $$->addMediaQuery(parser->sinkFloatingMediaQuery($4)); |
- parser->updateLastMediaLine($$); |
- } |
+ MediaQuery* query = $2; |
+ if (!query) |
+ query = parser->createFloatingNotAllQuery(); |
+ $$->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(); |
+ MediaQuery* query = $1; |
+ if (!query) |
+ query = parser->createFloatingNotAllQuery(); |
+ $$->addMediaQuery(parser->sinkFloatingMediaQuery(query)); |
+ } |
+ | mq_list media_query ',' maybe_space { |
+ $$ = $1; |
+ MediaQuery* query = $2; |
+ if (!query) |
+ query = parser->createFloatingNotAllQuery(); |
+ $$->addMediaQuery(parser->sinkFloatingMediaQuery(query)); |
} |
; |
@@ -698,6 +731,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 ';' { |
SeRya
2013/06/01 06:28:03
It shouldn't be needed. "before_media_rule MEDIA_S
rune
2013/06/03 09:08:11
Media query error #4 (parsing of "@media all; @med
SeRya
2013/06/03 11:31:27
I see why it needed. Because "all;" reduces to med
|
+ $$ = 0; |
+ parser->endRuleBody(true); |
+ } |
| before_media_rule MEDIA_SYM at_rule_recovery { |
$$ = 0; |
parser->endRuleBody(true); |