Changeset 155536 in webkit
- Timestamp:
- Sep 11, 2013 9:48:20 AM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r155534 r155536 1 2013-09-11 Darin Adler <darin@apple.com> 2 3 Rework CSS parser, eliminating "floating" concept and using %destructor 4 https://bugs.webkit.org/show_bug.cgi?id=121161 5 6 Reviewed by Antti Koivisto. 7 8 This is some basic improvement, but there is still room for a lot more 9 consistent approach and formatting in this file. There is a mix of code that 10 works by side effects in the CSSParser class and code that works with the 11 values that bison generates in the union that is more or less random. And 12 the data structures seem too costly, with too much heap allocation. And the 13 CSSParser class has grown massive, with a mix of both function for use by 14 code that wants to trigger parsing, and helper functions called by code in 15 the grammar file. All of that can benefit from more refinement in the future. 16 17 * css/CSSGrammar.y.in: Made some incremental improvements to the structure 18 of the grammar file, including: 19 - Breaking up the %union so types are declared next to their use 20 - Eliminating one shift/reduce conflict caused by two "maybe_space" in a row 21 - Breaking the conditional sections out into their own sections instead of 22 scattering them in with the other code. 23 - Eliminating unused return values in productions such as charset, 24 ignored_charset, namespace, margin_box, invalid_rule, save_block, 25 invalid_at, and declarations_and_margins. 26 - Adding %destructor to productions that return values that need to be deleted 27 or deref'd. This removes the need for CSSParser to separately track these 28 as "floating" to clean up in case of errors. 29 - Removing unneeded productions such as media_feature, region_selector, 30 attr_name, and medium. 31 - Removing explicit code blocks that just say "$$ = $1" or empty blocks when 32 there is no return type, since those are default. 33 - Formatting many productions on single lines since I find them easier to read. 34 Later I think we could make many more CSSParser functions and make even 35 more of the production single lines in the grammar file. 36 - Using adoptPtr, adoptRef, delete, deref, leakPtr, and leakRef to put 37 heap allocated values into and out of the union without storage leaks. 38 39 * css/CSSParser.cpp: 40 (WebCore::CSSParser::~CSSParser): Remove the now-unneeded deleteAllValues for 41 the various colections of floating things. 42 (WebCore::CSSParser::createFilterRule): Don't put the rule into m_parsedRules, 43 just return a PassRefPtr instead. 44 (WebCore::CSSParser::createImportRule): Ditto. 45 (WebCore::CSSParser::createMediaRule): Ditto. 46 (WebCore::CSSParser::createEmptyMediaRule): Ditto. 47 (WebCore::CSSParser::createSupportsRule): Ditto. 48 (WebCore::CSSParser::createKeyframesRule): Ditto. 49 (WebCore::CSSParser::createStyleRule): Ditto. 50 (WebCore::CSSParser::createFontFaceRule): Ditto. 51 (WebCore::CSSParser::createHostRule): Ditto. 52 (WebCore::CSSParser::rewriteSpecifiersWithNamespaceIfNeeded): Got rid of the 53 unused return value from this function and changed it to to take a reference 54 instead of a pointer. 55 (WebCore::CSSParser::rewriteSpecifiersWithElementName): Ditto. 56 (WebCore::CSSParser::rewriteSpecifiers): Changed this to take and return OwnPtr. 57 (WebCore::CSSParser::createPageRule): Don't put rule into m_parsedRules, return 58 PassRefPtr instead. 59 (WebCore::CSSParser::createSelectorVector): Added. Used to implement the 60 optimization where we recycle a single selector vector. Not sure we still need 61 this, or maybe we need more optimizations like it, but for now keep it. 62 (WebCore::CSSParser::recycleSelectorVector): Ditto. 63 (WebCore::CSSParser::createRegionRule): Don't put rule into m_parsedRules, return 64 PassRefPtr instead. 65 (WebCore::CSSParser::createMarginAtRule): Got rid of unused return value. 66 When this function is implemented for real, we might add a return value. 67 (WebCore::CSSParser::createKeyframe): Don't put keyframe into m_parsedKeyframes, 68 return PassRefPtr instead. 69 (WebCore::CSSParser::createViewportRule): Don't put rule into m_parsedRules, return 70 PassRefPtr instead. 71 72 * css/CSSParser.h: Removed many now-needed functions to manage floating items. 73 Changed rule creation functions to return PassRefPtr. Other changes as mentioned above. 74 75 * css/CSSParserValues.cpp: 76 (WebCore::destroy): Added. 77 (WebCore::CSSParserValueList::~CSSParserValueList): Updated to call destroy. 78 * css/CSSParserValues.h: Ditto. 79 1 80 2013-09-11 Mario Sanchez Prada <mario.prada@samsung.com> 2 81 -
trunk/Source/WebCore/css/CSSGrammar.y.in
r153822 r155536 28 28 29 29 %union { 30 bool boolean;31 char character;32 int integer;33 30 double number; 34 31 CSSParserString string; 35 36 StyleRuleBase* rule;37 Vector<RefPtr<StyleRuleBase> >* ruleList;38 CSSParserSelector* selector;39 Vector<OwnPtr<CSSParserSelector> >* selectorList;40 32 CSSSelector::MarginBoxType marginBox; 41 CSSSelector::Relation relation;42 MediaQuerySet* mediaList;43 MediaQuery* mediaQuery;44 MediaQuery::Restrictor mediaQueryRestrictor;45 MediaQueryExp* mediaQueryExp;46 33 CSSParserValue value; 47 CSSParserValueList* valueList;48 Vector<OwnPtr<MediaQueryExp> >* mediaQueryExpList;49 StyleKeyframe* keyframe;50 Vector<RefPtr<StyleKeyframe> >* keyframeRuleList;51 float val;52 CSSPropertyID id;53 CSSParser::Location location;54 34 } 55 35 … … 89 69 90 70 #if ENABLE_SHADOW_DOM 91 %expect 3 271 %expect 31 92 72 #else 93 %expect 3 173 %expect 30 94 74 #endif 95 75 … … 123 103 %token PAGE_SYM 124 104 %token MEDIA_SYM 125 #if ENABLE_CSS3_CONDITIONAL_RULES126 %token SUPPORTS_SYM127 #endif128 105 %token FONT_FACE_SYM 129 #if ENABLE_SHADOW_DOM130 %token HOST_SYM131 #endif132 106 %token CHARSET_SYM 133 107 %token NAMESPACE_SYM … … 142 116 %token WEBKIT_REGION_RULE_SYM 143 117 %token WEBKIT_VIEWPORT_RULE_SYM 144 #if ENABLE_CSS3_CONDITIONAL_RULES145 %token WEBKIT_SUPPORTS_CONDITION_SYM146 #endif147 #if ENABLE_CSS_SHADERS148 %token WEBKIT_FILTER_RULE_SYM149 #endif150 118 %token <marginBox> TOPLEFTCORNER_SYM 151 119 %token <marginBox> TOPLEFT_SYM … … 171 139 %token MEDIA_NOT 172 140 %token MEDIA_AND 173 #if ENABLE_CSS3_CONDITIONAL_RULES174 %token SUPPORTS_NOT175 %token SUPPORTS_AND176 %token SUPPORTS_OR177 #endif178 141 179 142 %token <number> REMS … … 212 175 %token <string> FUNCTION 213 176 %token <string> ANYFUNCTION 214 #if ENABLE_VIDEO_TRACK215 %token <string> CUEFUNCTION216 #endif217 177 %token <string> NOTFUNCTION 218 178 %token <string> CALCFUNCTION … … 223 183 %token <string> UNICODERANGE 224 184 185 %union { CSSSelector::Relation relation; } 225 186 %type <relation> combinator 226 187 227 %type <rule> charset 228 %type <rule> ignored_charset 229 %type <rule> ruleset 230 %type <rule> media 231 %type <rule> import 232 %type <rule> namespace 233 %type <rule> page 234 %type <rule> margin_box 235 %type <rule> font_face 188 %union { StyleRuleBase* rule; } 189 %type <rule> block_rule block_valid_rule font_face import keyframes media page region rule ruleset valid_rule 190 %destructor { if ($$) $$->deref(); } block_rule block_valid_rule font_face import keyframes media page region rule ruleset valid_rule 191 192 %union { Vector<RefPtr<StyleRuleBase>>* ruleList; } 193 %type <ruleList> block_rule_list block_valid_rule_list 194 %destructor { delete $$; } block_rule_list block_valid_rule_list 195 196 %type <string> ident_or_string maybe_ns_prefix namespace_selector string_or_uri 197 198 %type <marginBox> margin_sym 199 200 %union { MediaQuerySet* mediaList; } 201 %type <mediaList> media_list maybe_media_list 202 %destructor { if ($$) $$->deref(); } media_list maybe_media_list 203 204 %union { MediaQuery* mediaQuery; } 205 %type <mediaQuery> media_query 206 %destructor { delete $$; } media_query 207 208 %union { MediaQuery::Restrictor mediaQueryRestrictor; } 209 %type <mediaQueryRestrictor> maybe_media_restrictor 210 211 %union { MediaQueryExp* mediaQueryExp; } 212 %type <mediaQueryExp> media_query_exp 213 %destructor { delete $$; } media_query_exp 214 215 %union { Vector<OwnPtr<MediaQueryExp>>* mediaQueryExpList; } 216 %type <mediaQueryExpList> media_query_exp_list maybe_and_media_query_exp_list 217 %destructor { delete $$; } media_query_exp_list maybe_and_media_query_exp_list 218 219 %type <string> keyframe_name 220 221 %union { StyleKeyframe* keyframe; } 222 %type <keyframe> keyframe_rule 223 %destructor { if ($$) $$->deref(); } keyframe_rule 224 225 %union { Vector<RefPtr<StyleKeyframe>>* keyframeRuleList; } 226 %type <keyframeRuleList> keyframes_rule 227 %destructor { delete $$; } keyframes_rule 228 229 // These two parser values never need to be destroyed because they are never functions. 230 %type <value> key unary_term 231 232 // These parser values need to be destroyed because they might be functions. 233 %type <value> calc_func_term calc_function function min_or_max_function term 234 %destructor { destroy($$); } calc_func_term calc_function function min_or_max_function term 235 236 %union { CSSPropertyID id; } 237 %type <id> property 238 239 %union { CSSParserSelector* selector; } 240 %type <selector> attrib class page_selector pseudo pseudo_page selector simple_selector specifier specifier_list 241 %destructor { delete $$; } attrib class page_selector pseudo pseudo_page selector simple_selector specifier specifier_list 242 243 %union { Vector<OwnPtr<CSSParserSelector>>* selectorList; } 244 %type <selectorList> selector_list simple_selector_list 245 %destructor { delete $$; } selector_list simple_selector_list 246 247 %union { bool boolean; } 248 %type <boolean> declaration declaration_list decl_list priority 249 250 %union { CSSSelector::Match match; } 251 %type <match> match 252 253 %union { int integer; } 254 %type <integer> unary_operator maybe_unary_operator 255 256 %union { char character; } 257 %type <character> operator calc_func_operator 258 259 %union { CSSParserValueList* valueList; } 260 %type <valueList> calc_func_expr calc_func_expr_list calc_func_paren_expr expr key_list maybe_media_value valid_calc_func_expr valid_expr 261 %destructor { delete $$; } calc_func_expr calc_func_expr_list calc_func_paren_expr expr key_list maybe_media_value valid_calc_func_expr valid_expr 262 263 %type <string> min_or_max 264 265 %type <string> element_name 266 267 %union { CSSParser::Location location; } 268 %type <location> error_location 269 270 #if ENABLE_CSS3_CONDITIONAL_RULES 271 272 %token SUPPORTS_AND 273 %token SUPPORTS_NOT 274 %token SUPPORTS_OR 275 %token SUPPORTS_SYM 276 %token WEBKIT_SUPPORTS_CONDITION_SYM 277 278 %type <rule> supports 279 %destructor { if ($$) $$->deref(); } supports 280 281 %type <boolean> supports_condition supports_condition_in_parens supports_conjunction supports_declaration_condition supports_disjunction supports_error supports_negation 282 283 #endif 284 285 #if ENABLE_CSS_DEVICE_ADAPTATION 286 287 %type <rule> viewport 288 %destructor { if ($$) $$->deref(); } viewport 289 290 #endif 291 292 #if ENABLE_CSS_SHADERS 293 294 %token WEBKIT_FILTER_RULE_SYM 295 296 %type <rule> filter 297 %destructor { if ($$) $$->deref(); } filter 298 299 #endif 300 236 301 #if ENABLE_SHADOW_DOM 302 303 %token HOST_SYM 304 237 305 %type <rule> host 238 #endif 239 %type <rule> keyframes 240 %type <rule> invalid_rule 241 %type <rule> save_block 242 %type <rule> invalid_at 243 %type <rule> rule 244 %type <rule> valid_rule 245 %type <ruleList> block_rule_list 246 %type <ruleList> region_block_rule_list 247 %type <rule> block_rule 248 %type <rule> block_valid_rule 249 %type <rule> region 250 #if ENABLE_CSS3_CONDITIONAL_RULES 251 %type <rule> supports 252 #endif 253 #if ENABLE_CSS_DEVICE_ADAPTATION 254 %type <rule> viewport 255 #endif 256 #if ENABLE_CSS_SHADERS 257 %type <rule> filter 258 #endif 259 260 %type <string> maybe_ns_prefix 261 262 %type <string> namespace_selector 263 264 %type <string> string_or_uri 265 %type <string> ident_or_string 266 %type <string> medium 267 %type <marginBox> margin_sym 268 269 %type <string> media_feature 270 %type <mediaList> media_list 271 %type <mediaList> maybe_media_list 272 %type <mediaQuery> media_query 273 %type <mediaQueryRestrictor> maybe_media_restrictor 274 %type <valueList> maybe_media_value 275 %type <mediaQueryExp> media_query_exp 276 %type <mediaQueryExpList> media_query_exp_list 277 %type <mediaQueryExpList> maybe_and_media_query_exp_list 278 279 #if ENABLE_CSS3_CONDITIONAL_RULES 280 %type <boolean> supports_condition 281 %type <boolean> supports_condition_in_parens 282 %type <boolean> supports_negation 283 %type <boolean> supports_conjunction 284 %type <boolean> supports_disjunction 285 %type <boolean> supports_declaration_condition 286 %type <boolean> supports_error 287 #endif 288 289 %type <string> keyframe_name 290 %type <keyframe> keyframe_rule 291 %type <keyframeRuleList> keyframes_rule 292 %type <valueList> key_list 293 %type <value> key 294 295 %type <id> property 296 297 %type <selector> specifier 298 %type <selector> specifier_list 299 %type <selector> simple_selector 300 %type <selector> selector 301 %type <selectorList> selector_list 302 %type <selectorList> simple_selector_list 303 %type <selectorList> region_selector 304 %type <selector> selector_with_trailing_whitespace 305 %type <selector> class 306 %type <selector> attrib 307 %type <selector> pseudo 308 %type <selector> pseudo_page 309 %type <selector> page_selector 310 311 %type <boolean> declaration_list 312 %type <boolean> decl_list 313 %type <boolean> declaration 314 %type <boolean> declarations_and_margins 315 316 %type <boolean> prio 317 318 %type <integer> match 319 %type <integer> unary_operator 320 %type <integer> maybe_unary_operator 321 %type <character> operator 322 323 %type <valueList> expr 324 %type <valueList> valid_expr 325 %type <value> term 326 %type <value> unary_term 327 %type <value> function 328 %type <value> calc_func_term 329 %type <character> calc_func_operator 330 %type <valueList> calc_func_expr 331 %type <valueList> valid_calc_func_expr 332 %type <valueList> calc_func_expr_list 333 %type <valueList> calc_func_paren_expr 334 %type <value> calc_function 335 %type <string> min_or_max 336 %type <value> min_or_max_function 337 338 %type <string> element_name 339 %type <string> attr_name 340 341 %type <location> error_location 306 %destructor { if ($$) $$->deref(); } host 307 308 #endif 309 310 #if ENABLE_VIDEO_TRACK 311 312 %token <string> CUEFUNCTION 313 314 #endif 342 315 343 316 %% … … 356 329 ; 357 330 358 webkit_rule: 359 WEBKIT_RULE_SYM '{' maybe_space valid_rule maybe_space '}' { 360 parser->m_rule = $4; 361 } 362 ; 363 364 webkit_keyframe_rule: 365 WEBKIT_KEYFRAME_RULE_SYM '{' maybe_space keyframe_rule maybe_space '}' { 366 parser->m_keyframe = $4; 367 } 368 ; 369 370 webkit_decls: 371 WEBKIT_DECLS_SYM '{' maybe_space_before_declaration declaration_list '}' { 372 /* can be empty */ 373 } 374 ; 331 webkit_rule: WEBKIT_RULE_SYM '{' maybe_space valid_rule maybe_space '}' { parser->m_rule = $4; } ; 332 333 webkit_keyframe_rule: WEBKIT_KEYFRAME_RULE_SYM '{' maybe_space keyframe_rule maybe_space '}' { parser->m_keyframe = adoptRef($4); } ; 334 335 webkit_decls: WEBKIT_DECLS_SYM '{' maybe_space_before_declaration declaration_list '}' ; 375 336 376 337 webkit_value: 377 338 WEBKIT_VALUE_SYM '{' maybe_space expr '}' { 378 339 if ($4) { 379 parser->m_valueList = parser->sinkFloatingValueList($4);340 parser->m_valueList = adoptPtr($4); 380 341 int oldParsedProperties = parser->m_parsedProperties.size(); 381 342 if (!parser->parseValue(parser->m_id, parser->m_important)) … … 386 347 ; 387 348 388 webkit_mediaquery: 389 WEBKIT_MEDIAQUERY_SYM WHITESPACE maybe_space media_query '}' { 390 parser->m_mediaQuery = parser->sinkFloatingMediaQuery($4); 391 } 392 ; 349 webkit_mediaquery: WEBKIT_MEDIAQUERY_SYM WHITESPACE maybe_space media_query '}' { parser->m_mediaQuery = adoptPtr($4); } ; 393 350 394 351 webkit_selector: … … 397 354 if (parser->m_selectorListForParseSelector) 398 355 parser->m_selectorListForParseSelector->adoptSelectorVector(*$4); 356 parser->recycleSelectorVector(adoptPtr($4)); 399 357 } 400 358 } … … 402 360 403 361 #if ENABLE_CSS3_CONDITIONAL_RULES 404 webkit_supports_condition: 405 WEBKIT_SUPPORTS_CONDITION_SYM '{' maybe_space supports_condition '}' { 406 parser->m_supportsCondition = $4; 407 } 408 ; 409 #endif 410 411 maybe_space: 412 /* empty */ %prec UNIMPORTANT_TOK 413 | maybe_space WHITESPACE 414 ; 415 416 maybe_sgml: 417 /* empty */ 418 | maybe_sgml SGML_CD 419 | maybe_sgml WHITESPACE 420 ; 421 422 maybe_charset: 423 /* empty */ 424 | charset { 425 } 426 ; 427 428 closing_brace: 429 '}' 430 | %prec LOWEST_PREC TOKEN_EOF 431 ; 432 433 closing_parenthesis: 434 ')' 435 | %prec LOWEST_PREC TOKEN_EOF 436 ; 362 363 webkit_supports_condition: WEBKIT_SUPPORTS_CONDITION_SYM '{' maybe_space supports_condition '}' { parser->m_supportsCondition = $4; } ; 364 365 #endif 366 367 maybe_space: /* empty */ %prec UNIMPORTANT_TOK | maybe_space WHITESPACE ; 368 369 maybe_sgml: /* empty */ | maybe_sgml SGML_CD | maybe_sgml WHITESPACE ; 370 371 maybe_charset: /* empty */ | charset ; 372 373 closing_brace: '}' | %prec LOWEST_PREC TOKEN_EOF ; 374 375 closing_parenthesis: ')' | %prec LOWEST_PREC TOKEN_EOF ; 437 376 438 377 charset: … … 442 381 if (parser->isExtractingSourceData() && parser->m_currentRuleDataStack->isEmpty() && parser->m_ruleSourceDataResult) 443 382 parser->addNewRuleToSourceTree(CSSRuleSourceData::createUnknown()); 444 $$ = 0;445 383 } 446 | CHARSET_SYM error invalid_block { 447 } 448 | CHARSET_SYM error ';' { 449 } 384 | CHARSET_SYM error invalid_block 385 | CHARSET_SYM error ';' 450 386 ; 451 387 452 ignored_charset: 453 CHARSET_SYM maybe_space STRING maybe_space ';' { 454 // Ignore any @charset rule not at the beginning of the style sheet. 455 $$ = 0; 456 } 457 | CHARSET_SYM maybe_space ';' { 458 $$ = 0; 459 } 460 ; 388 // Ignore any @charset rule not at the beginning of the style sheet. 389 ignored_charset: CHARSET_SYM maybe_space STRING maybe_space ';' | CHARSET_SYM maybe_space ';' ; 461 390 462 391 rule_list: 463 /* empty */ 464 | rule_list rule maybe_sgml { 465 if ($2 && parser->m_styleSheet) 466 parser->m_styleSheet->parserAppendRule($2); 467 } 468 ; 392 /* empty */ 393 | rule_list rule maybe_sgml { 394 if (RefPtr<StyleRuleBase> rule = adoptRef($2)) { 395 if (parser->m_styleSheet) 396 parser->m_styleSheet->parserAppendRule(rule.release()); 397 } 398 } 399 ; 469 400 470 401 valid_rule: … … 474 405 | font_face 475 406 | keyframes 476 | namespace 407 | namespace { $$ = 0; } 477 408 | import 478 409 | region … … 493 424 rule: 494 425 valid_rule { 426 $$ = $1; 495 427 parser->m_hadSyntacticallyValidCSSRule = true; 496 428 } 497 | ignored_charset498 | invalid_rule499 | invalid_at500 ;429 | ignored_charset { $$ = 0; } 430 | invalid_rule { $$ = 0; } 431 | invalid_at { $$ = 0; } 432 ; 501 433 502 434 block_rule_list: … … 504 436 | block_rule_list block_rule maybe_sgml { 505 437 $$ = $1; 506 if ( $2) {438 if (RefPtr<StyleRuleBase> rule = adoptRef($2)) { 507 439 if (!$$) 508 $$ = parser->createRuleList();509 $$->append( $2);440 $$ = new Vector<RefPtr<StyleRuleBase>>; 441 $$->append(rule.release()); 510 442 } 511 443 } 512 444 ; 513 445 514 region_block_rule_list:446 block_valid_rule_list: 515 447 /* empty */ { $$ = 0; } 516 | region_block_rule_list block_valid_rule maybe_sgml {448 | block_valid_rule_list block_valid_rule maybe_sgml { 517 449 $$ = $1; 518 if ( $2) {450 if (RefPtr<StyleRuleBase> rule = adoptRef($2)) { 519 451 if (!$$) 520 $$ = parser->createRuleList();521 $$->append( $2);452 $$ = new Vector<RefPtr<StyleRuleBase>>; 453 $$->append(rule.release()); 522 454 } 523 455 } … … 541 473 ; 542 474 543 block_rule: 544 block_valid_rule 545 | invalid_rule 546 | invalid_at 547 | namespace 548 | import 549 | region 550 ; 475 block_rule: block_valid_rule | invalid_rule { $$ = 0; } | invalid_at { $$ = 0; } | namespace { $$ = 0; } | import | region ; 551 476 552 477 at_import_header_end_maybe_space: … … 565 490 import: 566 491 before_import_rule IMPORT_SYM at_import_header_end_maybe_space string_or_uri maybe_space maybe_media_list ';' { 567 $$ = parser->createImportRule($4, $6);492 $$ = parser->createImportRule($4, adoptRef($6)).leakRef(); 568 493 } 569 494 | before_import_rule IMPORT_SYM at_import_header_end_maybe_space string_or_uri maybe_space maybe_media_list TOKEN_EOF { 570 $$ = parser->createImportRule($4, $6);495 $$ = parser->createImportRule($4, adoptRef($6)).leakRef(); 571 496 } 572 497 | before_import_rule IMPORT_SYM at_import_header_end_maybe_space string_or_uri maybe_space maybe_media_list invalid_block { 573 498 $$ = 0; 574 499 parser->popRuleData(); 500 if ($6) 501 $6->deref(); 575 502 } 576 503 | before_import_rule IMPORT_SYM error ';' { … … 585 512 586 513 namespace: 587 NAMESPACE_SYM maybe_space maybe_ns_prefix string_or_uri maybe_space ';' { 588 parser->addNamespace($3, $4); 589 $$ = 0; 590 } 591 | NAMESPACE_SYM maybe_space maybe_ns_prefix string_or_uri maybe_space invalid_block { 592 $$ = 0; 593 } 594 | NAMESPACE_SYM error invalid_block { 595 $$ = 0; 596 } 597 | NAMESPACE_SYM error ';' { 598 $$ = 0; 599 } 600 ; 601 602 maybe_ns_prefix: 603 /* empty */ { $$.clear(); } 604 | IDENT maybe_space { $$ = $1; } 605 ; 606 607 string_or_uri: 608 STRING 609 | URI 610 ; 611 612 media_feature: 613 IDENT maybe_space { 614 $$ = $1; 615 } 616 ; 617 618 maybe_media_value: 619 /*empty*/ { 620 $$ = 0; 621 } 622 | ':' maybe_space expr maybe_space { 623 $$ = $3; 624 } 625 ; 514 NAMESPACE_SYM maybe_space maybe_ns_prefix string_or_uri maybe_space ';' { parser->addNamespace($3, $4); } 515 | NAMESPACE_SYM maybe_space maybe_ns_prefix string_or_uri maybe_space invalid_block 516 | NAMESPACE_SYM error invalid_block 517 | NAMESPACE_SYM error ';' 518 ; 519 520 maybe_ns_prefix: /* empty */ { $$.clear(); } | IDENT maybe_space; 521 522 string_or_uri: STRING | URI ; 523 524 maybe_media_value: /*empty*/ { $$ = 0; } | ':' maybe_space expr maybe_space { $$ = $3; } ; 626 525 627 526 media_query_exp: 628 maybe_media_restrictor maybe_space '(' maybe_space media_featuremaybe_space maybe_media_value ')' maybe_space {527 maybe_media_restrictor maybe_space '(' maybe_space IDENT maybe_space maybe_media_value ')' maybe_space { 629 528 // If restrictor is specified, media query expression is invalid. 630 529 // Create empty media query expression and continue parsing media query. 530 OwnPtr<CSSParserValueList> mediaValue = adoptPtr($7); 631 531 if ($1 != MediaQuery::None) 632 $$ = parser->createFloatingMediaQueryExp("", 0);532 $$ = MediaQueryExp::create(emptyString(), nullptr).leakPtr(); 633 533 else { 634 534 $5.lower(); 635 $$ = parser->createFloatingMediaQueryExp($5, $7);535 $$ = MediaQueryExp::create($5, mediaValue.get()).leakPtr(); 636 536 } 637 537 } … … 640 540 media_query_exp_list: 641 541 media_query_exp { 642 $$ = parser->createFloatingMediaQueryExpList();643 $$->append( parser->sinkFloatingMediaQueryExp($1));542 $$ = new Vector<OwnPtr<MediaQueryExp>>; 543 $$->append(adoptPtr($1)); 644 544 } 645 545 | media_query_exp_list maybe_space MEDIA_AND maybe_space media_query_exp { 646 546 $$ = $1; 647 $$->append( parser->sinkFloatingMediaQueryExp($5));547 $$->append(adoptPtr($5)); 648 548 } 649 549 ; … … 651 551 maybe_and_media_query_exp_list: 652 552 /*empty*/ { 653 $$ = parser->createFloatingMediaQueryExpList();553 $$ = new Vector<OwnPtr<MediaQueryExp>>; 654 554 } 655 555 | MEDIA_AND maybe_space media_query_exp_list { … … 672 572 media_query: 673 573 media_query_exp_list { 674 $$ = parser->createFloatingMediaQuery(parser->sinkFloatingMediaQueryExpList($1));574 $$ = new MediaQuery(MediaQuery::None, "all", adoptPtr($1)); 675 575 } 676 576 | 677 maybe_media_restrictor maybe_space mediummaybe_and_media_query_exp_list {577 maybe_media_restrictor maybe_space IDENT maybe_space maybe_and_media_query_exp_list { 678 578 $3.lower(); 679 $$ = parser->createFloatingMediaQuery($1, $3, parser->sinkFloatingMediaQueryExpList($4)); 680 } 681 ; 682 683 maybe_media_list: 684 /* empty */ { 685 $$ = parser->createMediaQuerySet(); 686 } 687 | media_list 688 ; 579 $$ = new MediaQuery($1, $3, adoptPtr($5)); 580 } 581 ; 582 583 maybe_media_list: /* empty */ { $$ = MediaQuerySet::create().leakRef(); } | media_list ; 689 584 690 585 media_list: 691 586 media_query { 692 $$ = parser->createMediaQuerySet();693 $$->addMediaQuery( parser->sinkFloatingMediaQuery($1));587 $$ = MediaQuerySet::create().leakRef(); 588 $$->addMediaQuery(adoptPtr($1)); 694 589 parser->updateLastMediaLine($$); 695 590 } 696 591 | media_list ',' maybe_space media_query { 697 592 $$ = $1; 593 OwnPtr<MediaQuery> mediaQuery = adoptPtr($4); 698 594 if ($$) { 699 $$->addMediaQuery( parser->sinkFloatingMediaQuery($4));595 $$->addMediaQuery(mediaQuery.release()); 700 596 parser->updateLastMediaLine($$); 701 597 } … … 703 599 | media_list error { 704 600 $$ = 0; 601 if ($1) 602 $1->deref(); 705 603 } 706 604 ; … … 726 624 media: 727 625 before_media_rule MEDIA_SYM maybe_space media_list at_rule_header_end '{' at_rule_body_start maybe_space block_rule_list save_block { 728 $$ = parser->createMediaRule( $4, $9);626 $$ = parser->createMediaRule(adoptRef($4), adoptPtr($9).get()).leakRef(); 729 627 } 730 628 | before_media_rule MEDIA_SYM at_rule_header_end_maybe_space '{' at_rule_body_start maybe_space block_rule_list save_block { 731 $$ = parser->createEmptyMediaRule( $7);629 $$ = parser->createEmptyMediaRule(adoptPtr($7).get()).leakRef(); 732 630 } 733 631 | before_media_rule MEDIA_SYM at_rule_header_end_maybe_space ';' { … … 737 635 ; 738 636 739 medium:740 IDENT maybe_space {741 $$ = $1;742 }743 ;744 745 637 #if ENABLE_CSS3_CONDITIONAL_RULES 638 746 639 supports: 747 640 before_supports_rule SUPPORTS_SYM maybe_space supports_condition at_supports_rule_header_end '{' at_rule_body_start maybe_space block_rule_list save_block { 748 $$ = parser->createSupportsRule($4, $9);641 $$ = parser->createSupportsRule($4, adoptPtr($9).get()).leakRef(); 749 642 } 750 643 | before_supports_rule SUPPORTS_SYM supports_error { … … 755 648 ; 756 649 757 supports_error: 758 error ';' 759 | error invalid_block 650 supports_error: error ';' | error invalid_block ; 760 651 761 652 before_supports_rule: … … 773 664 ; 774 665 775 supports_condition: 776 supports_condition_in_parens 777 | supports_negation 778 | supports_conjunction 779 | supports_disjunction 780 ; 781 782 supports_negation: 783 SUPPORTS_NOT maybe_space supports_condition_in_parens { 784 $$ = !$3; 785 } 786 ; 666 supports_condition: supports_condition_in_parens | supports_negation | supports_conjunction | supports_disjunction ; 667 668 supports_negation: SUPPORTS_NOT maybe_space supports_condition_in_parens { $$ = !$3; } ; 787 669 788 670 supports_conjunction: 789 supports_condition_in_parens SUPPORTS_AND maybe_space supports_condition_in_parens { 790 $$ = $1 && $4; 791 } 792 | supports_conjunction SUPPORTS_AND maybe_space supports_condition_in_parens { 793 $$ = $1 && $4; 794 } 671 supports_condition_in_parens SUPPORTS_AND maybe_space supports_condition_in_parens { $$ = $1 && $4; } 672 | supports_conjunction SUPPORTS_AND maybe_space supports_condition_in_parens { $$ = $1 && $4; } 795 673 ; 796 674 797 675 supports_disjunction: 798 supports_condition_in_parens SUPPORTS_OR maybe_space supports_condition_in_parens { 799 $$ = $1 || $4; 800 } 801 | supports_disjunction SUPPORTS_OR maybe_space supports_condition_in_parens { 802 $$ = $1 || $4; 803 } 676 supports_condition_in_parens SUPPORTS_OR maybe_space supports_condition_in_parens { $$ = $1 || $4; } 677 | supports_disjunction SUPPORTS_OR maybe_space supports_condition_in_parens { $$ = $1 || $4; } 804 678 ; 805 679 806 680 supports_condition_in_parens: 807 '(' maybe_space supports_condition ')' maybe_space { 808 $$ = $3; 809 } 681 '(' maybe_space supports_condition ')' maybe_space { $$ = $3; } 810 682 | supports_declaration_condition 811 683 | '(' error ')' … … 813 685 814 686 supports_declaration_condition: 815 '(' maybe_space property ':' maybe_space expr prio ')' maybe_space {687 '(' maybe_space property ':' maybe_space expr priority ')' maybe_space { 816 688 $$ = false; 817 689 CSSParser* p = static_cast<CSSParser*>(parser); 818 if ($3 && $6) { 819 p->m_valueList = p->sinkFloatingValueList($6); 690 OwnPtr<CSSParserExpression> propertyValue = adoptPtr($6); 691 if ($3 && propertyValue) { 692 p->m_valueList = propertyValue.release(); 820 693 int oldParsedProperties = p->m_parsedProperties.size(); 821 $$ = p->parseValue( static_cast<CSSPropertyID>($3), $7);694 $$ = p->parseValue($3, $7); 822 695 // We just need to know if the declaration is supported as it is written. Rollback any additions. 823 696 if ($$) … … 828 701 } 829 702 ; 703 830 704 #endif 831 705 … … 838 712 keyframes: 839 713 before_keyframes_rule WEBKIT_KEYFRAMES_SYM maybe_space keyframe_name at_rule_header_end_maybe_space '{' at_rule_body_start maybe_space keyframes_rule closing_brace { 840 $$ = parser->createKeyframesRule($4, parser->sinkFloatingKeyframeVector($9));714 $$ = parser->createKeyframesRule($4, adoptPtr($9)).leakRef(); 841 715 } 842 716 ; 843 717 844 keyframe_name: 845 IDENT 846 | STRING 847 ; 718 keyframe_name: IDENT | STRING ; 848 719 849 720 keyframes_rule: 850 /* empty */ { $$ = parser->createFloatingKeyframeVector(); }721 /* empty */ { $$ = new Vector<RefPtr<StyleKeyframe>>; } 851 722 | keyframes_rule keyframe_rule maybe_space { 852 723 $$ = $1; 853 if ($2) 854 $$->append($2); 855 } 856 ; 857 858 keyframe_rule: 859 key_list maybe_space '{' maybe_space declaration_list closing_brace { 860 $$ = parser->createKeyframe($1); 861 } 862 ; 724 if (RefPtr<StyleKeyframe> keyframe = adoptRef($2)) 725 $$->append(keyframe.release()); 726 } 727 ; 728 729 keyframe_rule: key_list maybe_space '{' maybe_space declaration_list closing_brace { $$ = parser->createKeyframe(*adoptPtr($1)).leakRef(); } ; 863 730 864 731 key_list: 865 732 key { 866 $$ = parser->createFloatingValueList();867 $$->addValue( parser->sinkFloatingValue($1));733 $$ = new CSSParserValueList; 734 $$->addValue($1); 868 735 } 869 736 | key_list maybe_space ',' maybe_space key { 870 737 $$ = $1; 738 ASSERT($5.unit != CSSParserValue::Function); // No need to call destroy. 871 739 if ($$) 872 $$->addValue( parser->sinkFloatingValue($5));740 $$->addValue($5); 873 741 } 874 742 ; … … 903 771 '{' at_rule_body_start maybe_space_before_declaration declarations_and_margins closing_brace { 904 772 if ($4) 905 $$ = parser->createPageRule( parser->sinkFloatingSelector($4));773 $$ = parser->createPageRule(adoptPtr($4)).leakRef(); 906 774 else { 907 775 // Clear properties in the invalid @page rule. … … 913 781 } 914 782 | before_page_rule PAGE_SYM error invalid_block { 915 parser->popRuleData();916 $$ = 0;783 parser->popRuleData(); 784 $$ = 0; 917 785 } 918 786 | before_page_rule PAGE_SYM error ';' { 919 parser->popRuleData();920 $$ = 0;787 parser->popRuleData(); 788 $$ = 0; 921 789 } 922 790 ; … … 924 792 page_selector: 925 793 IDENT { 926 $$ = parser->createFloatingSelectorWithTagName(QualifiedName(nullAtom, $1, parser->m_defaultNamespace));794 $$ = new CSSParserSelector(QualifiedName(nullAtom, $1, parser->m_defaultNamespace)); 927 795 $$->setForPage(); 928 796 } … … 940 808 } 941 809 | /* empty */ { 942 $$ = parser->createFloatingSelector();810 $$ = new CSSParserSelector; 943 811 $$->setForPage(); 944 812 } 945 813 ; 946 814 947 declarations_and_margins: 948 declaration_list 949 | declarations_and_margins margin_box maybe_space declaration_list 950 ; 815 declarations_and_margins: declaration_list | declarations_and_margins margin_box maybe_space declaration_list ; 951 816 952 817 margin_box: … … 954 819 parser->startDeclarationsForMarginBox(); 955 820 } maybe_space '{' maybe_space declaration_list closing_brace { 956 $$ =parser->createMarginAtRule($1);957 } 958 ; 959 960 margin_sym 821 parser->createMarginAtRule($1); 822 } 823 ; 824 825 margin_sym: 961 826 TOPLEFTCORNER_SYM { 962 827 $$ = CSSSelector::TopLeftCornerMarginBox; … … 1016 881 1017 882 font_face: 1018 before_font_face_rule FONT_FACE_SYM at_rule_header_end_maybe_space 1019 '{' at_rule_body_start maybe_space_before_declaration declaration_list closing_brace { 1020 $$ = parser->createFontFaceRule(); 883 before_font_face_rule FONT_FACE_SYM at_rule_header_end_maybe_space '{' at_rule_body_start maybe_space_before_declaration declaration_list closing_brace { 884 $$ = parser->createFontFaceRule().leakRef(); 1021 885 } 1022 886 | before_font_face_rule FONT_FACE_SYM error invalid_block { 1023 $$ = 0;1024 parser->popRuleData();887 $$ = 0; 888 parser->popRuleData(); 1025 889 } 1026 890 | before_font_face_rule FONT_FACE_SYM error ';' { 1027 $$ = 0;1028 parser->popRuleData();891 $$ = 0; 892 parser->popRuleData(); 1029 893 } 1030 894 ; 1031 895 1032 896 #if ENABLE_SHADOW_DOM 897 1033 898 before_host_rule: 1034 899 /* empty */ { … … 1038 903 1039 904 host: 1040 before_host_rule HOST_SYM at_rule_header_end_maybe_space 1041 '{' at_rule_body_start maybe_space block_rule_list save_block { 1042 $$ = parser->createHostRule($7); 905 before_host_rule HOST_SYM at_rule_header_end_maybe_space '{' at_rule_body_start maybe_space block_rule_list save_block { 906 $$ = parser->createHostRule(adoptPtr($7).get()).leakRef(); 1043 907 } 1044 908 | before_host_rule HOST_SYM at_rule_header_end_maybe_space ';' { … … 1047 911 } 1048 912 ; 913 1049 914 #endif 1050 915 1051 916 #if ENABLE_CSS_DEVICE_ADAPTATION 917 1052 918 before_viewport_rule: 1053 919 /* empty */ { … … 1060 926 before_viewport_rule WEBKIT_VIEWPORT_RULE_SYM at_rule_header_end_maybe_space 1061 927 '{' at_rule_body_start maybe_space_before_declaration declaration_list closing_brace { 1062 $$ = parser->createViewportRule() ;928 $$ = parser->createViewportRule().leakRef(); 1063 929 parser->markViewportRuleBodyEnd(); 1064 930 } … … 1074 940 } 1075 941 ; 1076 #endif 1077 1078 region_selector: 1079 selector_list { 1080 if ($1) { 1081 parser->setReusableRegionSelectorVector($1); 1082 $$ = parser->reusableRegionSelectorVector(); 1083 } 1084 else 1085 $$ = 0; 1086 } 1087 ; 942 943 #endif 1088 944 1089 945 before_region_rule: … … 1094 950 1095 951 region: 1096 before_region_rule WEBKIT_REGION_RULE_SYM WHITESPACE region_selector at_rule_header_end '{' at_rule_body_start maybe_space region_block_rule_list save_block { 952 before_region_rule WEBKIT_REGION_RULE_SYM WHITESPACE selector_list at_rule_header_end '{' at_rule_body_start maybe_space block_valid_rule_list save_block { 953 OwnPtr<Vector<RefPtr<StyleRuleBase>>> ruleList = adoptPtr($9); 1097 954 if ($4) 1098 $$ = parser->createRegionRule($4, $9);955 $$ = parser->createRegionRule($4, ruleList.get()).leakRef(); 1099 956 else { 1100 957 $$ = 0; … … 1105 962 1106 963 #if ENABLE_CSS_SHADERS 964 1107 965 before_filter_rule: 1108 966 /* empty */ { … … 1113 971 1114 972 filter: 1115 before_filter_rule WEBKIT_FILTER_RULE_SYM WHITESPACE IDENT at_rule_header_end_maybe_space 1116 '{' at_rule_body_start maybe_space_before_declaration declaration_list closing_brace { 973 before_filter_rule WEBKIT_FILTER_RULE_SYM WHITESPACE IDENT at_rule_header_end_maybe_space '{' at_rule_body_start maybe_space_before_declaration declaration_list closing_brace { 1117 974 parser->m_inFilterRule = false; 1118 $$ = parser->createFilterRule($4); 1119 } 1120 ; 975 $$ = parser->createFilterRule($4).leakRef(); 976 } 977 ; 978 1121 979 #endif 1122 980 … … 1127 985 ; 1128 986 1129 maybe_unary_operator: 1130 unary_operator { $$ = $1; } 1131 | { $$ = 1; } 1132 ; 1133 1134 unary_operator: 1135 '-' { $$ = -1; } 1136 | '+' { $$ = 1; } 1137 ; 1138 1139 maybe_space_before_declaration: 1140 maybe_space { 1141 parser->markPropertyStart(); 1142 } 1143 ; 987 maybe_unary_operator: unary_operator | { $$ = 1; } ; 988 989 unary_operator: '-' { $$ = -1; } | '+' { $$ = 1; } ; 990 991 maybe_space_before_declaration: maybe_space { parser->markPropertyStart(); } ; 1144 992 1145 993 before_selector_list: 1146 /* empty */{994 { 1147 995 parser->markRuleHeaderStart(CSSRuleSourceData::STYLE_RULE); 1148 996 parser->markSelectorStart(); … … 1150 998 ; 1151 999 1152 at_rule_header_end: 1153 /* empty */ { 1154 parser->markRuleHeaderEnd(); 1155 } 1156 ; 1157 1158 at_selector_end: 1159 /* empty */ { 1160 parser->markSelectorEnd(); 1161 } 1162 ; 1000 at_rule_header_end: { parser->markRuleHeaderEnd(); } ; 1001 1002 at_selector_end: { parser->markSelectorEnd(); } ; 1163 1003 1164 1004 ruleset: 1165 1005 before_selector_list selector_list at_selector_end at_rule_header_end '{' at_rule_body_start maybe_space_before_declaration declaration_list closing_brace { 1166 $$ = parser->createStyleRule($2); 1167 } 1168 ; 1169 1170 before_selector_group_item: 1171 /* empty */ { 1172 parser->markSelectorStart(); 1173 } 1006 $$ = parser->createStyleRule($2).leakRef(); 1007 parser->recycleSelectorVector(adoptPtr($2)); 1008 } 1009 ; 1010 1011 before_selector_group_item: { parser->markSelectorStart(); } ; 1174 1012 1175 1013 selector_list: 1176 1014 selector %prec UNIMPORTANT_TOK { 1015 $$ = 0; 1177 1016 if ($1) { 1178 $$ = parser->reusableSelectorVector(); 1179 $$->shrink(0); 1180 $$->append(parser->sinkFloatingSelector($1)); 1017 $$ = parser->createSelectorVector().leakPtr(); 1018 $$->append(adoptPtr($1)); 1181 1019 parser->updateLastSelectorLineAndPosition(); 1182 1020 } 1183 1021 } 1184 1022 | selector_list at_selector_end ',' maybe_space before_selector_group_item selector %prec UNIMPORTANT_TOK { 1185 if ($1 && $6) { 1186 $$ = $1; 1187 $$->append(parser->sinkFloatingSelector($6)); 1023 OwnPtr<Vector<OwnPtr<CSSParserSelector>>> selectorList = adoptPtr($1); 1024 OwnPtr<CSSParserSelector> selector = adoptPtr($6); 1025 $$ = 0; 1026 if (selectorList && selector) { 1027 $$ = selectorList.leakPtr(); 1028 $$->append(selector.release()); 1188 1029 parser->updateLastSelectorLineAndPosition(); 1189 } else1190 $$ = 0;1191 }1192 | selector_list error {1193 $$ = 0;1030 } 1031 } 1032 | selector_list error { 1033 $$ = 0; 1034 delete $1; 1194 1035 } 1195 1036 ; 1196 1037 1197 selector_with_trailing_whitespace:1198 selector WHITESPACE {1199 $$ = $1;1200 }1201 ;1202 1203 1038 selector: 1204 simple_selector { 1205 $$ = $1; 1206 } 1207 | selector_with_trailing_whitespace 1208 { 1209 $$ = $1; 1210 } 1211 | selector_with_trailing_whitespace simple_selector 1212 { 1213 $$ = $2; 1214 if (!$1) 1215 $$ = 0; 1216 else if ($$) 1217 $$->appendTagHistory(CSSSelector::Descendant, parser->sinkFloatingSelector($1)); 1039 simple_selector 1040 | selector WHITESPACE 1041 | selector WHITESPACE simple_selector { 1042 OwnPtr<CSSParserSelector> left = adoptPtr($1); 1043 OwnPtr<CSSParserSelector> right = adoptPtr($3); 1044 $$ = 0; 1045 if (left && right) { 1046 right->appendTagHistory(CSSSelector::Descendant, left.release()); 1047 $$ = right.leakPtr(); 1048 } 1218 1049 } 1219 1050 | selector combinator simple_selector { 1220 $$ = $3; 1221 if (!$1) 1222 $$ = 0; 1223 else if ($$) 1224 $$->appendTagHistory($2, parser->sinkFloatingSelector($1)); 1051 OwnPtr<CSSParserSelector> left = adoptPtr($1); 1052 OwnPtr<CSSParserSelector> right = adoptPtr($3); 1053 $$ = 0; 1054 if (left && right) { 1055 right->appendTagHistory($2, left.release()); 1056 $$ = right.leakPtr(); 1057 } 1225 1058 } 1226 1059 | selector error { 1227 1060 $$ = 0; 1061 delete $1; 1228 1062 } 1229 1063 ; 1230 1064 1231 1065 namespace_selector: 1232 /* empty */'|' { $$.clear(); }1066 '|' { $$.clear(); } 1233 1067 | '*' '|' { static LChar star = '*'; $$.init(&star, 1); } 1234 | IDENT '|' { $$ = $1; }1068 | IDENT '|' 1235 1069 ; 1236 1070 1237 1071 simple_selector: 1238 1072 element_name { 1239 $$ = parser->createFloatingSelectorWithTagName(QualifiedName(nullAtom, $1, parser->m_defaultNamespace));1073 $$ = new CSSParserSelector(QualifiedName(nullAtom, $1, parser->m_defaultNamespace)); 1240 1074 } 1241 1075 | element_name specifier_list { 1242 1076 $$ = $2; 1243 1077 if ($$) 1244 $$ = parser->rewriteSpecifiersWithElementName(nullAtom, $1,$$);1078 parser->rewriteSpecifiersWithElementName(nullAtom, $1, *$$); 1245 1079 } 1246 1080 | specifier_list { 1247 1081 $$ = $1; 1248 1082 if ($$) 1249 $$ = parser->rewriteSpecifiersWithNamespaceIfNeeded($$);1083 parser->rewriteSpecifiersWithNamespaceIfNeeded(*$$); 1250 1084 } 1251 1085 | namespace_selector element_name { 1252 $$ = parser->createFloatingSelectorWithTagName(parser->determineNameInNamespace($1, $2));1086 $$ = new CSSParserSelector(parser->determineNameInNamespace($1, $2)); 1253 1087 } 1254 1088 | namespace_selector element_name specifier_list { 1255 1089 $$ = $3; 1256 1090 if ($$) 1257 $$ = parser->rewriteSpecifiersWithElementName($1, $2,$$);1091 parser->rewriteSpecifiersWithElementName($1, $2, *$$); 1258 1092 } 1259 1093 | namespace_selector specifier_list { 1260 1094 $$ = $2; 1261 1095 if ($$) 1262 $$ = parser->rewriteSpecifiersWithElementName($1, starAtom,$$);1096 parser->rewriteSpecifiersWithElementName($1, starAtom, *$$); 1263 1097 } 1264 1098 ; … … 1266 1100 simple_selector_list: 1267 1101 simple_selector %prec UNIMPORTANT_TOK { 1102 $$ = 0; 1268 1103 if ($1) { 1269 $$ = parser->createFloatingSelectorVector(); 1270 $$->append(parser->sinkFloatingSelector($1)); 1271 } else 1272 $$ = 0; 1104 $$ = parser->createSelectorVector().leakPtr(); 1105 $$->append(adoptPtr($1)); 1106 } 1273 1107 } 1274 1108 | simple_selector_list maybe_space ',' maybe_space simple_selector %prec UNIMPORTANT_TOK { 1275 if ($1 && $5) { 1276 $$ = $1; 1277 $$->append(parser->sinkFloatingSelector($5)); 1278 } else 1279 $$ = 0; 1109 OwnPtr<Vector<OwnPtr<CSSParserSelector>>> list = adoptPtr($1); 1110 OwnPtr<CSSParserSelector> selector = adoptPtr($5); 1111 $$ = 0; 1112 if (list && selector) { 1113 $$ = list.leakPtr(); 1114 $$->append(selector.release()); 1115 } 1280 1116 } 1281 1117 | simple_selector_list error { 1282 1118 $$ = 0; 1283 } 1284 ; 1119 delete $1; 1120 } 1121 ; 1285 1122 1286 1123 element_name: 1287 1124 IDENT { 1288 CSSParserString& str = $1;1289 1125 if (parser->m_context.isHTMLDocument) 1290 str.lower();1291 $$ = str;1126 $1.lower(); 1127 $$ = $1; 1292 1128 } 1293 1129 | '*' { … … 1295 1131 $$.init(&star, 1); 1296 1132 } 1297 ;1133 ; 1298 1134 1299 1135 specifier_list: 1300 specifier { 1301 $$ = $1; 1302 } 1136 specifier 1303 1137 | specifier_list specifier { 1304 if (!$2) 1305 $$ = 0; 1306 else if ($1) 1307 $$ = parser->rewriteSpecifiers($1, $2); 1138 OwnPtr<CSSParserSelector> list = adoptPtr($1); 1139 OwnPtr<CSSParserSelector> specifier = adoptPtr($2); 1140 $$ = 0; 1141 if (list && specifier) 1142 $$ = parser->rewriteSpecifiers(list.release(), specifier.release()).leakPtr(); 1308 1143 } 1309 1144 | specifier_list error { 1310 1145 $$ = 0; 1146 delete $1; 1311 1147 } 1312 1148 ; … … 1314 1150 specifier: 1315 1151 IDSEL { 1316 $$ = parser->createFloatingSelector();1152 $$ = new CSSParserSelector; 1317 1153 $$->setMatch(CSSSelector::Id); 1318 1154 if (parser->m_context.mode == CSSQuirksMode) … … 1321 1157 } 1322 1158 | HEX { 1323 if ($1[0] >= '0' && $1[0] <= '9') {1159 if ($1[0] >= '0' && $1[0] <= '9') 1324 1160 $$ = 0; 1325 }else {1326 $$ = parser->createFloatingSelector();1161 else { 1162 $$ = new CSSParserSelector; 1327 1163 $$->setMatch(CSSSelector::Id); 1328 1164 if (parser->m_context.mode == CSSQuirksMode) … … 1338 1174 class: 1339 1175 '.' IDENT { 1340 $$ = parser->createFloatingSelector();1176 $$ = new CSSParserSelector; 1341 1177 $$->setMatch(CSSSelector::Class); 1342 1178 if (parser->m_context.mode == CSSQuirksMode) … … 1346 1182 ; 1347 1183 1348 attr_name:1349 IDENT maybe_space {1350 $$ = $1;1351 }1352 ;1353 1354 1184 attrib: 1355 '[' maybe_space attr_name ']' {1356 $$ = parser->createFloatingSelector();1185 '[' maybe_space IDENT maybe_space ']' { 1186 $$ = new CSSParserSelector; 1357 1187 $$->setAttribute(QualifiedName(nullAtom, $3, nullAtom), parser->m_context.isHTMLDocument); 1358 1188 $$->setMatch(CSSSelector::Set); 1359 1189 } 1360 | '[' maybe_space attr_name match maybe_space ident_or_string maybe_space ']' {1361 $$ = parser->createFloatingSelector();1190 | '[' maybe_space IDENT maybe_space match maybe_space ident_or_string maybe_space ']' { 1191 $$ = new CSSParserSelector; 1362 1192 $$->setAttribute(QualifiedName(nullAtom, $3, nullAtom), parser->m_context.isHTMLDocument); 1363 $$->setMatch( (CSSSelector::Match)$4);1364 $$->setValue($ 6);1365 } 1366 | '[' maybe_space namespace_selector attr_name ']' {1367 $$ = parser->createFloatingSelector();1193 $$->setMatch($5); 1194 $$->setValue($7); 1195 } 1196 | '[' maybe_space namespace_selector IDENT maybe_space ']' { 1197 $$ = new CSSParserSelector; 1368 1198 $$->setAttribute(parser->determineNameInNamespace($3, $4), parser->m_context.isHTMLDocument); 1369 1199 $$->setMatch(CSSSelector::Set); 1370 1200 } 1371 | '[' maybe_space namespace_selector attr_name match maybe_space ident_or_string maybe_space ']' {1372 $$ = parser->createFloatingSelector();1201 | '[' maybe_space namespace_selector IDENT maybe_space match maybe_space ident_or_string maybe_space ']' { 1202 $$ = new CSSParserSelector; 1373 1203 $$->setAttribute(parser->determineNameInNamespace($3, $4), parser->m_context.isHTMLDocument); 1374 $$->setMatch( (CSSSelector::Match)$5);1375 $$->setValue($ 7);1204 $$->setMatch($6); 1205 $$->setValue($8); 1376 1206 } 1377 1207 ; … … 1398 1228 ; 1399 1229 1400 ident_or_string: 1401 IDENT 1402 | STRING 1403 ; 1230 ident_or_string: IDENT | STRING ; 1404 1231 1405 1232 pseudo_page: 1406 1233 ':' IDENT { 1407 $$ = parser->createFloatingSelector();1234 $$ = new CSSParserSelector; 1408 1235 $$->setMatch(CSSSelector::PagePseudoClass); 1409 1236 $2.lower(); … … 1416 1243 pseudo: 1417 1244 ':' IDENT { 1418 $$ = parser->createFloatingSelector();1245 $$ = new CSSParserSelector; 1419 1246 $$->setMatch(CSSSelector::PseudoClass); 1420 1247 $2.lower(); … … 1425 1252 } 1426 1253 | ':' ':' IDENT { 1427 $$ = parser->createFloatingSelector();1254 $$ = new CSSParserSelector; 1428 1255 $$->setMatch(CSSSelector::PseudoElement); 1429 1256 $3.lower(); … … 1437 1264 // used by ::cue(:past/:future) 1438 1265 | ':' ':' CUEFUNCTION maybe_space simple_selector_list maybe_space ')' { 1266 $$ = 0; 1439 1267 if ($5) { 1440 $$ = parser->createFloatingSelector();1268 $$ = new CSSParserSelector; 1441 1269 $$->setMatch(CSSSelector::PseudoClass); 1442 $$->adoptSelectorVector(* parser->sinkFloatingSelectorVector($5));1270 $$->adoptSelectorVector(*adoptPtr($5)); 1443 1271 $$->setValue($3); 1444 1272 CSSSelector::PseudoType type = $$->pseudoType(); 1445 1273 if (type != CSSSelector::PseudoCue) 1446 1274 $$ = 0; 1447 } else 1448 $$ = 0; 1275 } 1449 1276 } 1450 1277 #endif … … 1455 1282 // related discussion with respect to :not. 1456 1283 | ':' ANYFUNCTION maybe_space simple_selector_list maybe_space ')' { 1284 $$ = 0; 1457 1285 if ($4) { 1458 $$ = parser->createFloatingSelector();1286 $$ = new CSSParserSelector; 1459 1287 $$->setMatch(CSSSelector::PseudoClass); 1460 $$->adoptSelectorVector(* parser->sinkFloatingSelectorVector($4));1288 $$->adoptSelectorVector(*adoptPtr($4)); 1461 1289 $2.lower(); 1462 1290 $$->setValue($2); … … 1464 1292 if (type != CSSSelector::PseudoAny) 1465 1293 $$ = 0; 1466 } else 1467 $$ = 0; 1294 } 1468 1295 } 1469 1296 // used by :nth-*(ax+b) 1470 1297 | ':' FUNCTION maybe_space NTH maybe_space ')' { 1471 $$ = parser->createFloatingSelector();1298 $$ = new CSSParserSelector; 1472 1299 $$->setMatch(CSSSelector::PseudoClass); 1473 1300 $$->setArgument($4); … … 1479 1306 // used by :nth-* 1480 1307 | ':' FUNCTION maybe_space maybe_unary_operator INTEGER maybe_space ')' { 1481 $$ = parser->createFloatingSelector();1308 $$ = new CSSParserSelector; 1482 1309 $$->setMatch(CSSSelector::PseudoClass); 1483 1310 $$->setArgument(String::number($4 * $5)); … … 1489 1316 // used by :nth-*(odd/even) and :lang 1490 1317 | ':' FUNCTION maybe_space IDENT maybe_space ')' { 1491 $$ = parser->createFloatingSelector();1318 $$ = new CSSParserSelector; 1492 1319 $$->setMatch(CSSSelector::PseudoClass); 1493 1320 $$->setArgument($4); … … 1507 1334 // used by :not 1508 1335 | ':' NOTFUNCTION maybe_space simple_selector maybe_space ')' { 1509 if (!$4 || !$4->isSimple())1510 $$ =0;1511 else{1512 $$ = parser->createFloatingSelector();1336 OwnPtr<CSSParserSelector> selector = adoptPtr($4); 1337 $$ =0; 1338 if (selector && selector->isSimple()) { 1339 $$ = new CSSParserSelector; 1513 1340 $$->setMatch(CSSSelector::PseudoClass); 1514 1341 1515 Vector<OwnPtr<CSSParserSelector> 1516 selectorVector.append( parser->sinkFloatingSelector($4));1342 Vector<OwnPtr<CSSParserSelector>> selectorVector; 1343 selectorVector.append(selector.release()); 1517 1344 $$->adoptSelectorVector(selectorVector); 1518 1345 … … 1525 1352 declaration_list: 1526 1353 /* empty */ { $$ = false; } 1527 | declaration { 1528 $$ = $1; 1529 } 1530 | decl_list declaration { 1531 $$ = $1; 1532 if ( $2 ) 1533 $$ = $2; 1534 } 1535 | decl_list { 1536 $$ = $1; 1537 } 1538 | decl_list_recovery { 1539 $$ = false; 1540 } 1541 | decl_list decl_list_recovery { 1542 $$ = $1; 1543 } 1354 | declaration 1355 | decl_list declaration { $$ = $1 || $2; } 1356 | decl_list 1357 | decl_list_recovery { $$ = false; } 1358 | decl_list decl_list_recovery 1544 1359 ; 1545 1360 … … 1572 1387 1573 1388 declaration: 1574 VAR_DEFINITION maybe_space ':' maybe_space expr prio {1389 VAR_DEFINITION maybe_space ':' maybe_space expr priority { 1575 1390 #if ENABLE_CSS_VARIABLES 1576 parser->storeVariableDeclaration($1, parser->sinkFloatingValueList($5), $6);1391 parser->storeVariableDeclaration($1, adoptPtr($5), $6); 1577 1392 $$ = true; 1578 1393 parser->markPropertyEnd($6, true); 1579 1394 #else 1395 delete $5; 1580 1396 $$ = false; 1581 1397 #endif 1582 1398 } 1583 | 1584 property ':' maybe_space expr prio { 1399 | property ':' maybe_space expr priority { 1585 1400 $$ = false; 1586 1401 bool isPropertyParsed = false; 1587 if ($1 && $4) { 1588 parser->m_valueList = parser->sinkFloatingValueList($4); 1402 OwnPtr<CSSParserValueList> propertyValue = adoptPtr($4); 1403 if ($1 && propertyValue) { 1404 parser->m_valueList = propertyValue.release(); 1589 1405 int oldParsedProperties = parser->m_parsedProperties.size(); 1590 $$ = parser->parseValue( static_cast<CSSPropertyID>($1), $5);1406 $$ = parser->parseValue($1, $5); 1591 1407 if (!$$) 1592 1408 parser->rollbackLastProperties(parser->m_parsedProperties.size() - oldParsedProperties); … … 1597 1413 parser->markPropertyEnd($5, isPropertyParsed); 1598 1414 } 1599 | 1600 property declaration_recovery { 1415 | property declaration_recovery { $$ = false; } 1416 | property ':' maybe_space expr priority declaration_recovery { 1417 // When we encounter something like p {color: red !important fail;} we should drop the declaration. 1418 parser->markPropertyEnd(false, false); 1419 delete $4; 1601 1420 $$ = false; 1602 1421 } 1603 | 1604 property ':' maybe_space expr prio declaration_recovery { 1605 /* When we encounter something like p {color: red !important fail;} we should drop the declaration */ 1422 | IMPORTANT_SYM maybe_space declaration_recovery { 1423 // Handle this case -- div { text-align: center; !important } -- by just reducing away the stray !important. 1424 $$ = false; 1425 } 1426 | property ':' maybe_space declaration_recovery { 1427 // If we come across rules with invalid values like this case: p { weight: *; }, just discard the rule. 1606 1428 parser->markPropertyEnd(false, false); 1607 1429 $$ = false; 1608 1430 } 1609 | 1610 IMPORTANT_SYM maybe_space declaration_recovery { 1611 /* Handle this case: div { text-align: center; !important } Just reduce away the stray !important. */ 1612 $$ = false; 1613 } 1614 | 1615 property ':' maybe_space declaration_recovery { 1616 /* if we come across rules with invalid values like this case: p { weight: *; }, just discard the rule */ 1617 parser->markPropertyEnd(false, false); 1618 $$ = false; 1619 } 1620 ; 1621 1622 declaration_recovery: 1623 error error_location error_recovery { 1624 parser->syntaxError($2); 1625 } 1626 ; 1627 1628 property: 1629 IDENT maybe_space { 1630 $$ = cssPropertyID($1); 1631 } 1632 ; 1633 1634 prio: 1635 IMPORTANT_SYM maybe_space { $$ = true; } 1636 | /* empty */ { $$ = false; } 1637 ; 1638 1639 expr: 1640 valid_expr 1641 | valid_expr expr_recovery { $$ = 0; } 1642 ; 1431 ; 1432 1433 declaration_recovery: error error_location error_recovery { parser->syntaxError($2); } ; 1434 1435 property: IDENT maybe_space { $$ = cssPropertyID($1); } ; 1436 1437 priority: IMPORTANT_SYM maybe_space { $$ = true; } | /* empty */ { $$ = false; } ; 1438 1439 expr: valid_expr | valid_expr expr_recovery { $$ = 0; delete $1; } ; 1643 1440 1644 1441 valid_expr: 1645 1442 term { 1646 $$ = parser->createFloatingValueList();1647 $$->addValue( parser->sinkFloatingValue($1));1443 $$ = new CSSParserValueList; 1444 $$->addValue($1); 1648 1445 } 1649 1446 | valid_expr operator term { 1650 1447 $$ = $1; 1651 if ($$) { 1448 if (!$$) 1449 destroy($3); 1450 else { 1652 1451 if ($2) { 1653 1452 CSSParserValue v; … … 1657 1456 $$->addValue(v); 1658 1457 } 1659 $$->addValue(parser->sinkFloatingValue($3)); 1660 } 1661 } 1662 ; 1663 1664 expr_recovery: 1665 error error_location error_recovery 1666 ; 1667 1668 operator: 1669 '/' maybe_space { 1670 $$ = '/'; 1671 } 1672 | ',' maybe_space { 1673 $$ = ','; 1674 } 1675 | /* empty */ { 1676 $$ = 0; 1677 } 1678 ; 1458 $$->addValue($3); 1459 } 1460 } 1461 ; 1462 1463 expr_recovery: error error_location error_recovery ; 1464 1465 operator: '/' maybe_space { $$ = '/'; } | ',' maybe_space { $$ = ','; } | /* empty */ { $$ = 0; } ; 1679 1466 1680 1467 term: 1681 unary_term maybe_space { $$ = $1; }1468 unary_term maybe_space 1682 1469 | unary_operator unary_term maybe_space { $$ = $2; $$.fValue *= $1; } 1683 1470 | STRING maybe_space { $$.id = CSSValueInvalid; $$.string = $1; $$.unit = CSSPrimitiveValue::CSS_STRING; } … … 1699 1486 $$.string = $3; 1700 1487 $$.unit = CSSPrimitiveValue::CSS_VARIABLE_NAME; 1488 #else 1489 $$.id = CSSValueInvalid; 1490 $$.unit = 0; 1701 1491 #endif 1702 1492 } 1703 1493 /* FIXME: according to the specs a function can have a unary_operator in front. I know no case where this makes sense */ 1704 | function maybe_space { 1705 $$ = $1; 1706 } 1707 | calc_function maybe_space { 1708 $$ = $1; 1709 } 1710 | min_or_max_function maybe_space { 1711 $$ = $1; 1712 } 1494 | function maybe_space 1495 | calc_function maybe_space 1496 | min_or_max_function maybe_space 1713 1497 | '%' maybe_space { /* Handle width: %; */ 1714 1498 $$.id = CSSValueInvalid; $$.unit = 0; … … 1756 1540 function: 1757 1541 FUNCTION maybe_space expr closing_parenthesis { 1758 CSSParserFunction* f = parser->createFloatingFunction();1542 CSSParserFunction* f = new CSSParserFunction; 1759 1543 f->name = $1; 1760 f->args = parser->sinkFloatingValueList($3);1544 f->args = adoptPtr($3); 1761 1545 $$.id = CSSValueInvalid; 1762 1546 $$.unit = CSSParserValue::Function; … … 1764 1548 } | 1765 1549 FUNCTION maybe_space closing_parenthesis { 1766 CSSParserFunction* f = parser->createFloatingFunction();1550 CSSParserFunction* f = new CSSParserFunction; 1767 1551 f->name = $1; 1768 CSSParserValueList* valueList = parser->createFloatingValueList(); 1769 f->args = parser->sinkFloatingValueList(valueList); 1552 f->args = adoptPtr(new CSSParserValueList); 1770 1553 $$.id = CSSValueInvalid; 1771 1554 $$.unit = CSSParserValue::Function; … … 1773 1556 } | 1774 1557 FUNCTION maybe_space expr_recovery closing_parenthesis { 1775 CSSParserFunction* f = parser->createFloatingFunction();1558 CSSParserFunction* f = new CSSParserFunction; 1776 1559 f->name = $1; 1777 1560 f->args = nullptr; … … 1783 1566 1784 1567 calc_func_term: 1785 unary_term { $$ = $1; }1568 unary_term 1786 1569 | VARFUNCTION maybe_space IDENT closing_parenthesis { 1787 1570 #if ENABLE_CSS_VARIABLES … … 1789 1572 $$.string = $3; 1790 1573 $$.unit = CSSPrimitiveValue::CSS_VARIABLE_NAME; 1574 #else 1575 $$.id = CSSValueInvalid; 1576 $$.unit = 0; 1791 1577 #endif 1792 1578 } … … 1809 1595 ; 1810 1596 1811 calc_maybe_space: 1812 /* empty */ 1813 | WHITESPACE 1814 ; 1597 calc_maybe_space: /* empty */ | WHITESPACE ; 1815 1598 1816 1599 calc_func_paren_expr: 1817 1600 '(' maybe_space calc_func_expr calc_maybe_space closing_parenthesis { 1601 $$ = 0; 1818 1602 if ($3) { 1819 1603 $$ = $3; … … 1825 1609 v.iValue = ')'; 1826 1610 $$->addValue(v); 1827 } else 1828 $$ = 0; 1829 } 1830 ; 1831 1832 calc_func_expr: 1833 valid_calc_func_expr 1834 | valid_calc_func_expr expr_recovery { $$ = 0; } 1835 ; 1611 } 1612 } 1613 ; 1614 1615 calc_func_expr: valid_calc_func_expr | valid_calc_func_expr expr_recovery { $$ = 0; delete $1; } ; 1836 1616 1837 1617 valid_calc_func_expr: 1838 1618 calc_func_term { 1839 $$ = parser->createFloatingValueList();1840 $$->addValue( parser->sinkFloatingValue($1));1619 $$ = new CSSParserValueList; 1620 $$->addValue($1); 1841 1621 } 1842 1622 | calc_func_expr calc_func_operator calc_func_term { 1843 if ($1 && $2) { 1844 $$ = $1; 1623 OwnPtr<CSSParserValueList> expression = adoptPtr($1); 1624 $$ = 0; 1625 if (expression && $2) { 1626 $$ = expression.leakPtr(); 1845 1627 CSSParserValue v; 1846 1628 v.id = CSSValueInvalid; … … 1848 1630 v.iValue = $2; 1849 1631 $$->addValue(v); 1850 $$->addValue(parser->sinkFloatingValue($3)); 1851 } else 1852 $$ = 0; 1632 $$->addValue($3); 1633 } else { 1634 destroy($3); 1635 } 1853 1636 1854 1637 } 1855 1638 | calc_func_expr calc_func_operator calc_func_paren_expr { 1856 if ($1 && $2 && $3) { 1857 $$ = $1; 1639 OwnPtr<CSSParserValueList> left = adoptPtr($1); 1640 OwnPtr<CSSParserValueList> right = adoptPtr($3); 1641 $$ = 0; 1642 if (left && $2 && right) { 1858 1643 CSSParserValue v; 1859 1644 v.id = CSSValueInvalid; 1860 1645 v.unit = CSSParserValue::Operator; 1861 1646 v.iValue = $2; 1862 $$->addValue(v);1863 $$->extend(*($3));1864 } else1865 $$ = 0;1647 left->addValue(v); 1648 left->extend(*right); 1649 $$ = left.leakPtr(); 1650 } 1866 1651 } 1867 1652 | calc_func_paren_expr … … 1869 1654 1870 1655 calc_func_expr_list: 1871 calc_func_expr calc_maybe_space { 1872 $$ = $1; 1873 } 1656 calc_func_expr calc_maybe_space 1874 1657 | calc_func_expr_list ',' maybe_space calc_func_expr calc_maybe_space { 1875 if ($1 && $4) { 1876 $$ = $1; 1658 OwnPtr<CSSParserValueList> list = adoptPtr($1); 1659 OwnPtr<CSSParserValueList> expression = adoptPtr($4); 1660 $$ = 0; 1661 if (list && expression) { 1662 $$ = list.leakPtr(); 1877 1663 CSSParserValue v; 1878 1664 v.id = CSSValueInvalid; … … 1880 1666 v.iValue = ','; 1881 1667 $$->addValue(v); 1882 $$->extend(*($4)); 1883 } else 1884 $$ = 0; 1668 $$->extend(*expression); 1669 } 1885 1670 } 1886 1671 ; … … 1888 1673 calc_function: 1889 1674 CALCFUNCTION maybe_space calc_func_expr calc_maybe_space closing_parenthesis { 1890 CSSParserFunction* f = parser->createFloatingFunction();1675 CSSParserFunction* f = new CSSParserFunction; 1891 1676 f->name = $1; 1892 f->args = parser->sinkFloatingValueList($3);1677 f->args = adoptPtr($3); 1893 1678 $$.id = CSSValueInvalid; 1894 1679 $$.unit = CSSParserValue::Function; … … 1896 1681 } 1897 1682 | CALCFUNCTION maybe_space expr_recovery closing_parenthesis { 1683 $$.id = CSSValueInvalid; 1684 $$.unit = 0; 1898 1685 YYERROR; 1899 1686 } … … 1901 1688 1902 1689 1903 min_or_max: 1904 MINFUNCTION { 1905 $$ = $1; 1906 } 1907 | MAXFUNCTION { 1908 $$ = $1; 1909 } 1910 ; 1690 min_or_max: MINFUNCTION | MAXFUNCTION ; 1911 1691 1912 1692 min_or_max_function: 1913 1693 min_or_max maybe_space calc_func_expr_list closing_parenthesis { 1914 CSSParserFunction* f = parser->createFloatingFunction();1694 CSSParserFunction* f = new CSSParserFunction; 1915 1695 f->name = $1; 1916 f->args = parser->sinkFloatingValueList($3);1696 f->args = adoptPtr($3); 1917 1697 $$.id = CSSValueInvalid; 1918 1698 $$.unit = CSSParserValue::Function; … … 1920 1700 } 1921 1701 | min_or_max maybe_space expr_recovery closing_parenthesis { 1702 $$.id = CSSValueInvalid; 1703 $$.unit = 0; 1922 1704 YYERROR; 1923 1705 } … … 1926 1708 /* error handling rules */ 1927 1709 1928 save_block: 1929 closing_brace { 1930 $$ = 0; 1931 } 1932 | error closing_brace { 1933 $$ = 0; 1934 } 1935 ; 1936 1937 invalid_at: 1938 ATKEYWORD error invalid_block { 1939 $$ = 0; 1940 } 1941 | ATKEYWORD error ';' { 1942 $$ = 0; 1943 } 1944 ; 1945 1946 invalid_rule: 1947 error invalid_block { 1948 $$ = 0; 1949 } 1950 1951 /* 1952 Seems like the two rules below are trying too much and violating 1953 http://www.hixie.ch/tests/evil/mixed/csserrorhandling.html 1954 1955 | error ';' { 1956 $$ = 0; 1957 } 1958 | error '}' { 1959 $$ = 0; 1960 } 1961 */ 1962 ; 1963 1964 invalid_block: 1965 '{' error_recovery closing_brace { 1966 parser->invalidBlockHit(); 1967 } 1968 ; 1969 1970 invalid_square_brackets_block: 1971 '[' error_recovery ']' 1972 | '[' error_recovery TOKEN_EOF 1973 ; 1974 1975 invalid_parentheses_block: 1976 opening_parenthesis error_recovery closing_parenthesis; 1710 save_block: closing_brace | error closing_brace ; 1711 1712 invalid_at: ATKEYWORD error invalid_block | ATKEYWORD error ';' ; 1713 1714 invalid_rule: error invalid_block ; 1715 1716 invalid_block: '{' error_recovery closing_brace { parser->invalidBlockHit(); } ; 1717 1718 invalid_square_brackets_block: '[' error_recovery ']' | '[' error_recovery TOKEN_EOF ; 1719 1720 invalid_parentheses_block: opening_parenthesis error_recovery closing_parenthesis; 1977 1721 1978 1722 opening_parenthesis: … … 1983 1727 ; 1984 1728 1985 error_location: { 1986 $$ = parser->currentLocation(); 1987 } 1988 ; 1729 error_location: { $$ = parser->currentLocation(); } ; 1989 1730 1990 1731 error_recovery: … … 1997 1738 1998 1739 %% 1999 -
trunk/Source/WebCore/css/CSSParser.cpp
r155496 r155536 358 358 { 359 359 clearProperties(); 360 361 deleteAllValues(m_floatingSelectors);362 deleteAllValues(m_floatingSelectorVectors);363 deleteAllValues(m_floatingValueLists);364 deleteAllValues(m_floatingFunctions);365 360 } 366 361 … … 523 518 #if ENABLE(CSS3_TEXT) 524 519 case CSSPropertyWebkitTextDecorationColor: 525 #endif // CSS3_TEXT520 #endif 526 521 case CSSPropertyWebkitTextEmphasisColor: 527 522 case CSSPropertyWebkitTextFillColor: … … 9238 9233 } 9239 9234 9240 StyleRuleBase*CSSParser::createFilterRule(const CSSParserString& filterName)9235 PassRefPtr<StyleRuleBase> CSSParser::createFilterRule(const CSSParserString& filterName) 9241 9236 { 9242 9237 RefPtr<StyleRuleFilter> rule = StyleRuleFilter::create(filterName, createStylePropertySet()); 9243 9238 clearProperties(); 9244 StyleRuleFilter* result = rule.get();9245 m_parsedRules.append(rule.release());9246 9239 processAndAddNewRuleToSourceTreeIfNeeded(); 9247 return r esult;9240 return rule.release(); 9248 9241 } 9249 9242 … … 11465 11458 } 11466 11459 11467 CSSParserSelector* CSSParser::createFloatingSelectorWithTagName(const QualifiedName& tagQName) 11468 { 11469 CSSParserSelector* selector = new CSSParserSelector(tagQName); 11470 m_floatingSelectors.add(selector); 11471 return selector; 11472 } 11473 11474 CSSParserSelector* CSSParser::createFloatingSelector() 11475 { 11476 CSSParserSelector* selector = new CSSParserSelector; 11477 m_floatingSelectors.add(selector); 11478 return selector; 11479 } 11480 11481 PassOwnPtr<CSSParserSelector> CSSParser::sinkFloatingSelector(CSSParserSelector* selector) 11482 { 11483 if (selector) { 11484 ASSERT(m_floatingSelectors.contains(selector)); 11485 m_floatingSelectors.remove(selector); 11486 } 11487 return adoptPtr(selector); 11488 } 11489 11490 Vector<OwnPtr<CSSParserSelector> >* CSSParser::createFloatingSelectorVector() 11491 { 11492 Vector<OwnPtr<CSSParserSelector> >* selectorVector = new Vector<OwnPtr<CSSParserSelector> >; 11493 m_floatingSelectorVectors.add(selectorVector); 11494 return selectorVector; 11495 } 11496 11497 PassOwnPtr<Vector<OwnPtr<CSSParserSelector> > > CSSParser::sinkFloatingSelectorVector(Vector<OwnPtr<CSSParserSelector> >* selectorVector) 11498 { 11499 if (selectorVector) { 11500 ASSERT(m_floatingSelectorVectors.contains(selectorVector)); 11501 m_floatingSelectorVectors.remove(selectorVector); 11502 } 11503 return adoptPtr(selectorVector); 11504 } 11505 11506 CSSParserValueList* CSSParser::createFloatingValueList() 11507 { 11508 CSSParserValueList* list = new CSSParserValueList; 11509 m_floatingValueLists.add(list); 11510 return list; 11511 } 11512 11513 PassOwnPtr<CSSParserValueList> CSSParser::sinkFloatingValueList(CSSParserValueList* list) 11514 { 11515 if (list) { 11516 ASSERT(m_floatingValueLists.contains(list)); 11517 m_floatingValueLists.remove(list); 11518 } 11519 return adoptPtr(list); 11520 } 11521 11522 CSSParserFunction* CSSParser::createFloatingFunction() 11523 { 11524 CSSParserFunction* function = new CSSParserFunction; 11525 m_floatingFunctions.add(function); 11526 return function; 11527 } 11528 11529 PassOwnPtr<CSSParserFunction> CSSParser::sinkFloatingFunction(CSSParserFunction* function) 11530 { 11531 if (function) { 11532 ASSERT(m_floatingFunctions.contains(function)); 11533 m_floatingFunctions.remove(function); 11534 } 11535 return adoptPtr(function); 11536 } 11537 11538 CSSParserValue& CSSParser::sinkFloatingValue(CSSParserValue& value) 11539 { 11540 if (value.unit == CSSParserValue::Function) { 11541 ASSERT(m_floatingFunctions.contains(value.function)); 11542 m_floatingFunctions.remove(value.function); 11543 } 11544 return value; 11545 } 11546 11547 MediaQueryExp* CSSParser::createFloatingMediaQueryExp(const AtomicString& mediaFeature, CSSParserValueList* values) 11548 { 11549 m_floatingMediaQueryExp = MediaQueryExp::create(mediaFeature, values); 11550 return m_floatingMediaQueryExp.get(); 11551 } 11552 11553 PassOwnPtr<MediaQueryExp> CSSParser::sinkFloatingMediaQueryExp(MediaQueryExp* expression) 11554 { 11555 ASSERT_UNUSED(expression, expression == m_floatingMediaQueryExp); 11556 return m_floatingMediaQueryExp.release(); 11557 } 11558 11559 Vector<OwnPtr<MediaQueryExp> >* CSSParser::createFloatingMediaQueryExpList() 11560 { 11561 m_floatingMediaQueryExpList = adoptPtr(new Vector<OwnPtr<MediaQueryExp> >); 11562 return m_floatingMediaQueryExpList.get(); 11563 } 11564 11565 PassOwnPtr<Vector<OwnPtr<MediaQueryExp> > > CSSParser::sinkFloatingMediaQueryExpList(Vector<OwnPtr<MediaQueryExp> >* list) 11566 { 11567 ASSERT_UNUSED(list, list == m_floatingMediaQueryExpList); 11568 return m_floatingMediaQueryExpList.release(); 11569 } 11570 11571 MediaQuery* CSSParser::createFloatingMediaQuery(MediaQuery::Restrictor restrictor, const String& mediaType, PassOwnPtr<Vector<OwnPtr<MediaQueryExp> > > expressions) 11572 { 11573 m_floatingMediaQuery = adoptPtr(new MediaQuery(restrictor, mediaType, expressions)); 11574 return m_floatingMediaQuery.get(); 11575 } 11576 11577 MediaQuery* CSSParser::createFloatingMediaQuery(PassOwnPtr<Vector<OwnPtr<MediaQueryExp> > > expressions) 11578 { 11579 return createFloatingMediaQuery(MediaQuery::None, "all", expressions); 11580 } 11581 11582 PassOwnPtr<MediaQuery> CSSParser::sinkFloatingMediaQuery(MediaQuery* query) 11583 { 11584 ASSERT_UNUSED(query, query == m_floatingMediaQuery); 11585 return m_floatingMediaQuery.release(); 11586 } 11587 11588 Vector<RefPtr<StyleKeyframe> >* CSSParser::createFloatingKeyframeVector() 11589 { 11590 m_floatingKeyframeVector = adoptPtr(new Vector<RefPtr<StyleKeyframe> >()); 11591 return m_floatingKeyframeVector.get(); 11592 } 11593 11594 PassOwnPtr<Vector<RefPtr<StyleKeyframe> > > CSSParser::sinkFloatingKeyframeVector(Vector<RefPtr<StyleKeyframe> >* keyframeVector) 11595 { 11596 ASSERT_UNUSED(keyframeVector, m_floatingKeyframeVector == keyframeVector); 11597 return m_floatingKeyframeVector.release(); 11598 } 11599 11600 MediaQuerySet* CSSParser::createMediaQuerySet() 11601 { 11602 RefPtr<MediaQuerySet> queries = MediaQuerySet::create(); 11603 MediaQuerySet* result = queries.get(); 11604 m_parsedMediaQuerySets.append(queries.release()); 11605 return result; 11606 } 11607 11608 StyleRuleBase* CSSParser::createImportRule(const CSSParserString& url, MediaQuerySet* media) 11460 PassRefPtr<StyleRuleBase> CSSParser::createImportRule(const CSSParserString& url, PassRefPtr<MediaQuerySet> media) 11609 11461 { 11610 11462 if (!media || !m_allowImportRules) { … … 11613 11465 } 11614 11466 RefPtr<StyleRuleImport> rule = StyleRuleImport::create(url, media); 11615 StyleRuleImport* result = rule.get();11616 m_parsedRules.append(rule.release());11617 11467 processAndAddNewRuleToSourceTreeIfNeeded(); 11618 return r esult;11619 } 11620 11621 StyleRuleBase* CSSParser::createMediaRule(MediaQuerySet*media, RuleList* rules)11468 return rule.release(); 11469 } 11470 11471 PassRefPtr<StyleRuleBase> CSSParser::createMediaRule(PassRefPtr<MediaQuerySet> media, RuleList* rules) 11622 11472 { 11623 11473 m_allowImportRules = m_allowNamespaceDeclarations = false; … … 11630 11480 } else 11631 11481 rule = StyleRuleMedia::create(media, rules ? *rules : emptyRules); 11632 StyleRuleMedia* result = rule.get();11633 m_parsedRules.append(rule.release());11634 11482 processAndAddNewRuleToSourceTreeIfNeeded(); 11635 return r esult;11636 } 11637 11638 StyleRuleBase*CSSParser::createEmptyMediaRule(RuleList* rules)11639 { 11640 return createMediaRule(MediaQuerySet::create() .get(), rules);11483 return rule.release(); 11484 } 11485 11486 PassRefPtr<StyleRuleBase> CSSParser::createEmptyMediaRule(RuleList* rules) 11487 { 11488 return createMediaRule(MediaQuerySet::create(), rules); 11641 11489 } 11642 11490 11643 11491 #if ENABLE(CSS3_CONDITIONAL_RULES) 11644 StyleRuleBase*CSSParser::createSupportsRule(bool conditionIsSupported, RuleList* rules)11492 PassRefPtr<StyleRuleBase> CSSParser::createSupportsRule(bool conditionIsSupported, RuleList* rules) 11645 11493 { 11646 11494 m_allowImportRules = m_allowNamespaceDeclarations = false; … … 11664 11512 } 11665 11513 11666 StyleRuleSupports* result = rule.get();11667 m_parsedRules.append(rule.release());11668 11514 processAndAddNewRuleToSourceTreeIfNeeded(); 11669 11515 11670 return r esult;11516 return rule.release(); 11671 11517 } 11672 11518 … … 11700 11546 11701 11547 #endif 11702 11703 CSSParser::RuleList* CSSParser::createRuleList()11704 {11705 OwnPtr<RuleList> list = adoptPtr(new RuleList);11706 RuleList* listPtr = list.get();11707 11708 m_parsedRuleLists.append(list.release());11709 return listPtr;11710 }11711 11548 11712 11549 void CSSParser::processAndAddNewRuleToSourceTreeIfNeeded() … … 11774 11611 void CSSParser::logError(const String& message, int lineNumber) 11775 11612 { 11776 // FIXME: <http://webkit.org/b/114313> CSS Parser ConsoleMessage errors should include column numbers11613 // FIXME: <http://webkit.org/b/114313> CSS parser console message errors should include column numbers. 11777 11614 PageConsole& console = m_styleSheet->singleOwnerDocument()->page()->console(); 11778 11615 console.addMessage(CSSMessageSource, WarningMessageLevel, message, m_styleSheet->baseURL().string(), lineNumber + 1, 0); 11779 11616 } 11780 11617 11781 StyleRuleKeyframes* CSSParser::createKeyframesRule(const String& name, PassOwnPtr<Vector<RefPtr<StyleKeyframe> >> popKeyframes)11782 { 11783 OwnPtr<Vector<RefPtr<StyleKeyframe> >> keyframes = popKeyframes;11618 PassRefPtr<StyleRuleKeyframes> CSSParser::createKeyframesRule(const String& name, PassOwnPtr<Vector<RefPtr<StyleKeyframe>>> popKeyframes) 11619 { 11620 OwnPtr<Vector<RefPtr<StyleKeyframe>>> keyframes = popKeyframes; 11784 11621 m_allowImportRules = m_allowNamespaceDeclarations = false; 11785 11622 RefPtr<StyleRuleKeyframes> rule = StyleRuleKeyframes::create(); … … 11787 11624 rule->parserAppendKeyframe(keyframes->at(i)); 11788 11625 rule->setName(name); 11789 StyleRuleKeyframes* rulePtr = rule.get();11790 m_parsedRules.append(rule.release());11791 11626 processAndAddNewRuleToSourceTreeIfNeeded(); 11792 return rule Ptr;11793 } 11794 11795 StyleRuleBase* CSSParser::createStyleRule(Vector<OwnPtr<CSSParserSelector>>* selectors)11796 { 11797 StyleRule* result = 0;11627 return rule.release(); 11628 } 11629 11630 PassRefPtr<StyleRuleBase> CSSParser::createStyleRule(Vector<OwnPtr<CSSParserSelector>>* selectors) 11631 { 11632 RefPtr<StyleRule> rule; 11798 11633 if (selectors) { 11799 11634 m_allowImportRules = false; … … 11801 11636 if (m_hasFontFaceOnlyValues) 11802 11637 deleteFontFaceOnlyValues(); 11803 RefPtr<StyleRule>rule = StyleRule::create(m_lastSelectorLineNumber, createStylePropertySet());11638 rule = StyleRule::create(m_lastSelectorLineNumber, createStylePropertySet()); 11804 11639 rule->parserAdoptSelectorVector(*selectors); 11805 result = rule.get();11806 m_parsedRules.append(rule.release());11807 11640 processAndAddNewRuleToSourceTreeIfNeeded(); 11808 11641 } else 11809 11642 popRuleData(); 11810 11643 clearProperties(); 11811 return r esult;11812 } 11813 11814 StyleRuleBase*CSSParser::createFontFaceRule()11644 return rule.release(); 11645 } 11646 11647 PassRefPtr<StyleRuleBase> CSSParser::createFontFaceRule() 11815 11648 { 11816 11649 m_allowImportRules = m_allowNamespaceDeclarations = false; … … 11831 11664 RefPtr<StyleRuleFontFace> rule = StyleRuleFontFace::create(createStylePropertySet()); 11832 11665 clearProperties(); 11833 StyleRuleFontFace* result = rule.get();11834 m_parsedRules.append(rule.release());11835 11666 processAndAddNewRuleToSourceTreeIfNeeded(); 11836 return r esult;11667 return rule.release(); 11837 11668 } 11838 11669 11839 11670 #if ENABLE(SHADOW_DOM) 11840 StyleRuleBase*CSSParser::createHostRule(RuleList* rules)11671 PassRefPtr<StyleRuleBase> CSSParser::createHostRule(RuleList* rules) 11841 11672 { 11842 11673 m_allowImportRules = m_allowNamespaceDeclarations = false; … … 11848 11679 rule = StyleRuleHost::create(emptyRules); 11849 11680 } 11850 StyleRuleHost* result = rule.get();11851 m_parsedRules.append(rule.release());11852 11681 processAndAddNewRuleToSourceTreeIfNeeded(); 11853 return r esult;11682 return rule.release(); 11854 11683 } 11855 11684 #endif … … 11872 11701 } 11873 11702 11874 CSSParserSelector* CSSParser::rewriteSpecifiersWithNamespaceIfNeeded(CSSParserSelector* specifiers) 11875 { 11876 if (m_defaultNamespace != starAtom || specifiers->isCustomPseudoElement()) 11877 return rewriteSpecifiersWithElementName(nullAtom, starAtom, specifiers, /*tagIsForNamespaceRule*/true); 11878 return specifiers; 11879 } 11880 11881 CSSParserSelector* CSSParser::rewriteSpecifiersWithElementName(const AtomicString& namespacePrefix, const AtomicString& elementName, CSSParserSelector* specifiers, bool tagIsForNamespaceRule) 11703 void CSSParser::rewriteSpecifiersWithNamespaceIfNeeded(CSSParserSelector& specifiers) 11704 { 11705 if (m_defaultNamespace != starAtom || specifiers.isCustomPseudoElement()) 11706 rewriteSpecifiersWithElementName(nullAtom, starAtom, specifiers, /*tagIsForNamespaceRule*/true); 11707 } 11708 11709 void CSSParser::rewriteSpecifiersWithElementName(const AtomicString& namespacePrefix, const AtomicString& elementName, CSSParserSelector& specifiers, bool tagIsForNamespaceRule) 11882 11710 { 11883 11711 AtomicString determinedNamespace = namespacePrefix != nullAtom && m_styleSheet ? m_styleSheet->determineNamespace(namespacePrefix) : m_defaultNamespace; 11884 11712 QualifiedName tag(namespacePrefix, elementName, determinedNamespace); 11885 11713 11886 if (!specifiers ->isCustomPseudoElement()) {11714 if (!specifiers.isCustomPseudoElement()) { 11887 11715 if (tag == anyQName()) 11888 return specifiers;11716 return; 11889 11717 #if ENABLE(VIDEO_TRACK) 11890 if ( !(specifiers->pseudoType() == CSSSelector::PseudoCue))11718 if (specifiers.pseudoType() != CSSSelector::PseudoCue) 11891 11719 #endif 11892 specifiers ->prependTagSelector(tag, tagIsForNamespaceRule);11893 return specifiers;11894 } 11895 11896 CSSParserSelector* lastShadowDescendant = specifiers;11897 CSSParserSelector* history = specifiers;11720 specifiers.prependTagSelector(tag, tagIsForNamespaceRule); 11721 return; 11722 } 11723 11724 CSSParserSelector* lastShadowDescendant = &specifiers; 11725 CSSParserSelector* history = &specifiers; 11898 11726 while (history->tagHistory()) { 11899 11727 history = history->tagHistory(); … … 11905 11733 if (tag != anyQName()) 11906 11734 lastShadowDescendant->tagHistory()->prependTagSelector(tag, tagIsForNamespaceRule); 11907 return specifiers;11735 return; 11908 11736 } 11909 11737 11910 11738 // For shadow-ID pseudo-elements to be correctly matched, the ShadowDescendant combinator has to be used. 11911 11739 // We therefore create a new Selector with that combinator here in any case, even if matching any (host) element in any namespace (i.e. '*'). 11912 OwnPtr<CSSParserSelector> elementNameSelector = adoptPtr(new CSSParserSelector(tag)); 11913 lastShadowDescendant->setTagHistory(elementNameSelector.release()); 11740 lastShadowDescendant->setTagHistory(adoptPtr(new CSSParserSelector(tag))); 11914 11741 lastShadowDescendant->setRelation(CSSSelector::ShadowDescendant); 11915 return specifiers; 11916 } 11917 11918 CSSParserSelector* CSSParser::rewriteSpecifiers(CSSParserSelector* specifiers, CSSParserSelector* newSpecifier) 11742 } 11743 11744 OwnPtr<CSSParserSelector> CSSParser::rewriteSpecifiers(OwnPtr<CSSParserSelector> specifiers, OwnPtr<CSSParserSelector> newSpecifier) 11919 11745 { 11920 11746 #if ENABLE(VIDEO_TRACK) … … 11924 11750 #endif 11925 11751 // Unknown pseudo element always goes at the top of selector chain. 11926 newSpecifier->appendTagHistory(CSSSelector::ShadowDescendant, s inkFloatingSelector(specifiers));11752 newSpecifier->appendTagHistory(CSSSelector::ShadowDescendant, specifiers.release()); 11927 11753 return newSpecifier; 11928 11754 } 11929 11755 if (specifiers->isCustomPseudoElement()) { 11930 11756 // Specifiers for unknown pseudo element go right behind it in the chain. 11931 specifiers->insertTagHistory(CSSSelector::SubSelector, sinkFloatingSelector(newSpecifier), CSSSelector::ShadowDescendant);11757 specifiers->insertTagHistory(CSSSelector::SubSelector, newSpecifier.release(), CSSSelector::ShadowDescendant); 11932 11758 return specifiers; 11933 11759 } 11934 specifiers->appendTagHistory(CSSSelector::SubSelector, sinkFloatingSelector(newSpecifier));11760 specifiers->appendTagHistory(CSSSelector::SubSelector, newSpecifier.release()); 11935 11761 return specifiers; 11936 11762 } 11937 11763 11938 StyleRuleBase*CSSParser::createPageRule(PassOwnPtr<CSSParserSelector> pageSelector)11764 PassRefPtr<StyleRuleBase> CSSParser::createPageRule(PassOwnPtr<CSSParserSelector> pageSelector) 11939 11765 { 11940 11766 // FIXME: Margin at-rules are ignored. 11941 11767 m_allowImportRules = m_allowNamespaceDeclarations = false; 11942 StyleRulePage* pageRule = 0;11768 RefPtr<StyleRulePage> rule; 11943 11769 if (pageSelector) { 11944 RefPtr<StyleRulePage>rule = StyleRulePage::create(createStylePropertySet());11945 Vector<OwnPtr<CSSParserSelector> 11770 rule = StyleRulePage::create(createStylePropertySet()); 11771 Vector<OwnPtr<CSSParserSelector>> selectorVector; 11946 11772 selectorVector.append(pageSelector); 11947 11773 rule->parserAdoptSelectorVector(selectorVector); 11948 pageRule = rule.get();11949 m_parsedRules.append(rule.release());11950 11774 processAndAddNewRuleToSourceTreeIfNeeded(); 11951 11775 } else 11952 11776 popRuleData(); 11953 11777 clearProperties(); 11954 return pageRule; 11955 } 11956 11957 void CSSParser::setReusableRegionSelectorVector(Vector<OwnPtr<CSSParserSelector> >* selectors) 11958 { 11959 if (selectors) 11960 m_reusableRegionSelectorVector.swap(*selectors); 11961 } 11962 11963 StyleRuleBase* CSSParser::createRegionRule(Vector<OwnPtr<CSSParserSelector> >* regionSelector, RuleList* rules) 11778 return rule.release(); 11779 } 11780 11781 OwnPtr<Vector<OwnPtr<CSSParserSelector>>> CSSParser::createSelectorVector() 11782 { 11783 if (m_recycledSelectorVector) { 11784 m_recycledSelectorVector->shrink(0); 11785 return std::move(m_recycledSelectorVector); 11786 } 11787 return adoptPtr(new Vector<OwnPtr<CSSParserSelector>>); 11788 } 11789 11790 void CSSParser::recycleSelectorVector(OwnPtr<Vector<OwnPtr<CSSParserSelector>>> vector) 11791 { 11792 if (vector && !m_recycledSelectorVector) 11793 m_recycledSelectorVector = std::move(vector); 11794 } 11795 11796 PassRefPtr<StyleRuleBase> CSSParser::createRegionRule(Vector<OwnPtr<CSSParserSelector>>* regionSelector, RuleList* rules) 11964 11797 { 11965 11798 if (!cssRegionsEnabled() || !regionSelector || !rules) { … … 11972 11805 RefPtr<StyleRuleRegion> regionRule = StyleRuleRegion::create(regionSelector, *rules); 11973 11806 11974 StyleRuleRegion* result = regionRule.get();11975 m_parsedRules.append(regionRule.release());11976 11807 if (isExtractingSourceData()) 11977 11808 addNewRuleToSourceTree(CSSRuleSourceData::createUnknown()); 11978 11809 11979 return re sult;11980 } 11981 11982 StyleRuleBase*CSSParser::createMarginAtRule(CSSSelector::MarginBoxType /* marginBox */)11810 return regionRule.release(); 11811 } 11812 11813 void CSSParser::createMarginAtRule(CSSSelector::MarginBoxType /* marginBox */) 11983 11814 { 11984 11815 // FIXME: Implement margin at-rule here, using: … … 11988 11819 11989 11820 endDeclarationsForMarginBox(); 11990 return 0; // until this method is implemented.11991 11821 } 11992 11822 … … 12015 11845 } 12016 11846 12017 StyleKeyframe* CSSParser::createKeyframe(CSSParserValueList*keys)11847 PassRefPtr<StyleKeyframe> CSSParser::createKeyframe(CSSParserValueList& keys) 12018 11848 { 12019 11849 // Create a key string from the passed keys 12020 11850 StringBuilder keyString; 12021 for (unsigned i = 0; i < keys ->size(); ++i) {11851 for (unsigned i = 0; i < keys.size(); ++i) { 12022 11852 // Just as per the comment below, we ignore keyframes with 12023 11853 // invalid key values (plain numbers or unknown identifiers) 12024 11854 // marked as CSSPrimitiveValue::CSS_UNKNOWN during parsing. 12025 if (keys ->valueAt(i)->unit == CSSPrimitiveValue::CSS_UNKNOWN) {11855 if (keys.valueAt(i)->unit == CSSPrimitiveValue::CSS_UNKNOWN) { 12026 11856 clearProperties(); 12027 11857 return 0; 12028 11858 } 12029 11859 12030 ASSERT(keys ->valueAt(i)->unit == CSSPrimitiveValue::CSS_NUMBER);12031 float key = static_cast<float>(keys ->valueAt(i)->fValue);11860 ASSERT(keys.valueAt(i)->unit == CSSPrimitiveValue::CSS_NUMBER); 11861 float key = static_cast<float>(keys.valueAt(i)->fValue); 12032 11862 if (key < 0 || key > 100) { 12033 11863 // As per http://www.w3.org/TR/css3-animations/#keyframes, … … 12048 11878 clearProperties(); 12049 11879 12050 StyleKeyframe* keyframePtr = keyframe.get(); 12051 m_parsedKeyframes.append(keyframe.release()); 12052 return keyframePtr; 11880 return keyframe.release(); 12053 11881 } 12054 11882 … … 12258 12086 12259 12087 #if ENABLE(CSS_DEVICE_ADAPTATION) 12260 StyleRuleBase*CSSParser::createViewportRule()12088 PassRefPtr<StyleRuleBase> CSSParser::createViewportRule() 12261 12089 { 12262 12090 m_allowImportRules = m_allowNamespaceDeclarations = false; … … 12265 12093 clearProperties(); 12266 12094 12267 StyleRuleViewport* result = rule.get();12268 m_parsedRules.append(rule.release());12269 12095 processAndAddNewRuleToSourceTreeIfNeeded(); 12270 12096 12271 return r esult;12097 return rule.release(); 12272 12098 } 12273 12099 -
trunk/Source/WebCore/css/CSSParser.h
r154996 r155536 176 176 177 177 bool parseBasicShape(CSSPropertyID, bool important); 178 PassRefPtr<CSSBasicShape> parseBasicShapeRectangle(CSSParserValueList* args);179 PassRefPtr<CSSBasicShape> parseBasicShapeCircle(CSSParserValueList* args);180 PassRefPtr<CSSBasicShape> parseBasicShapeEllipse(CSSParserValueList* args);181 PassRefPtr<CSSBasicShape> parseBasicShapePolygon(CSSParserValueList* args);182 PassRefPtr<CSSBasicShape> parseBasicShapeInsetRectangle(CSSParserValueList* args);178 PassRefPtr<CSSBasicShape> parseBasicShapeRectangle(CSSParserValueList*); 179 PassRefPtr<CSSBasicShape> parseBasicShapeCircle(CSSParserValueList*); 180 PassRefPtr<CSSBasicShape> parseBasicShapeEllipse(CSSParserValueList*); 181 PassRefPtr<CSSBasicShape> parseBasicShapePolygon(CSSParserValueList*); 182 PassRefPtr<CSSBasicShape> parseBasicShapeInsetRectangle(CSSParserValueList*); 183 183 184 184 bool parseFont(bool important); … … 283 283 #if ENABLE(CSS3_TEXT) 284 284 bool parseTextUnderlinePosition(bool important); 285 #endif // CSS3_TEXT285 #endif 286 286 287 287 PassRefPtr<CSSValue> parseTextIndent(); … … 301 301 bool parseFontVariantLigatures(bool important); 302 302 303 CSSParserSelector* createFloatingSelector(); 304 CSSParserSelector* createFloatingSelectorWithTagName(const QualifiedName&); 305 PassOwnPtr<CSSParserSelector> sinkFloatingSelector(CSSParserSelector*); 306 307 Vector<OwnPtr<CSSParserSelector> >* createFloatingSelectorVector(); 308 PassOwnPtr<Vector<OwnPtr<CSSParserSelector> > > sinkFloatingSelectorVector(Vector<OwnPtr<CSSParserSelector> >*); 309 310 CSSParserValueList* createFloatingValueList(); 311 PassOwnPtr<CSSParserValueList> sinkFloatingValueList(CSSParserValueList*); 312 313 CSSParserFunction* createFloatingFunction(); 314 PassOwnPtr<CSSParserFunction> sinkFloatingFunction(CSSParserFunction*); 315 316 CSSParserValue& sinkFloatingValue(CSSParserValue&); 317 318 MediaQuerySet* createMediaQuerySet(); 319 StyleRuleBase* createImportRule(const CSSParserString&, MediaQuerySet*); 320 StyleKeyframe* createKeyframe(CSSParserValueList*); 321 StyleRuleKeyframes* createKeyframesRule(const String&, PassOwnPtr<Vector<RefPtr<StyleKeyframe> > >); 322 323 typedef Vector<RefPtr<StyleRuleBase> > RuleList; 324 StyleRuleBase* createMediaRule(MediaQuerySet*, RuleList*); 325 StyleRuleBase* createEmptyMediaRule(RuleList*); 326 RuleList* createRuleList(); 327 StyleRuleBase* createStyleRule(Vector<OwnPtr<CSSParserSelector> >* selectors); 328 StyleRuleBase* createFontFaceRule(); 329 StyleRuleBase* createPageRule(PassOwnPtr<CSSParserSelector> pageSelector); 330 StyleRuleBase* createRegionRule(Vector<OwnPtr<CSSParserSelector> >* regionSelector, RuleList* rules); 331 StyleRuleBase* createMarginAtRule(CSSSelector::MarginBoxType); 303 // Faster than doing a new/delete each time since it keeps one vector. 304 OwnPtr<Vector<OwnPtr<CSSParserSelector>>> createSelectorVector(); 305 void recycleSelectorVector(OwnPtr<Vector<OwnPtr<CSSParserSelector>>>); 306 307 PassRefPtr<StyleRuleBase> createImportRule(const CSSParserString&, PassRefPtr<MediaQuerySet>); 308 PassRefPtr<StyleKeyframe> createKeyframe(CSSParserValueList&); 309 PassRefPtr<StyleRuleKeyframes> createKeyframesRule(const String&, PassOwnPtr<Vector<RefPtr<StyleKeyframe>>>); 310 311 typedef Vector<RefPtr<StyleRuleBase>> RuleList; 312 PassRefPtr<StyleRuleBase> createMediaRule(PassRefPtr<MediaQuerySet>, RuleList*); 313 PassRefPtr<StyleRuleBase> createEmptyMediaRule(RuleList*); 314 PassRefPtr<StyleRuleBase> createStyleRule(Vector<OwnPtr<CSSParserSelector>>* selectors); 315 PassRefPtr<StyleRuleBase> createFontFaceRule(); 316 PassRefPtr<StyleRuleBase> createPageRule(PassOwnPtr<CSSParserSelector> pageSelector); 317 PassRefPtr<StyleRuleBase> createRegionRule(Vector<OwnPtr<CSSParserSelector>>* regionSelector, RuleList* rules); 318 void createMarginAtRule(CSSSelector::MarginBoxType); 332 319 #if ENABLE(CSS3_CONDITIONAL_RULES) 333 StyleRuleBase*createSupportsRule(bool conditionIsSupported, RuleList*);320 PassRefPtr<StyleRuleBase> createSupportsRule(bool conditionIsSupported, RuleList*); 334 321 void markSupportsRuleHeaderStart(); 335 322 void markSupportsRuleHeaderEnd(); … … 337 324 #endif 338 325 #if ENABLE(SHADOW_DOM) 339 StyleRuleBase* createHostRule(RuleList* rules);326 PassRefPtr<StyleRuleBase> createHostRule(RuleList*); 340 327 #endif 341 328 #if ENABLE(CSS_SHADERS) 342 StyleRuleBase*createFilterRule(const CSSParserString&);329 PassRefPtr<StyleRuleBase> createFilterRule(const CSSParserString&); 343 330 #endif 344 331 … … 346 333 void endDeclarationsForMarginBox(); 347 334 348 MediaQueryExp* createFloatingMediaQueryExp(const AtomicString&, CSSParserValueList*);349 PassOwnPtr<MediaQueryExp> sinkFloatingMediaQueryExp(MediaQueryExp*);350 Vector<OwnPtr<MediaQueryExp> >* createFloatingMediaQueryExpList();351 PassOwnPtr<Vector<OwnPtr<MediaQueryExp> > > sinkFloatingMediaQueryExpList(Vector<OwnPtr<MediaQueryExp> >*);352 MediaQuery* createFloatingMediaQuery(MediaQuery::Restrictor, const String&, PassOwnPtr<Vector<OwnPtr<MediaQueryExp> > >);353 MediaQuery* createFloatingMediaQuery(PassOwnPtr<Vector<OwnPtr<MediaQueryExp> > >);354 PassOwnPtr<MediaQuery> sinkFloatingMediaQuery(MediaQuery*);355 356 Vector<RefPtr<StyleKeyframe> >* createFloatingKeyframeVector();357 PassOwnPtr<Vector<RefPtr<StyleKeyframe> > > sinkFloatingKeyframeVector(Vector<RefPtr<StyleKeyframe> >*);358 359 335 void addNamespace(const AtomicString& prefix, const AtomicString& uri); 360 336 QualifiedName determineNameInNamespace(const AtomicString& prefix, const AtomicString& localName); 361 337 362 CSSParserSelector* rewriteSpecifiersWithElementName(const AtomicString& namespacePrefix, const AtomicString& elementName, CSSParserSelector*, bool isNamespacePlaceholder = false);363 CSSParserSelector* rewriteSpecifiersWithNamespaceIfNeeded(CSSParserSelector*);364 CSSParserSelector* rewriteSpecifiers(CSSParserSelector*, CSSParserSelector*);338 void rewriteSpecifiersWithElementName(const AtomicString& namespacePrefix, const AtomicString& elementName, CSSParserSelector&, bool isNamespacePlaceholder = false); 339 void rewriteSpecifiersWithNamespaceIfNeeded(CSSParserSelector&); 340 OwnPtr<CSSParserSelector> rewriteSpecifiers(OwnPtr<CSSParserSelector>, OwnPtr<CSSParserSelector>); 365 341 366 342 void invalidBlockHit(); 367 368 Vector<OwnPtr<CSSParserSelector> >* reusableSelectorVector() { return &m_reusableSelectorVector; }369 370 void setReusableRegionSelectorVector(Vector<OwnPtr<CSSParserSelector> >* selectors);371 Vector<OwnPtr<CSSParserSelector> >* reusableRegionSelectorVector() { return &m_reusableRegionSelectorVector; }372 343 373 344 void updateLastSelectorLineAndPosition(); … … 443 414 void markViewportRuleBodyStart() { m_inViewport = true; } 444 415 void markViewportRuleBodyEnd() { m_inViewport = false; } 445 StyleRuleBase*createViewportRule();416 PassRefPtr<StyleRuleBase> createViewportRule(); 446 417 #endif 447 418 … … 614 585 int (CSSParser::*m_lexFunc)(void*); 615 586 616 Vector<RefPtr<StyleRuleBase> > m_parsedRules; 617 Vector<RefPtr<StyleKeyframe> > m_parsedKeyframes; 618 Vector<RefPtr<MediaQuerySet> > m_parsedMediaQuerySets; 619 Vector<OwnPtr<RuleList> > m_parsedRuleLists; 620 HashSet<CSSParserSelector*> m_floatingSelectors; 621 HashSet<Vector<OwnPtr<CSSParserSelector> >*> m_floatingSelectorVectors; 622 HashSet<CSSParserValueList*> m_floatingValueLists; 623 HashSet<CSSParserFunction*> m_floatingFunctions; 624 625 OwnPtr<MediaQuery> m_floatingMediaQuery; 626 OwnPtr<MediaQueryExp> m_floatingMediaQueryExp; 627 OwnPtr<Vector<OwnPtr<MediaQueryExp> > > m_floatingMediaQueryExpList; 628 629 OwnPtr<Vector<RefPtr<StyleKeyframe> > > m_floatingKeyframeVector; 630 631 Vector<OwnPtr<CSSParserSelector> > m_reusableSelectorVector; 632 Vector<OwnPtr<CSSParserSelector> > m_reusableRegionSelectorVector; 587 OwnPtr<Vector<OwnPtr<CSSParserSelector>>> m_recycledSelectorVector; 633 588 634 589 RefPtr<CSSCalcValue> m_parsedCalculation; -
trunk/Source/WebCore/css/CSSParserValues.cpp
r155195 r155536 34 34 using namespace WTF; 35 35 36 void destroy(const CSSParserValue& value) 37 { 38 if (value.unit == CSSParserValue::Function) 39 delete value.function; 40 } 41 36 42 CSSParserValueList::~CSSParserValueList() 37 43 { 38 size_t numValues = m_values.size(); 39 for (size_t i = 0; i < numValues; i++) { 40 if (m_values[i].unit == CSSParserValue::Function) 41 delete m_values[i].function; 42 } 44 for (size_t i = 0, size = m_values.size(); i < size; i++) 45 destroy(m_values[i]); 43 46 } 44 47 -
trunk/Source/WebCore/css/CSSParserValues.h
r153631 r155536 126 126 int unit; 127 127 128 129 128 PassRefPtr<CSSValue> createCSSValue(); 130 129 }; 130 131 void destroy(const CSSParserValue&); 131 132 132 133 class CSSParserValueList {
Note: See TracChangeset
for help on using the changeset viewer.