WebCore:
[WebKit-https.git] / WebCore / css / CSSGrammar.y
index 7d70b31d22ceaab9cdf06aaa3b38d7a080ac979b..2c1a17bb75238f2015240e207f8de15e109b2595 100644 (file)
@@ -85,11 +85,12 @@ static int cssyylex(YYSTYPE* yylval, void* parser)
 
 %}
 
-%expect 46
+%expect 49
 
 %left UNIMPORTANT_TOK
 
 %token WHITESPACE SGML_CD
+%token TOKEN_EOF 0
 
 %token INCLUDES
 %token DASHMATCH
@@ -171,10 +172,16 @@ static int cssyylex(YYSTYPE* yylval, void* parser)
 %type <rule> page
 %type <rule> font_face
 %type <rule> invalid_rule
+%type <rule> save_block
 %type <rule> invalid_at
+%type <rule> invalid_at_list
 %type <rule> invalid_import
+%type <rule> invalid_media
 %type <rule> rule
 %type <rule> valid_rule
+%type <ruleList> block_rule_list 
+%type <rule> block_rule
+%type <rule> block_valid_rule
 %type <rule> variables_rule
 %type <mediaList> variables_media_list
 
@@ -197,8 +204,6 @@ static int cssyylex(YYSTYPE* yylval, void* parser)
 %type <mediaQueryExpList> media_query_exp_list
 %type <mediaQueryExpList> maybe_and_media_query_exp_list
 
-%type <ruleList> ruleset_list
-
 %type <integer> property
 
 %type <selector> specifier
@@ -312,7 +317,12 @@ maybe_charset:
    /* empty */
   | charset {
   }
-;
+  ;
+
+closing_brace:
+    '}'
+  | %prec maybe_sgml TOKEN_EOF
+  ;
 
 charset:
   CHARSET_SYM maybe_space STRING maybe_space ';' {
@@ -334,6 +344,8 @@ import_list:
      if ($2 && p->m_styleSheet)
          p->m_styleSheet->append($2);
  }
+ | invalid_at_list {
+ }
  ;
 
 variables_list:
@@ -373,16 +385,46 @@ rule:
   | invalid_import
   ;
 
+block_rule_list: 
+    /* empty */ { $$ = 0; }
+  | block_rule_list block_rule maybe_sgml {
+      $$ = $1;
+      if ($2) {
+          if (!$$)
+              $$ = static_cast<CSSParser*>(parser)->createRuleList();
+          $$->append($2);
+      }
+  }
+  ;
+
+block_valid_rule:
+    ruleset
+  | page
+  | font_face
+  ;
+
+block_rule:
+    block_valid_rule
+  | invalid_rule
+  | invalid_at
+  | invalid_import
+  | invalid_media
+  ;
+
+
 import:
     IMPORT_SYM maybe_space string_or_uri maybe_space maybe_media_list ';' {
         $$ = static_cast<CSSParser*>(parser)->createImportRule($3, $5);
     }
-  | IMPORT_SYM error invalid_block {
+  | IMPORT_SYM maybe_space string_or_uri maybe_space maybe_media_list invalid_block {
         $$ = 0;
     }
   | IMPORT_SYM error ';' {
         $$ = 0;
     }
+  | IMPORT_SYM error invalid_block {
+        $$ = 0;
+    }
   ;
 
 variables_rule:
@@ -596,26 +638,14 @@ media_list:
     ;
 
 media:
-    MEDIA_SYM maybe_space media_list '{' maybe_space ruleset_list '}' {
+    MEDIA_SYM maybe_space media_list '{' maybe_space block_rule_list save_block {
         $$ = static_cast<CSSParser*>(parser)->createMediaRule($3, $6);
     }
-    | MEDIA_SYM maybe_space '{' maybe_space ruleset_list '}' {
+    | MEDIA_SYM maybe_space '{' maybe_space block_rule_list save_block {
         $$ = static_cast<CSSParser*>(parser)->createMediaRule(0, $5);
     }
     ;
 
-ruleset_list:
-    /* empty */ { $$ = 0; }
-    | ruleset_list ruleset maybe_space {
-        $$ = $1;
-        if ($2) {
-            if (!$$)
-                $$ = static_cast<CSSParser*>(parser)->createRuleList();
-            $$->append($2);
-        }
-    }
-    ;
-
 medium:
   IDENT maybe_space {
       $$ = $1;
@@ -667,7 +697,7 @@ unary_operator:
   ;
 
 ruleset:
-    selector_list '{' maybe_space declaration_list '}' {
+    selector_list '{' maybe_space declaration_list closing_brace {
         $$ = static_cast<CSSParser*>(parser)->createStyleRule($1);
     }
   ;
@@ -1080,6 +1110,9 @@ declaration_list:
     | decl_list error {
         $$ = $1;
     }
+    | decl_list invalid_block_list {
+        $$ = $1;
+    }
     ;
 
 decl_list:
@@ -1134,6 +1167,11 @@ declaration:
         $$ = false;
     }
     |
+    property ':' maybe_space expr prio error {
+        /* When we encounter something like p {color: red !important fail;} we should drop the declaration */
+        $$ = false;
+    }
+    |
     IMPORTANT_SYM maybe_space {
         /* Handle this case: div { text-align: center; !important } Just reduce away the stray !important. */
         $$ = false;
@@ -1148,6 +1186,11 @@ declaration:
         /* if we come across rules with invalid values like this case: p { weight: *; }, just discard the rule */
         $$ = false;
     }
+    |
+    property invalid_block {
+        /* if we come across: div { color{;color:maroon} }, ignore everything within curly brackets */
+        $$ = false;
+    }
   ;
 
 property:
@@ -1293,6 +1336,15 @@ hexcolor:
 
 /* error handling rules */
 
+save_block:
+    closing_brace {
+        $$ = 0;
+    }
+  | error closing_brace {
+        $$ = 0;
+    }
+    ;
+
 invalid_at:
     ATKEYWORD error invalid_block {
         $$ = 0;
@@ -1302,16 +1354,28 @@ invalid_at:
     }
     ;
 
+invalid_at_list:
+    invalid_at maybe_sgml
+  | invalid_at_list invalid_at maybe_sgml
+  ;
+
 invalid_import:
     import {
         $$ = 0;
     }
     ;
 
+invalid_media:
+    media {
+        $$ = 0;
+    }
+    ;
+
 invalid_rule:
     error invalid_block {
         $$ = 0;
     }
+
 /*
   Seems like the two rules below are trying too much and violating
   http://www.hixie.ch/tests/evil/mixed/csserrorhandling.html
@@ -1326,8 +1390,8 @@ invalid_rule:
     ;
 
 invalid_block:
-    '{' error invalid_block_list error '}'
-  | '{' error '}'
+    '{' error invalid_block_list error closing_brace
+  | '{' error closing_brace
     ;
 
 invalid_block_list: