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