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

Side by Side Diff: Source/core/css/CSSGrammar.y.in

Issue 14620012: Improved parse error handling for CSSMQ. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@query-selector-performance
Patch Set: Moved error recovery for media_query_exp to where it belongs. Created 7 years, 6 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2002-2003 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 2002-2003 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 App le Inc. All rights reserved. 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 App le Inc. All rights reserved.
4 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com) 4 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com)
5 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> 5 * Copyright (C) 2008 Eric Seidel <eric@webkit.org>
6 * Copyright (C) 2012 Intel Corporation. All rights reserved. 6 * Copyright (C) 2012 Intel Corporation. All rights reserved.
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public 9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 case VAR_DEFINITION: 80 case VAR_DEFINITION:
81 case UNICODERANGE: 81 case UNICODERANGE:
82 return true; 82 return true;
83 default: 83 default:
84 return false; 84 return false;
85 } 85 }
86 } 86 }
87 87
88 %} 88 %}
89 89
90 %expect 11 90 %expect 3
91 91
92 %nonassoc LOWEST_PREC 92 %nonassoc LOWEST_PREC
93 93
94 %left UNIMPORTANT_TOK 94 %left UNIMPORTANT_TOK
95 95
96 %token WHITESPACE SGML_CD 96 %token WHITESPACE SGML_CD
97 %token TOKEN_EOF 0 97 %token TOKEN_EOF 0
98 98
99 %token INCLUDES 99 %token INCLUDES
100 %token DASHMATCH 100 %token DASHMATCH
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
244 %type <string> namespace_selector 244 %type <string> namespace_selector
245 245
246 %type <string> string_or_uri 246 %type <string> string_or_uri
247 %type <string> ident_or_string 247 %type <string> ident_or_string
248 %type <string> medium 248 %type <string> medium
249 %type <marginBox> margin_sym 249 %type <marginBox> margin_sym
250 250
251 %type <string> media_feature 251 %type <string> media_feature
252 %type <mediaList> media_list 252 %type <mediaList> media_list
253 %type <mediaList> maybe_media_list 253 %type <mediaList> maybe_media_list
254 %type <mediaList> mq_list
254 %type <mediaQuery> media_query 255 %type <mediaQuery> media_query
255 %type <mediaQueryRestrictor> maybe_media_restrictor 256 %type <mediaQueryRestrictor> maybe_media_restrictor
256 %type <valueList> maybe_media_value 257 %type <valueList> maybe_media_value
257 %type <mediaQueryExp> media_query_exp 258 %type <mediaQueryExp> media_query_exp
258 %type <mediaQueryExpList> media_query_exp_list 259 %type <mediaQueryExpList> media_query_exp_list
259 %type <mediaQueryExpList> maybe_and_media_query_exp_list 260 %type <mediaQueryExpList> maybe_and_media_query_exp_list
260 261
261 %type <boolean> supports_condition 262 %type <boolean> supports_condition
262 %type <boolean> supports_condition_in_parens 263 %type <boolean> supports_condition_in_parens
263 %type <boolean> supports_negation 264 %type <boolean> supports_negation
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 parser->m_valueList = parser->sinkFloatingValueList($4); 358 parser->m_valueList = parser->sinkFloatingValueList($4);
358 int oldParsedProperties = parser->m_parsedProperties.size(); 359 int oldParsedProperties = parser->m_parsedProperties.size();
359 if (!parser->parseValue(parser->m_id, parser->m_important)) 360 if (!parser->parseValue(parser->m_id, parser->m_important))
360 parser->rollbackLastProperties(parser->m_parsedProperties.size() - oldParsedProperties); 361 parser->rollbackLastProperties(parser->m_parsedProperties.size() - oldParsedProperties);
361 parser->m_valueList = nullptr; 362 parser->m_valueList = nullptr;
362 } 363 }
363 } 364 }
364 ; 365 ;
365 366
366 webkit_mediaquery: 367 webkit_mediaquery:
367 WEBKIT_MEDIAQUERY_SYM WHITESPACE maybe_space media_query '}' { 368 WEBKIT_MEDIAQUERY_SYM maybe_space media_query '}' {
368 parser->m_mediaQuery = parser->sinkFloatingMediaQuery($4); 369 parser->m_mediaQuery = parser->sinkFloatingMediaQuery($3);
369 } 370 }
370 ; 371 ;
371 372
372 internal_selector: 373 internal_selector:
373 INTERNAL_SELECTOR_SYM '{' maybe_space selector_list '}' { 374 INTERNAL_SELECTOR_SYM '{' maybe_space selector_list '}' {
374 if ($4) { 375 if ($4) {
375 if (parser->m_selectorListForParseSelector) 376 if (parser->m_selectorListForParseSelector)
376 parser->m_selectorListForParseSelector->adoptSelectorVector(*$4) ; 377 parser->m_selectorListForParseSelector->adoptSelectorVector(*$4) ;
377 } 378 }
378 } 379 }
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
567 maybe_ns_prefix: 568 maybe_ns_prefix:
568 /* empty */ { $$.clear(); } 569 /* empty */ { $$.clear(); }
569 | IDENT maybe_space { $$ = $1; } 570 | IDENT maybe_space { $$ = $1; }
570 ; 571 ;
571 572
572 string_or_uri: 573 string_or_uri:
573 STRING 574 STRING
574 | URI 575 | URI
575 ; 576 ;
576 577
577 media_feature: 578 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.
578 IDENT maybe_space { 579 IDENT {
579 $$ = $1; 580 $$ = $1;
580 } 581 }
581 ; 582 ;
582 583
583 maybe_media_value: 584 maybe_media_value:
584 /*empty*/ { 585 /*empty*/ {
585 $$ = 0; 586 $$ = 0;
586 } 587 }
587 | ':' maybe_space expr { 588 | ':' maybe_space expr {
588 $$ = $3; 589 $$ = $3;
589 } 590 }
590 ; 591 ;
591 592
592 media_query_exp: 593 media_query_exp:
593 maybe_media_restrictor maybe_space '(' maybe_space media_feature maybe_space maybe_media_value ')' maybe_space { 594 '(' maybe_space media_feature maybe_space maybe_media_value closing_parenthe sis maybe_space {
594 // If restrictor is specified, media query expression is invalid. 595 parser->tokenToLowerCase($3);
595 // Create empty media query expression and continue parsing media query. 596 $$ = parser->createFloatingMediaQueryExp($3, $5);
596 if ($1 != MediaQuery::None)
597 $$ = parser->createFloatingMediaQueryExp("", 0);
598 else {
599 parser->tokenToLowerCase($5);
600 $$ = parser->createFloatingMediaQueryExp($5, $7);
601 }
602 } 597 }
603 | maybe_media_restrictor maybe_space '(' error error_recovery ')' { 598 | '(' 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.
604 YYERROR; 599 $$ = 0;
605 } 600 }
606 ; 601 ;
607 602
608 media_query_exp_list: 603 media_query_exp_list:
609 media_query_exp { 604 media_query_exp {
610 $$ = parser->createFloatingMediaQueryExpList(); 605 $$ = 0;
611 $$->append(parser->sinkFloatingMediaQueryExp($1)); 606 if ($1) {
607 $$ = parser->createFloatingMediaQueryExpList();
608 $$->append(parser->sinkFloatingMediaQueryExp($1));
609 }
612 } 610 }
613 | media_query_exp_list maybe_space MEDIA_AND maybe_space media_query_exp { 611 | media_query_exp_list MEDIA_AND maybe_space media_query_exp {
614 $$ = $1; 612 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.
615 $$->append(parser->sinkFloatingMediaQueryExp($5)); 613 $$ = $1;
614 $$->append(parser->sinkFloatingMediaQueryExp($4));
615 }
616 else
617 $$ = 0;
616 } 618 }
617 ; 619 ;
618 620
619 maybe_and_media_query_exp_list: 621 maybe_and_media_query_exp_list:
620 /*empty*/ { 622 /*empty*/ {
621 $$ = parser->createFloatingMediaQueryExpList(); 623 $$ = parser->createFloatingMediaQueryExpList();
622 } 624 }
623 | MEDIA_AND maybe_space media_query_exp_list { 625 | MEDIA_AND maybe_space media_query_exp_list {
624 $$ = $3; 626 $$ = $3;
625 } 627 }
626 ; 628 ;
627 629
628 maybe_media_restrictor: 630 maybe_media_restrictor:
629 /*empty*/ { 631 /*empty*/ {
630 $$ = MediaQuery::None; 632 $$ = MediaQuery::None;
631 } 633 }
632 | MEDIA_ONLY { 634 | MEDIA_ONLY maybe_space {
633 $$ = MediaQuery::Only; 635 $$ = MediaQuery::Only;
634 } 636 }
635 | MEDIA_NOT { 637 | MEDIA_NOT maybe_space {
636 $$ = MediaQuery::Not; 638 $$ = MediaQuery::Not;
637 } 639 }
638 ; 640 ;
639 641
640 media_query: 642 media_query:
641 media_query_exp_list { 643 media_query_exp_list {
642 $$ = parser->createFloatingMediaQuery(parser->sinkFloatingMediaQueryExpL ist($1)); 644 if ($1)
645 $$ = parser->createFloatingMediaQuery(parser->sinkFloatingMediaQuery ExpList($1));
646 else
647 $$ = 0;
643 } 648 }
644 | 649 | maybe_media_restrictor medium maybe_and_media_query_exp_list {
645 maybe_media_restrictor maybe_space medium maybe_and_media_query_exp_list { 650 parser->tokenToLowerCase($2);
646 parser->tokenToLowerCase($3); 651 if ($3)
647 $$ = parser->createFloatingMediaQuery($1, $3, parser->sinkFloatingMediaQ ueryExpList($4)); 652 $$ = parser->createFloatingMediaQuery($1, $2, parser->sinkFloatingMe diaQueryExpList($3));
653 else
654 $$ = 0;
655 }
656 | error rule_error_recovery {
657 $$ = 0;
648 } 658 }
649 ; 659 ;
650 660
651 maybe_media_list: 661 maybe_media_list:
652 /* empty */ { 662 /* empty */ {
653 $$ = parser->createMediaQuerySet(); 663 $$ = parser->createMediaQuerySet();
654 } 664 }
655 | media_list 665 | media_list
656 ; 666 ;
657 667
658 media_list: 668 media_list:
659 media_query { 669 media_query {
660 $$ = parser->createMediaQuerySet(); 670 $$ = parser->createMediaQuerySet();
661 $$->addMediaQuery(parser->sinkFloatingMediaQuery($1)); 671 MediaQuery* query = $1;
672 if (!query)
673 query = parser->createFloatingNotAllQuery();
674 $$->addMediaQuery(parser->sinkFloatingMediaQuery(query));
662 parser->updateLastMediaLine($$); 675 parser->updateLastMediaLine($$);
663 } 676 }
664 | media_list ',' maybe_space media_query { 677 | mq_list media_query {
665 $$ = $1; 678 $$ = $1;
666 if ($$) { 679 MediaQuery* query = $2;
667 $$->addMediaQuery(parser->sinkFloatingMediaQuery($4)); 680 if (!query)
668 parser->updateLastMediaLine($$); 681 query = parser->createFloatingNotAllQuery();
669 } 682 $$->addMediaQuery(parser->sinkFloatingMediaQuery($2));
683 parser->updateLastMediaLine($$);
670 } 684 }
671 | media_list error { 685 | mq_list {
672 $$ = 0; 686 $$ = $1;
687 $$->addMediaQuery(parser->sinkFloatingMediaQuery(parser->createFloatingN otAllQuery()));
688 parser->updateLastMediaLine($$);
673 } 689 }
674 ; 690 ;
675 691
692 mq_list:
693 media_query ',' maybe_space {
694 $$ = parser->createMediaQuerySet();
695 MediaQuery* query = $1;
696 if (!query)
697 query = parser->createFloatingNotAllQuery();
698 $$->addMediaQuery(parser->sinkFloatingMediaQuery(query));
699 }
700 | mq_list media_query ',' maybe_space {
701 $$ = $1;
702 MediaQuery* query = $2;
703 if (!query)
704 query = parser->createFloatingNotAllQuery();
705 $$->addMediaQuery(parser->sinkFloatingMediaQuery(query));
706 }
707 ;
708
676 at_rule_body_start: 709 at_rule_body_start:
677 /* empty */ { 710 /* empty */ {
678 parser->startRuleBody(); 711 parser->startRuleBody();
679 } 712 }
680 ; 713 ;
681 714
682 before_media_rule: 715 before_media_rule:
683 /* empty */ { 716 /* empty */ {
684 parser->startRuleHeader(CSSRuleSourceData::MEDIA_RULE); 717 parser->startRuleHeader(CSSRuleSourceData::MEDIA_RULE);
685 } 718 }
686 ; 719 ;
687 720
688 at_rule_header_end_maybe_space: 721 at_rule_header_end_maybe_space:
689 maybe_space { 722 maybe_space {
690 parser->endRuleHeader(); 723 parser->endRuleHeader();
691 } 724 }
692 ; 725 ;
693 726
694 media: 727 media:
695 before_media_rule MEDIA_SYM maybe_space media_list at_rule_header_end '{' at _rule_body_start maybe_space block_rule_body closing_brace { 728 before_media_rule MEDIA_SYM maybe_space media_list at_rule_header_end '{' at _rule_body_start maybe_space block_rule_body closing_brace {
696 $$ = parser->createMediaRule($4, $9); 729 $$ = parser->createMediaRule($4, $9);
697 } 730 }
698 | before_media_rule MEDIA_SYM at_rule_header_end_maybe_space '{' at_rule_bod y_start maybe_space block_rule_body closing_brace { 731 | before_media_rule MEDIA_SYM at_rule_header_end_maybe_space '{' at_rule_bod y_start maybe_space block_rule_body closing_brace {
699 $$ = parser->createMediaRule(0, $7); 732 $$ = parser->createMediaRule(0, $7);
700 } 733 }
734 | 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
735 $$ = 0;
736 parser->endRuleBody(true);
737 }
701 | before_media_rule MEDIA_SYM at_rule_recovery { 738 | before_media_rule MEDIA_SYM at_rule_recovery {
702 $$ = 0; 739 $$ = 0;
703 parser->endRuleBody(true); 740 parser->endRuleBody(true);
704 } 741 }
705 ; 742 ;
706 743
707 medium: 744 medium:
708 IDENT maybe_space { 745 IDENT maybe_space {
709 $$ = $1; 746 $$ = $1;
710 } 747 }
(...skipping 1278 matching lines...) Expand 10 before | Expand all | Expand 10 after
1989 2026
1990 rule_error_recovery: 2027 rule_error_recovery:
1991 /* empty */ 2028 /* empty */
1992 | rule_error_recovery error 2029 | rule_error_recovery error
1993 | rule_error_recovery invalid_square_brackets_block 2030 | rule_error_recovery invalid_square_brackets_block
1994 | rule_error_recovery invalid_parentheses_block 2031 | rule_error_recovery invalid_parentheses_block
1995 ; 2032 ;
1996 2033
1997 %% 2034 %%
1998 2035
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698