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

Side by Side Diff: third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp

Issue 1858753003: Remove RawPtr from core/css (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/css/parser/CSSPropertyParser.h" 5 #include "core/css/parser/CSSPropertyParser.h"
6 6
7 #include "core/StylePropertyShorthand.h" 7 #include "core/StylePropertyShorthand.h"
8 #include "core/css/CSSBasicShapeValues.h" 8 #include "core/css/CSSBasicShapeValues.h"
9 #include "core/css/CSSBorderImage.h" 9 #include "core/css/CSSBorderImage.h"
10 #include "core/css/CSSContentDistributionValue.h" 10 #include "core/css/CSSContentDistributionValue.h"
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 // This doesn't count UA style sheets 94 // This doesn't count UA style sheets
95 if (parseSuccess && context.useCounter()) 95 if (parseSuccess && context.useCounter())
96 context.useCounter()->count(context.mode(), unresolvedProperty); 96 context.useCounter()->count(context.mode(), unresolvedProperty);
97 97
98 if (!parseSuccess) 98 if (!parseSuccess)
99 parsedProperties.shrink(parsedPropertiesSize); 99 parsedProperties.shrink(parsedPropertiesSize);
100 100
101 return parseSuccess; 101 return parseSuccess;
102 } 102 }
103 103
104 RawPtr<CSSValue> CSSPropertyParser::parseSingleValue( 104 CSSValue* CSSPropertyParser::parseSingleValue(
105 CSSPropertyID property, const CSSParserTokenRange& range, const CSSParserCon text& context) 105 CSSPropertyID property, const CSSParserTokenRange& range, const CSSParserCon text& context)
106 { 106 {
107 if (hasInvalidNumericValues(range)) 107 if (hasInvalidNumericValues(range))
108 return nullptr; 108 return nullptr;
109 CSSPropertyParser parser(range, context, nullptr); 109 CSSPropertyParser parser(range, context, nullptr);
110 RawPtr<CSSValue> value = parser.parseSingleValue(property); 110 CSSValue* value = parser.parseSingleValue(property);
111 if (!value || !parser.m_range.atEnd()) 111 if (!value || !parser.m_range.atEnd())
112 return nullptr; 112 return nullptr;
113 return value.release(); 113 return value;
114 } 114 }
115 115
116 bool CSSPropertyParser::isValidNumericValue(double value) 116 bool CSSPropertyParser::isValidNumericValue(double value)
117 { 117 {
118 return std::isfinite(value) 118 return std::isfinite(value)
119 && value >= -std::numeric_limits<float>::max() 119 && value >= -std::numeric_limits<float>::max()
120 && value <= std::numeric_limits<float>::max(); 120 && value <= std::numeric_limits<float>::max();
121 } 121 }
122 122
123 bool CSSPropertyParser::parseValueStart(CSSPropertyID unresolvedProperty, bool i mportant) 123 bool CSSPropertyParser::parseValueStart(CSSPropertyID unresolvedProperty, bool i mportant)
124 { 124 {
125 if (consumeCSSWideKeyword(unresolvedProperty, important)) 125 if (consumeCSSWideKeyword(unresolvedProperty, important))
126 return true; 126 return true;
127 127
128 CSSParserTokenRange originalRange = m_range; 128 CSSParserTokenRange originalRange = m_range;
129 CSSPropertyID propertyId = resolveCSSPropertyID(unresolvedProperty); 129 CSSPropertyID propertyId = resolveCSSPropertyID(unresolvedProperty);
130 130
131 if (isShorthandProperty(propertyId)) { 131 if (isShorthandProperty(propertyId)) {
132 if (parseShorthand(unresolvedProperty, important)) 132 if (parseShorthand(unresolvedProperty, important))
133 return true; 133 return true;
134 } else { 134 } else {
135 if (RawPtr<CSSValue> parsedValue = parseSingleValue(unresolvedProperty)) { 135 if (CSSValue* parsedValue = parseSingleValue(unresolvedProperty)) {
136 if (m_range.atEnd()) { 136 if (m_range.atEnd()) {
137 addProperty(propertyId, parsedValue.release(), important); 137 addProperty(propertyId, parsedValue, important);
138 return true; 138 return true;
139 } 139 }
140 } 140 }
141 } 141 }
142 142
143 if (RuntimeEnabledFeatures::cssVariablesEnabled() && CSSVariableParser::cont ainsValidVariableReferences(originalRange)) { 143 if (RuntimeEnabledFeatures::cssVariablesEnabled() && CSSVariableParser::cont ainsValidVariableReferences(originalRange)) {
144 // We don't expand the shorthand here because crazypants. 144 // We don't expand the shorthand here because crazypants.
145 RawPtr<CSSVariableReferenceValue> variable = CSSVariableReferenceValue:: create(CSSVariableData::create(originalRange)); 145 CSSVariableReferenceValue* variable = CSSVariableReferenceValue::create( CSSVariableData::create(originalRange));
146 addProperty(propertyId, variable.release(), important); 146 addProperty(propertyId, variable, important);
147 return true; 147 return true;
148 } 148 }
149 149
150 return false; 150 return false;
151 } 151 }
152 152
153 bool CSSPropertyParser::isColorKeyword(CSSValueID id) 153 bool CSSPropertyParser::isColorKeyword(CSSValueID id)
154 { 154 {
155 // Named colors and color keywords: 155 // Named colors and color keywords:
156 // 156 //
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 return string.is8Bit() ? cssValueKeywordID(string.characters8(), length) : c ssValueKeywordID(string.characters16(), length); 259 return string.is8Bit() ? cssValueKeywordID(string.characters8(), length) : c ssValueKeywordID(string.characters16(), length);
260 } 260 }
261 261
262 bool CSSPropertyParser::consumeCSSWideKeyword(CSSPropertyID unresolvedProperty, bool important) 262 bool CSSPropertyParser::consumeCSSWideKeyword(CSSPropertyID unresolvedProperty, bool important)
263 { 263 {
264 CSSParserTokenRange rangeCopy = m_range; 264 CSSParserTokenRange rangeCopy = m_range;
265 CSSValueID id = rangeCopy.consumeIncludingWhitespace().id(); 265 CSSValueID id = rangeCopy.consumeIncludingWhitespace().id();
266 if (!rangeCopy.atEnd()) 266 if (!rangeCopy.atEnd())
267 return false; 267 return false;
268 268
269 RawPtr<CSSValue> value = nullptr; 269 CSSValue* value = nullptr;
270 if (id == CSSValueInitial) 270 if (id == CSSValueInitial)
271 value = cssValuePool().createExplicitInitialValue(); 271 value = cssValuePool().createExplicitInitialValue();
272 else if (id == CSSValueInherit) 272 else if (id == CSSValueInherit)
273 value = cssValuePool().createInheritedValue(); 273 value = cssValuePool().createInheritedValue();
274 else if (id == CSSValueUnset) 274 else if (id == CSSValueUnset)
275 value = cssValuePool().createUnsetValue(); 275 value = cssValuePool().createUnsetValue();
276 else 276 else
277 return false; 277 return false;
278 278
279 addExpandedPropertyForValue(resolveCSSPropertyID(unresolvedProperty), value. release(), important); 279 addExpandedPropertyForValue(resolveCSSPropertyID(unresolvedProperty), value, important);
280 m_range = rangeCopy; 280 m_range = rangeCopy;
281 return true; 281 return true;
282 } 282 }
283 283
284 static RawPtr<CSSValueList> consumeTransformOrigin(CSSParserTokenRange& range, C SSParserMode cssParserMode, UnitlessQuirk unitless) 284 static CSSValueList* consumeTransformOrigin(CSSParserTokenRange& range, CSSParse rMode cssParserMode, UnitlessQuirk unitless)
285 { 285 {
286 RawPtr<CSSValue> resultX = nullptr; 286 CSSValue* resultX = nullptr;
287 RawPtr<CSSValue> resultY = nullptr; 287 CSSValue* resultY = nullptr;
288 if (consumeOneOrTwoValuedPosition(range, cssParserMode, unitless, resultX, r esultY)) { 288 if (consumeOneOrTwoValuedPosition(range, cssParserMode, unitless, resultX, r esultY)) {
289 RawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 289 CSSValueList* list = CSSValueList::createSpaceSeparated();
290 list->append(resultX.release()); 290 list->append(resultX);
291 list->append(resultY.release()); 291 list->append(resultY);
292 RawPtr<CSSValue> resultZ = consumeLength(range, cssParserMode, ValueRang eAll); 292 CSSValue* resultZ = consumeLength(range, cssParserMode, ValueRangeAll);
293 if (!resultZ) 293 if (!resultZ)
294 resultZ = cssValuePool().createValue(0, CSSPrimitiveValue::UnitType: :Pixels); 294 resultZ = cssValuePool().createValue(0, CSSPrimitiveValue::UnitType: :Pixels);
295 list->append(resultZ.release()); 295 list->append(resultZ);
296 return list.release(); 296 return list;
297 } 297 }
298 return nullptr; 298 return nullptr;
299 } 299 }
300 300
301 // Methods for consuming non-shorthand properties starts here. 301 // Methods for consuming non-shorthand properties starts here.
302 static RawPtr<CSSValue> consumeWillChange(CSSParserTokenRange& range) 302 static CSSValue* consumeWillChange(CSSParserTokenRange& range)
303 { 303 {
304 if (range.peek().id() == CSSValueAuto) 304 if (range.peek().id() == CSSValueAuto)
305 return consumeIdent(range); 305 return consumeIdent(range);
306 306
307 RawPtr<CSSValueList> values = CSSValueList::createCommaSeparated(); 307 CSSValueList* values = CSSValueList::createCommaSeparated();
308 // Every comma-separated list of identifiers is a valid will-change value, 308 // Every comma-separated list of identifiers is a valid will-change value,
309 // unless the list includes an explicitly disallowed identifier. 309 // unless the list includes an explicitly disallowed identifier.
310 while (true) { 310 while (true) {
311 if (range.peek().type() != IdentToken) 311 if (range.peek().type() != IdentToken)
312 return nullptr; 312 return nullptr;
313 CSSPropertyID unresolvedProperty = unresolvedCSSPropertyID(range.peek(). value()); 313 CSSPropertyID unresolvedProperty = unresolvedCSSPropertyID(range.peek(). value());
314 if (unresolvedProperty) { 314 if (unresolvedProperty) {
315 ASSERT(CSSPropertyMetadata::isEnabledProperty(unresolvedProperty)); 315 ASSERT(CSSPropertyMetadata::isEnabledProperty(unresolvedProperty));
316 // Now "all" is used by both CSSValue and CSSPropertyValue. 316 // Now "all" is used by both CSSValue and CSSPropertyValue.
317 // Need to return nullptr when currentValue is CSSPropertyAll. 317 // Need to return nullptr when currentValue is CSSPropertyAll.
(...skipping 19 matching lines...) Expand all
337 break; 337 break;
338 } 338 }
339 } 339 }
340 340
341 if (range.atEnd()) 341 if (range.atEnd())
342 break; 342 break;
343 if (!consumeCommaIncludingWhitespace(range)) 343 if (!consumeCommaIncludingWhitespace(range))
344 return nullptr; 344 return nullptr;
345 } 345 }
346 346
347 return values.release(); 347 return values;
348 } 348 }
349 349
350 static RawPtr<CSSFontFeatureValue> consumeFontFeatureTag(CSSParserTokenRange& ra nge) 350 static CSSFontFeatureValue* consumeFontFeatureTag(CSSParserTokenRange& range)
351 { 351 {
352 // Feature tag name consists of 4-letter characters. 352 // Feature tag name consists of 4-letter characters.
353 static const unsigned tagNameLength = 4; 353 static const unsigned tagNameLength = 4;
354 354
355 const CSSParserToken& token = range.consumeIncludingWhitespace(); 355 const CSSParserToken& token = range.consumeIncludingWhitespace();
356 // Feature tag name comes first 356 // Feature tag name comes first
357 if (token.type() != StringToken) 357 if (token.type() != StringToken)
358 return nullptr; 358 return nullptr;
359 if (token.value().length() != tagNameLength) 359 if (token.value().length() != tagNameLength)
360 return nullptr; 360 return nullptr;
(...skipping 10 matching lines...) Expand all
371 if (range.peek().type() == NumberToken && range.peek().numericValueType() == IntegerValueType && range.peek().numericValue() >= 0) { 371 if (range.peek().type() == NumberToken && range.peek().numericValueType() == IntegerValueType && range.peek().numericValue() >= 0) {
372 tagValue = clampTo<int>(range.consumeIncludingWhitespace().numericValue( )); 372 tagValue = clampTo<int>(range.consumeIncludingWhitespace().numericValue( ));
373 if (tagValue < 0) 373 if (tagValue < 0)
374 return nullptr; 374 return nullptr;
375 } else if (range.peek().id() == CSSValueOn || range.peek().id() == CSSValueO ff) { 375 } else if (range.peek().id() == CSSValueOn || range.peek().id() == CSSValueO ff) {
376 tagValue = range.consumeIncludingWhitespace().id() == CSSValueOn; 376 tagValue = range.consumeIncludingWhitespace().id() == CSSValueOn;
377 } 377 }
378 return CSSFontFeatureValue::create(tag, tagValue); 378 return CSSFontFeatureValue::create(tag, tagValue);
379 } 379 }
380 380
381 static RawPtr<CSSValue> consumeFontFeatureSettings(CSSParserTokenRange& range) 381 static CSSValue* consumeFontFeatureSettings(CSSParserTokenRange& range)
382 { 382 {
383 if (range.peek().id() == CSSValueNormal) 383 if (range.peek().id() == CSSValueNormal)
384 return consumeIdent(range); 384 return consumeIdent(range);
385 RawPtr<CSSValueList> settings = CSSValueList::createCommaSeparated(); 385 CSSValueList* settings = CSSValueList::createCommaSeparated();
386 do { 386 do {
387 RawPtr<CSSFontFeatureValue> fontFeatureValue = consumeFontFeatureTag(ran ge); 387 CSSFontFeatureValue* fontFeatureValue = consumeFontFeatureTag(range);
388 if (!fontFeatureValue) 388 if (!fontFeatureValue)
389 return nullptr; 389 return nullptr;
390 settings->append(fontFeatureValue); 390 settings->append(fontFeatureValue);
391 } while (consumeCommaIncludingWhitespace(range)); 391 } while (consumeCommaIncludingWhitespace(range));
392 return settings.release(); 392 return settings;
393 } 393 }
394 394
395 static RawPtr<CSSValue> consumePage(CSSParserTokenRange& range) 395 static CSSValue* consumePage(CSSParserTokenRange& range)
396 { 396 {
397 if (range.peek().id() == CSSValueAuto) 397 if (range.peek().id() == CSSValueAuto)
398 return consumeIdent(range); 398 return consumeIdent(range);
399 return consumeCustomIdent(range); 399 return consumeCustomIdent(range);
400 } 400 }
401 401
402 static RawPtr<CSSValue> consumeQuotes(CSSParserTokenRange& range) 402 static CSSValue* consumeQuotes(CSSParserTokenRange& range)
403 { 403 {
404 if (range.peek().id() == CSSValueNone) 404 if (range.peek().id() == CSSValueNone)
405 return consumeIdent(range); 405 return consumeIdent(range);
406 RawPtr<CSSValueList> values = CSSValueList::createSpaceSeparated(); 406 CSSValueList* values = CSSValueList::createSpaceSeparated();
407 while (!range.atEnd()) { 407 while (!range.atEnd()) {
408 RawPtr<CSSStringValue> parsedValue = consumeString(range); 408 CSSStringValue* parsedValue = consumeString(range);
409 if (!parsedValue) 409 if (!parsedValue)
410 return nullptr; 410 return nullptr;
411 values->append(parsedValue.release()); 411 values->append(parsedValue);
412 } 412 }
413 if (values->length() && values->length() % 2 == 0) 413 if (values->length() && values->length() % 2 == 0)
414 return values.release(); 414 return values;
415 return nullptr; 415 return nullptr;
416 } 416 }
417 417
418 static RawPtr<CSSValue> consumeWebkitHighlight(CSSParserTokenRange& range) 418 static CSSValue* consumeWebkitHighlight(CSSParserTokenRange& range)
419 { 419 {
420 if (range.peek().id() == CSSValueNone) 420 if (range.peek().id() == CSSValueNone)
421 return consumeIdent(range); 421 return consumeIdent(range);
422 return consumeString(range); 422 return consumeString(range);
423 } 423 }
424 424
425 static RawPtr<CSSValue> consumeFontVariantLigatures(CSSParserTokenRange& range) 425 static CSSValue* consumeFontVariantLigatures(CSSParserTokenRange& range)
426 { 426 {
427 if (range.peek().id() == CSSValueNormal) 427 if (range.peek().id() == CSSValueNormal)
428 return consumeIdent(range); 428 return consumeIdent(range);
429 RawPtr<CSSValueList> ligatureValues = CSSValueList::createSpaceSeparated(); 429 CSSValueList* ligatureValues = CSSValueList::createSpaceSeparated();
430 bool sawCommonLigaturesValue = false; 430 bool sawCommonLigaturesValue = false;
431 bool sawDiscretionaryLigaturesValue = false; 431 bool sawDiscretionaryLigaturesValue = false;
432 bool sawHistoricalLigaturesValue = false; 432 bool sawHistoricalLigaturesValue = false;
433 bool sawContextualLigaturesValue = false; 433 bool sawContextualLigaturesValue = false;
434 do { 434 do {
435 CSSValueID id = range.peek().id(); 435 CSSValueID id = range.peek().id();
436 switch (id) { 436 switch (id) {
437 case CSSValueNoCommonLigatures: 437 case CSSValueNoCommonLigatures:
438 case CSSValueCommonLigatures: 438 case CSSValueCommonLigatures:
439 if (sawCommonLigaturesValue) 439 if (sawCommonLigaturesValue)
(...skipping 17 matching lines...) Expand all
457 if (sawContextualLigaturesValue) 457 if (sawContextualLigaturesValue)
458 return nullptr; 458 return nullptr;
459 sawContextualLigaturesValue = true; 459 sawContextualLigaturesValue = true;
460 break; 460 break;
461 default: 461 default:
462 return nullptr; 462 return nullptr;
463 } 463 }
464 ligatureValues->append(consumeIdent(range)); 464 ligatureValues->append(consumeIdent(range));
465 } while (!range.atEnd()); 465 } while (!range.atEnd());
466 466
467 return ligatureValues.release(); 467 return ligatureValues;
468 } 468 }
469 469
470 static RawPtr<CSSPrimitiveValue> consumeFontVariant(CSSParserTokenRange& range) 470 static CSSPrimitiveValue* consumeFontVariant(CSSParserTokenRange& range)
471 { 471 {
472 return consumeIdent<CSSValueNormal, CSSValueSmallCaps>(range); 472 return consumeIdent<CSSValueNormal, CSSValueSmallCaps>(range);
473 } 473 }
474 474
475 static RawPtr<CSSValue> consumeFontVariantList(CSSParserTokenRange& range) 475 static CSSValue* consumeFontVariantList(CSSParserTokenRange& range)
476 { 476 {
477 RawPtr<CSSValueList> values = CSSValueList::createCommaSeparated(); 477 CSSValueList* values = CSSValueList::createCommaSeparated();
478 do { 478 do {
479 if (range.peek().id() == CSSValueAll) { 479 if (range.peek().id() == CSSValueAll) {
480 // FIXME: CSSPropertyParser::parseFontVariant() implements 480 // FIXME: CSSPropertyParser::parseFontVariant() implements
481 // the old css3 draft: 481 // the old css3 draft:
482 // http://www.w3.org/TR/2002/WD-css3-webfonts-20020802/#font-variant 482 // http://www.w3.org/TR/2002/WD-css3-webfonts-20020802/#font-variant
483 // 'all' is only allowed in @font-face and with no other values. 483 // 'all' is only allowed in @font-face and with no other values.
484 if (values->length()) 484 if (values->length())
485 return nullptr; 485 return nullptr;
486 return consumeIdent(range); 486 return consumeIdent(range);
487 } 487 }
488 RawPtr<CSSPrimitiveValue> fontVariant = consumeFontVariant(range); 488 CSSPrimitiveValue* fontVariant = consumeFontVariant(range);
489 if (fontVariant) 489 if (fontVariant)
490 values->append(fontVariant.release()); 490 values->append(fontVariant);
491 } while (consumeCommaIncludingWhitespace(range)); 491 } while (consumeCommaIncludingWhitespace(range));
492 492
493 if (values->length()) 493 if (values->length())
494 return values.release(); 494 return values;
495 495
496 return nullptr; 496 return nullptr;
497 } 497 }
498 498
499 static RawPtr<CSSPrimitiveValue> consumeFontWeight(CSSParserTokenRange& range) 499 static CSSPrimitiveValue* consumeFontWeight(CSSParserTokenRange& range)
500 { 500 {
501 const CSSParserToken& token = range.peek(); 501 const CSSParserToken& token = range.peek();
502 if (token.id() >= CSSValueNormal && token.id() <= CSSValueLighter) 502 if (token.id() >= CSSValueNormal && token.id() <= CSSValueLighter)
503 return consumeIdent(range); 503 return consumeIdent(range);
504 if (token.type() != NumberToken || token.numericValueType() != IntegerValueT ype) 504 if (token.type() != NumberToken || token.numericValueType() != IntegerValueT ype)
505 return nullptr; 505 return nullptr;
506 int weight = static_cast<int>(token.numericValue()); 506 int weight = static_cast<int>(token.numericValue());
507 if ((weight % 100) || weight < 100 || weight > 900) 507 if ((weight % 100) || weight < 100 || weight > 900)
508 return nullptr; 508 return nullptr;
509 range.consumeIncludingWhitespace(); 509 range.consumeIncludingWhitespace();
(...skipping 10 matching lines...) Expand all
520 builder.append(' '); 520 builder.append(' ');
521 addedSpace = true; 521 addedSpace = true;
522 } 522 }
523 builder.append(range.consumeIncludingWhitespace().value()); 523 builder.append(range.consumeIncludingWhitespace().value());
524 } 524 }
525 if (!addedSpace && isCSSWideKeyword(firstToken.id())) 525 if (!addedSpace && isCSSWideKeyword(firstToken.id()))
526 return String(); 526 return String();
527 return builder.toString(); 527 return builder.toString();
528 } 528 }
529 529
530 static RawPtr<CSSValue> consumeFamilyName(CSSParserTokenRange& range) 530 static CSSValue* consumeFamilyName(CSSParserTokenRange& range)
531 { 531 {
532 if (range.peek().type() == StringToken) 532 if (range.peek().type() == StringToken)
533 return cssValuePool().createFontFamilyValue(range.consumeIncludingWhites pace().value()); 533 return cssValuePool().createFontFamilyValue(range.consumeIncludingWhites pace().value());
534 if (range.peek().type() != IdentToken) 534 if (range.peek().type() != IdentToken)
535 return nullptr; 535 return nullptr;
536 String familyName = concatenateFamilyName(range); 536 String familyName = concatenateFamilyName(range);
537 if (familyName.isNull()) 537 if (familyName.isNull())
538 return nullptr; 538 return nullptr;
539 return cssValuePool().createFontFamilyValue(familyName); 539 return cssValuePool().createFontFamilyValue(familyName);
540 } 540 }
541 541
542 static RawPtr<CSSValue> consumeGenericFamily(CSSParserTokenRange& range) 542 static CSSValue* consumeGenericFamily(CSSParserTokenRange& range)
543 { 543 {
544 return consumeIdentRange(range, CSSValueSerif, CSSValueWebkitBody); 544 return consumeIdentRange(range, CSSValueSerif, CSSValueWebkitBody);
545 } 545 }
546 546
547 static RawPtr<CSSValueList> consumeFontFamily(CSSParserTokenRange& range) 547 static CSSValueList* consumeFontFamily(CSSParserTokenRange& range)
548 { 548 {
549 RawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); 549 CSSValueList* list = CSSValueList::createCommaSeparated();
550 do { 550 do {
551 RawPtr<CSSValue> parsedValue = nullptr; 551 CSSValue* parsedValue = consumeGenericFamily(range);
552 if ((parsedValue = consumeGenericFamily(range))) { 552 if (parsedValue) {
553 list->append(parsedValue);
554 } else if ((parsedValue = consumeFamilyName(range))) {
555 list->append(parsedValue); 553 list->append(parsedValue);
556 } else { 554 } else {
557 return nullptr; 555 parsedValue = consumeFamilyName(range);
556 if (parsedValue) {
557 list->append(parsedValue);
558 } else {
559 return nullptr;
560 }
558 } 561 }
559 } while (consumeCommaIncludingWhitespace(range)); 562 } while (consumeCommaIncludingWhitespace(range));
560 return list.release(); 563 return list;
561 } 564 }
562 565
563 static RawPtr<CSSValue> consumeSpacing(CSSParserTokenRange& range, CSSParserMode cssParserMode) 566 static CSSValue* consumeSpacing(CSSParserTokenRange& range, CSSParserMode cssPar serMode)
564 { 567 {
565 if (range.peek().id() == CSSValueNormal) 568 if (range.peek().id() == CSSValueNormal)
566 return consumeIdent(range); 569 return consumeIdent(range);
567 // TODO(timloh): Don't allow unitless values, and allow <percentage>s in wor d-spacing. 570 // TODO(timloh): Don't allow unitless values, and allow <percentage>s in wor d-spacing.
568 return consumeLength(range, cssParserMode, ValueRangeAll, UnitlessQuirk::All ow); 571 return consumeLength(range, cssParserMode, ValueRangeAll, UnitlessQuirk::All ow);
569 } 572 }
570 573
571 static RawPtr<CSSValue> consumeTabSize(CSSParserTokenRange& range, CSSParserMode cssParserMode) 574 static CSSValue* consumeTabSize(CSSParserTokenRange& range, CSSParserMode cssPar serMode)
572 { 575 {
573 RawPtr<CSSPrimitiveValue> parsedValue = consumeInteger(range, 0); 576 CSSPrimitiveValue* parsedValue = consumeInteger(range, 0);
574 if (parsedValue) 577 if (parsedValue)
575 return parsedValue; 578 return parsedValue;
576 return consumeLength(range, cssParserMode, ValueRangeNonNegative); 579 return consumeLength(range, cssParserMode, ValueRangeNonNegative);
577 } 580 }
578 581
579 static RawPtr<CSSValue> consumeFontSize(CSSParserTokenRange& range, CSSParserMod e cssParserMode, UnitlessQuirk unitless = UnitlessQuirk::Forbid) 582 static CSSValue* consumeFontSize(CSSParserTokenRange& range, CSSParserMode cssPa rserMode, UnitlessQuirk unitless = UnitlessQuirk::Forbid)
580 { 583 {
581 if (range.peek().id() >= CSSValueXxSmall && range.peek().id() <= CSSValueLar ger) 584 if (range.peek().id() >= CSSValueXxSmall && range.peek().id() <= CSSValueLar ger)
582 return consumeIdent(range); 585 return consumeIdent(range);
583 return consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative, u nitless); 586 return consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative, u nitless);
584 } 587 }
585 588
586 static RawPtr<CSSPrimitiveValue> consumeLineHeight(CSSParserTokenRange& range, C SSParserMode cssParserMode) 589 static CSSPrimitiveValue* consumeLineHeight(CSSParserTokenRange& range, CSSParse rMode cssParserMode)
587 { 590 {
588 if (range.peek().id() == CSSValueNormal) 591 if (range.peek().id() == CSSValueNormal)
589 return consumeIdent(range); 592 return consumeIdent(range);
590 593
591 RawPtr<CSSPrimitiveValue> lineHeight = consumeNumber(range, ValueRangeNonNeg ative); 594 CSSPrimitiveValue* lineHeight = consumeNumber(range, ValueRangeNonNegative);
592 if (lineHeight) 595 if (lineHeight)
593 return lineHeight; 596 return lineHeight;
594 return consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative); 597 return consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative);
595 } 598 }
596 599
597 static RawPtr<CSSValueList> consumeRotation(CSSParserTokenRange& range) 600 static CSSValueList* consumeRotation(CSSParserTokenRange& range)
598 { 601 {
599 ASSERT(RuntimeEnabledFeatures::cssIndependentTransformPropertiesEnabled()); 602 ASSERT(RuntimeEnabledFeatures::cssIndependentTransformPropertiesEnabled());
600 RawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 603 CSSValueList* list = CSSValueList::createSpaceSeparated();
601 604
602 RawPtr<CSSValue> rotation = consumeAngle(range); 605 CSSValue* rotation = consumeAngle(range);
603 if (!rotation) 606 if (!rotation)
604 return nullptr; 607 return nullptr;
605 list->append(rotation.release()); 608 list->append(rotation);
606 609
607 if (range.atEnd()) 610 if (range.atEnd())
608 return list.release(); 611 return list;
609 612
610 for (unsigned i = 0; i < 3; i++) { // 3 dimensions of rotation 613 for (unsigned i = 0; i < 3; i++) { // 3 dimensions of rotation
611 RawPtr<CSSValue> dimension = consumeNumber(range, ValueRangeAll); 614 CSSValue* dimension = consumeNumber(range, ValueRangeAll);
612 if (!dimension) 615 if (!dimension)
613 return nullptr; 616 return nullptr;
614 list->append(dimension.release()); 617 list->append(dimension);
615 } 618 }
616 619
617 return list.release(); 620 return list;
618 } 621 }
619 622
620 static RawPtr<CSSValueList> consumeScale(CSSParserTokenRange& range, CSSParserMo de cssParserMode) 623 static CSSValueList* consumeScale(CSSParserTokenRange& range, CSSParserMode cssP arserMode)
621 { 624 {
622 ASSERT(RuntimeEnabledFeatures::cssIndependentTransformPropertiesEnabled()); 625 ASSERT(RuntimeEnabledFeatures::cssIndependentTransformPropertiesEnabled());
623 626
624 RawPtr<CSSValue> scale = consumeNumber(range, ValueRangeAll); 627 CSSValue* scale = consumeNumber(range, ValueRangeAll);
625 if (!scale) 628 if (!scale)
626 return nullptr; 629 return nullptr;
627 RawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 630 CSSValueList* list = CSSValueList::createSpaceSeparated();
628 list->append(scale.release()); 631 list->append(scale);
629 if ((scale = consumeNumber(range, ValueRangeAll))) { 632 scale = consumeNumber(range, ValueRangeAll);
630 list->append(scale.release()); 633 if (scale) {
631 if ((scale = consumeNumber(range, ValueRangeAll))) 634 list->append(scale);
632 list->append(scale.release()); 635 scale = consumeNumber(range, ValueRangeAll);
636 if (scale)
637 list->append(scale);
633 } 638 }
634 639
635 return list.release(); 640 return list;
636 } 641 }
637 642
638 static RawPtr<CSSValueList> consumeTranslate(CSSParserTokenRange& range, CSSPars erMode cssParserMode) 643 static CSSValueList* consumeTranslate(CSSParserTokenRange& range, CSSParserMode cssParserMode)
639 { 644 {
640 ASSERT(RuntimeEnabledFeatures::cssIndependentTransformPropertiesEnabled()); 645 ASSERT(RuntimeEnabledFeatures::cssIndependentTransformPropertiesEnabled());
641 RawPtr<CSSValue> translate = consumeLengthOrPercent(range, cssParserMode, Va lueRangeAll); 646 CSSValue* translate = consumeLengthOrPercent(range, cssParserMode, ValueRang eAll);
642 if (!translate) 647 if (!translate)
643 return nullptr; 648 return nullptr;
644 RawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 649 CSSValueList* list = CSSValueList::createSpaceSeparated();
645 list->append(translate.release()); 650 list->append(translate);
646 if ((translate = consumeLengthOrPercent(range, cssParserMode, ValueRangeAll) )) { 651 translate = consumeLengthOrPercent(range, cssParserMode, ValueRangeAll);
647 list->append(translate.release()); 652 if (translate) {
648 if ((translate = consumeLength(range, cssParserMode, ValueRangeAll))) 653 list->append(translate);
649 list->append(translate.release()); 654 translate = consumeLength(range, cssParserMode, ValueRangeAll);
655 if (translate)
656 list->append(translate);
650 } 657 }
651 658
652 return list.release(); 659 return list;
653 } 660 }
654 661
655 static RawPtr<CSSValue> consumeCounter(CSSParserTokenRange& range, CSSParserMode cssParserMode, int defaultValue) 662 static CSSValue* consumeCounter(CSSParserTokenRange& range, CSSParserMode cssPar serMode, int defaultValue)
656 { 663 {
657 if (range.peek().id() == CSSValueNone) 664 if (range.peek().id() == CSSValueNone)
658 return consumeIdent(range); 665 return consumeIdent(range);
659 666
660 RawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 667 CSSValueList* list = CSSValueList::createSpaceSeparated();
661 do { 668 do {
662 RawPtr<CSSCustomIdentValue> counterName = consumeCustomIdent(range); 669 CSSCustomIdentValue* counterName = consumeCustomIdent(range);
663 if (!counterName) 670 if (!counterName)
664 return nullptr; 671 return nullptr;
665 int i = defaultValue; 672 int i = defaultValue;
666 if (RawPtr<CSSPrimitiveValue> counterValue = consumeInteger(range)) 673 if (CSSPrimitiveValue* counterValue = consumeInteger(range))
667 i = clampTo<int>(counterValue->getDoubleValue()); 674 i = clampTo<int>(counterValue->getDoubleValue());
668 list->append(CSSValuePair::create(counterName.release(), 675 list->append(CSSValuePair::create(counterName,
669 cssValuePool().createValue(i, CSSPrimitiveValue::UnitType::Integer), 676 cssValuePool().createValue(i, CSSPrimitiveValue::UnitType::Integer),
670 CSSValuePair::DropIdenticalValues)); 677 CSSValuePair::DropIdenticalValues));
671 } while (!range.atEnd()); 678 } while (!range.atEnd());
672 return list.release(); 679 return list;
673 } 680 }
674 681
675 static RawPtr<CSSValue> consumePageSize(CSSParserTokenRange& range) 682 static CSSValue* consumePageSize(CSSParserTokenRange& range)
676 { 683 {
677 return consumeIdent<CSSValueA3, CSSValueA4, CSSValueA5, CSSValueB4, CSSValue B5, CSSValueLedger, CSSValueLegal, CSSValueLetter>(range); 684 return consumeIdent<CSSValueA3, CSSValueA4, CSSValueA5, CSSValueB4, CSSValue B5, CSSValueLedger, CSSValueLegal, CSSValueLetter>(range);
678 } 685 }
679 686
680 static RawPtr<CSSValueList> consumeSize(CSSParserTokenRange& range, CSSParserMod e cssParserMode) 687 static CSSValueList* consumeSize(CSSParserTokenRange& range, CSSParserMode cssPa rserMode)
681 { 688 {
682 RawPtr<CSSValueList> result = CSSValueList::createSpaceSeparated(); 689 CSSValueList* result = CSSValueList::createSpaceSeparated();
683 690
684 if (range.peek().id() == CSSValueAuto) { 691 if (range.peek().id() == CSSValueAuto) {
685 result->append(consumeIdent(range)); 692 result->append(consumeIdent(range));
686 return result.release(); 693 return result;
687 } 694 }
688 695
689 if (RawPtr<CSSValue> width = consumeLength(range, cssParserMode, ValueRangeN onNegative)) { 696 if (CSSValue* width = consumeLength(range, cssParserMode, ValueRangeNonNegat ive)) {
690 RawPtr<CSSValue> height = consumeLength(range, cssParserMode, ValueRange NonNegative); 697 CSSValue* height = consumeLength(range, cssParserMode, ValueRangeNonNega tive);
691 result->append(width.release()); 698 result->append(width);
692 if (height) 699 if (height)
693 result->append(height.release()); 700 result->append(height);
694 return result.release(); 701 return result;
695 } 702 }
696 703
697 RawPtr<CSSValue> pageSize = consumePageSize(range); 704 CSSValue* pageSize = consumePageSize(range);
698 RawPtr<CSSValue> orientation = consumeIdent<CSSValuePortrait, CSSValueLandsc ape>(range); 705 CSSValue* orientation = consumeIdent<CSSValuePortrait, CSSValueLandscape>(ra nge);
699 if (!pageSize) 706 if (!pageSize)
700 pageSize = consumePageSize(range); 707 pageSize = consumePageSize(range);
701 708
702 if (!orientation && !pageSize) 709 if (!orientation && !pageSize)
703 return nullptr; 710 return nullptr;
704 if (pageSize) 711 if (pageSize)
705 result->append(pageSize.release()); 712 result->append(pageSize);
706 if (orientation) 713 if (orientation)
707 result->append(orientation.release()); 714 result->append(orientation);
708 return result.release(); 715 return result;
709 } 716 }
710 717
711 static RawPtr<CSSValue> consumeSnapHeight(CSSParserTokenRange& range, CSSParserM ode cssParserMode) 718 static CSSValue* consumeSnapHeight(CSSParserTokenRange& range, CSSParserMode css ParserMode)
712 { 719 {
713 RawPtr<CSSPrimitiveValue> unit = consumeLength(range, cssParserMode, ValueRa ngeNonNegative); 720 CSSPrimitiveValue* unit = consumeLength(range, cssParserMode, ValueRangeNonN egative);
714 if (!unit) 721 if (!unit)
715 return nullptr; 722 return nullptr;
716 RawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 723 CSSValueList* list = CSSValueList::createSpaceSeparated();
717 list->append(unit.release()); 724 list->append(unit);
718 725
719 if (RawPtr<CSSPrimitiveValue> position = consumePositiveInteger(range)) { 726 if (CSSPrimitiveValue* position = consumePositiveInteger(range)) {
720 if (position->getIntValue() > 100) 727 if (position->getIntValue() > 100)
721 return nullptr; 728 return nullptr;
722 list->append(position.release()); 729 list->append(position);
723 } 730 }
724 731
725 return list.release(); 732 return list;
726 } 733 }
727 734
728 static RawPtr<CSSValue> consumeTextIndent(CSSParserTokenRange& range, CSSParserM ode cssParserMode) 735 static CSSValue* consumeTextIndent(CSSParserTokenRange& range, CSSParserMode css ParserMode)
729 { 736 {
730 // [ <length> | <percentage> ] && hanging? && each-line? 737 // [ <length> | <percentage> ] && hanging? && each-line?
731 // Keywords only allowed when css3Text is enabled. 738 // Keywords only allowed when css3Text is enabled.
732 RawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 739 CSSValueList* list = CSSValueList::createSpaceSeparated();
733 740
734 bool hasLengthOrPercentage = false; 741 bool hasLengthOrPercentage = false;
735 bool hasEachLine = false; 742 bool hasEachLine = false;
736 bool hasHanging = false; 743 bool hasHanging = false;
737 744
738 do { 745 do {
739 if (!hasLengthOrPercentage) { 746 if (!hasLengthOrPercentage) {
740 if (RawPtr<CSSValue> textIndent = consumeLengthOrPercent(range, cssP arserMode, ValueRangeAll, UnitlessQuirk::Allow)) { 747 if (CSSValue* textIndent = consumeLengthOrPercent(range, cssParserMo de, ValueRangeAll, UnitlessQuirk::Allow)) {
741 list->append(textIndent.release()); 748 list->append(textIndent);
742 hasLengthOrPercentage = true; 749 hasLengthOrPercentage = true;
743 continue; 750 continue;
744 } 751 }
745 } 752 }
746 753
747 if (RuntimeEnabledFeatures::css3TextEnabled()) { 754 if (RuntimeEnabledFeatures::css3TextEnabled()) {
748 CSSValueID id = range.peek().id(); 755 CSSValueID id = range.peek().id();
749 if (!hasEachLine && id == CSSValueEachLine) { 756 if (!hasEachLine && id == CSSValueEachLine) {
750 list->append(consumeIdent(range)); 757 list->append(consumeIdent(range));
751 hasEachLine = true; 758 hasEachLine = true;
752 continue; 759 continue;
753 } 760 }
754 if (!hasHanging && id == CSSValueHanging) { 761 if (!hasHanging && id == CSSValueHanging) {
755 list->append(consumeIdent(range)); 762 list->append(consumeIdent(range));
756 hasHanging = true; 763 hasHanging = true;
757 continue; 764 continue;
758 } 765 }
759 } 766 }
760 return nullptr; 767 return nullptr;
761 } while (!range.atEnd()); 768 } while (!range.atEnd());
762 769
763 if (!hasLengthOrPercentage) 770 if (!hasLengthOrPercentage)
764 return nullptr; 771 return nullptr;
765 772
766 return list.release(); 773 return list;
767 } 774 }
768 775
769 static bool validWidthOrHeightKeyword(CSSValueID id, const CSSParserContext& con text) 776 static bool validWidthOrHeightKeyword(CSSValueID id, const CSSParserContext& con text)
770 { 777 {
771 if (id == CSSValueWebkitMinContent || id == CSSValueWebkitMaxContent || id = = CSSValueWebkitFillAvailable || id == CSSValueWebkitFitContent 778 if (id == CSSValueWebkitMinContent || id == CSSValueWebkitMaxContent || id = = CSSValueWebkitFillAvailable || id == CSSValueWebkitFitContent
772 || id == CSSValueMinContent || id == CSSValueMaxContent || id == CSSValu eFitContent) { 779 || id == CSSValueMinContent || id == CSSValueMaxContent || id == CSSValu eFitContent) {
773 if (context.useCounter()) { 780 if (context.useCounter()) {
774 switch (id) { 781 switch (id) {
775 case CSSValueWebkitMinContent: 782 case CSSValueWebkitMinContent:
776 context.useCounter()->count(UseCounter::CSSValuePrefixedMinConte nt); 783 context.useCounter()->count(UseCounter::CSSValuePrefixedMinConte nt);
777 break; 784 break;
778 case CSSValueWebkitMaxContent: 785 case CSSValueWebkitMaxContent:
779 context.useCounter()->count(UseCounter::CSSValuePrefixedMaxConte nt); 786 context.useCounter()->count(UseCounter::CSSValuePrefixedMaxConte nt);
780 break; 787 break;
781 case CSSValueWebkitFillAvailable: 788 case CSSValueWebkitFillAvailable:
782 context.useCounter()->count(UseCounter::CSSValuePrefixedFillAvai lable); 789 context.useCounter()->count(UseCounter::CSSValuePrefixedFillAvai lable);
783 break; 790 break;
784 case CSSValueWebkitFitContent: 791 case CSSValueWebkitFitContent:
785 context.useCounter()->count(UseCounter::CSSValuePrefixedFitConte nt); 792 context.useCounter()->count(UseCounter::CSSValuePrefixedFitConte nt);
786 break; 793 break;
787 default: 794 default:
788 break; 795 break;
789 } 796 }
790 } 797 }
791 return true; 798 return true;
792 } 799 }
793 return false; 800 return false;
794 } 801 }
795 802
796 static RawPtr<CSSValue> consumeMaxWidthOrHeight(CSSParserTokenRange& range, cons t CSSParserContext& context, UnitlessQuirk unitless = UnitlessQuirk::Forbid) 803 static CSSValue* consumeMaxWidthOrHeight(CSSParserTokenRange& range, const CSSPa rserContext& context, UnitlessQuirk unitless = UnitlessQuirk::Forbid)
797 { 804 {
798 if (range.peek().id() == CSSValueNone || validWidthOrHeightKeyword(range.pee k().id(), context)) 805 if (range.peek().id() == CSSValueNone || validWidthOrHeightKeyword(range.pee k().id(), context))
799 return consumeIdent(range); 806 return consumeIdent(range);
800 return consumeLengthOrPercent(range, context.mode(), ValueRangeNonNegative, unitless); 807 return consumeLengthOrPercent(range, context.mode(), ValueRangeNonNegative, unitless);
801 } 808 }
802 809
803 static RawPtr<CSSValue> consumeWidthOrHeight(CSSParserTokenRange& range, const C SSParserContext& context, UnitlessQuirk unitless = UnitlessQuirk::Forbid) 810 static CSSValue* consumeWidthOrHeight(CSSParserTokenRange& range, const CSSParse rContext& context, UnitlessQuirk unitless = UnitlessQuirk::Forbid)
804 { 811 {
805 if (range.peek().id() == CSSValueAuto || validWidthOrHeightKeyword(range.pee k().id(), context)) 812 if (range.peek().id() == CSSValueAuto || validWidthOrHeightKeyword(range.pee k().id(), context))
806 return consumeIdent(range); 813 return consumeIdent(range);
807 return consumeLengthOrPercent(range, context.mode(), ValueRangeNonNegative, unitless); 814 return consumeLengthOrPercent(range, context.mode(), ValueRangeNonNegative, unitless);
808 } 815 }
809 816
810 static RawPtr<CSSValue> consumeMarginOrOffset(CSSParserTokenRange& range, CSSPar serMode cssParserMode, UnitlessQuirk unitless) 817 static CSSValue* consumeMarginOrOffset(CSSParserTokenRange& range, CSSParserMode cssParserMode, UnitlessQuirk unitless)
811 { 818 {
812 if (range.peek().id() == CSSValueAuto) 819 if (range.peek().id() == CSSValueAuto)
813 return consumeIdent(range); 820 return consumeIdent(range);
814 return consumeLengthOrPercent(range, cssParserMode, ValueRangeAll, unitless) ; 821 return consumeLengthOrPercent(range, cssParserMode, ValueRangeAll, unitless) ;
815 } 822 }
816 823
817 static RawPtr<CSSPrimitiveValue> consumeClipComponent(CSSParserTokenRange& range , CSSParserMode cssParserMode) 824 static CSSPrimitiveValue* consumeClipComponent(CSSParserTokenRange& range, CSSPa rserMode cssParserMode)
818 { 825 {
819 if (range.peek().id() == CSSValueAuto) 826 if (range.peek().id() == CSSValueAuto)
820 return consumeIdent(range); 827 return consumeIdent(range);
821 return consumeLength(range, cssParserMode, ValueRangeAll, UnitlessQuirk::All ow); 828 return consumeLength(range, cssParserMode, ValueRangeAll, UnitlessQuirk::All ow);
822 } 829 }
823 830
824 static RawPtr<CSSValue> consumeClip(CSSParserTokenRange& range, CSSParserMode cs sParserMode) 831 static CSSValue* consumeClip(CSSParserTokenRange& range, CSSParserMode cssParser Mode)
825 { 832 {
826 if (range.peek().id() == CSSValueAuto) 833 if (range.peek().id() == CSSValueAuto)
827 return consumeIdent(range); 834 return consumeIdent(range);
828 835
829 if (range.peek().functionId() != CSSValueRect) 836 if (range.peek().functionId() != CSSValueRect)
830 return nullptr; 837 return nullptr;
831 838
832 CSSParserTokenRange args = consumeFunction(range); 839 CSSParserTokenRange args = consumeFunction(range);
833 // rect(t, r, b, l) || rect(t r b l) 840 // rect(t, r, b, l) || rect(t r b l)
834 RawPtr<CSSPrimitiveValue> top = consumeClipComponent(args, cssParserMode); 841 CSSPrimitiveValue* top = consumeClipComponent(args, cssParserMode);
835 if (!top) 842 if (!top)
836 return nullptr; 843 return nullptr;
837 bool needsComma = consumeCommaIncludingWhitespace(args); 844 bool needsComma = consumeCommaIncludingWhitespace(args);
838 RawPtr<CSSPrimitiveValue> right = consumeClipComponent(args, cssParserMode); 845 CSSPrimitiveValue* right = consumeClipComponent(args, cssParserMode);
839 if (!right || (needsComma && !consumeCommaIncludingWhitespace(args))) 846 if (!right || (needsComma && !consumeCommaIncludingWhitespace(args)))
840 return nullptr; 847 return nullptr;
841 RawPtr<CSSPrimitiveValue> bottom = consumeClipComponent(args, cssParserMode) ; 848 CSSPrimitiveValue* bottom = consumeClipComponent(args, cssParserMode);
842 if (!bottom || (needsComma && !consumeCommaIncludingWhitespace(args))) 849 if (!bottom || (needsComma && !consumeCommaIncludingWhitespace(args)))
843 return nullptr; 850 return nullptr;
844 RawPtr<CSSPrimitiveValue> left = consumeClipComponent(args, cssParserMode); 851 CSSPrimitiveValue* left = consumeClipComponent(args, cssParserMode);
845 if (!left || !args.atEnd()) 852 if (!left || !args.atEnd())
846 return nullptr; 853 return nullptr;
847 return CSSQuadValue::create(top.release(), right.release(), bottom.release() , left.release(), CSSQuadValue::SerializeAsRect); 854 return CSSQuadValue::create(top, right, bottom, left, CSSQuadValue::Serializ eAsRect);
848 } 855 }
849 856
850 static bool consumePan(CSSParserTokenRange& range, RawPtr<CSSValue>& panX, RawPt r<CSSValue>& panY) 857 static bool consumePan(CSSParserTokenRange& range, CSSValue*& panX, CSSValue*& p anY)
851 { 858 {
852 CSSValueID id = range.peek().id(); 859 CSSValueID id = range.peek().id();
853 if ((id == CSSValuePanX || id == CSSValuePanRight || id == CSSValuePanLeft) && !panX) { 860 if ((id == CSSValuePanX || id == CSSValuePanRight || id == CSSValuePanLeft) && !panX) {
854 if (id != CSSValuePanX && !RuntimeEnabledFeatures::cssTouchActionPanDire ctionsEnabled()) 861 if (id != CSSValuePanX && !RuntimeEnabledFeatures::cssTouchActionPanDire ctionsEnabled())
855 return false; 862 return false;
856 panX = consumeIdent(range); 863 panX = consumeIdent(range);
857 } else if ((id == CSSValuePanY || id == CSSValuePanDown || id == CSSValuePan Up) && !panY) { 864 } else if ((id == CSSValuePanY || id == CSSValuePanDown || id == CSSValuePan Up) && !panY) {
858 if (id != CSSValuePanY && !RuntimeEnabledFeatures::cssTouchActionPanDire ctionsEnabled()) 865 if (id != CSSValuePanY && !RuntimeEnabledFeatures::cssTouchActionPanDire ctionsEnabled())
859 return false; 866 return false;
860 panY = consumeIdent(range); 867 panY = consumeIdent(range);
861 } else { 868 } else {
862 return false; 869 return false;
863 } 870 }
864 return true; 871 return true;
865 } 872 }
866 873
867 static RawPtr<CSSValue> consumeTouchAction(CSSParserTokenRange& range) 874 static CSSValue* consumeTouchAction(CSSParserTokenRange& range)
868 { 875 {
869 RawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 876 CSSValueList* list = CSSValueList::createSpaceSeparated();
870 CSSValueID id = range.peek().id(); 877 CSSValueID id = range.peek().id();
871 if (id == CSSValueAuto || id == CSSValueNone || id == CSSValueManipulation) { 878 if (id == CSSValueAuto || id == CSSValueNone || id == CSSValueManipulation) {
872 list->append(consumeIdent(range)); 879 list->append(consumeIdent(range));
873 return list.release(); 880 return list;
874 } 881 }
875 882
876 RawPtr<CSSValue> panX = nullptr; 883 CSSValue* panX = nullptr;
877 RawPtr<CSSValue> panY = nullptr; 884 CSSValue* panY = nullptr;
878 if (!consumePan(range, panX, panY)) 885 if (!consumePan(range, panX, panY))
879 return nullptr; 886 return nullptr;
880 if (!range.atEnd() && !consumePan(range, panX, panY)) 887 if (!range.atEnd() && !consumePan(range, panX, panY))
881 return nullptr; 888 return nullptr;
882 889
883 if (panX) 890 if (panX)
884 list->append(panX.release()); 891 list->append(panX);
885 if (panY) 892 if (panY)
886 list->append(panY.release()); 893 list->append(panY);
887 return list.release(); 894 return list;
888 } 895 }
889 896
890 static RawPtr<CSSPrimitiveValue> consumeLineClamp(CSSParserTokenRange& range) 897 static CSSPrimitiveValue* consumeLineClamp(CSSParserTokenRange& range)
891 { 898 {
892 if (range.peek().type() != PercentageToken && range.peek().type() != NumberT oken) 899 if (range.peek().type() != PercentageToken && range.peek().type() != NumberT oken)
893 return nullptr; 900 return nullptr;
894 RawPtr<CSSPrimitiveValue> clampValue = consumePercent(range, ValueRangeNonNe gative); 901 CSSPrimitiveValue* clampValue = consumePercent(range, ValueRangeNonNegative) ;
895 if (clampValue) 902 if (clampValue)
896 return clampValue; 903 return clampValue;
897 // When specifying number of lines, don't allow 0 as a valid value. 904 // When specifying number of lines, don't allow 0 as a valid value.
898 return consumePositiveInteger(range); 905 return consumePositiveInteger(range);
899 } 906 }
900 907
901 static RawPtr<CSSValue> consumeLocale(CSSParserTokenRange& range) 908 static CSSValue* consumeLocale(CSSParserTokenRange& range)
902 { 909 {
903 if (range.peek().id() == CSSValueAuto) 910 if (range.peek().id() == CSSValueAuto)
904 return consumeIdent(range); 911 return consumeIdent(range);
905 return consumeString(range); 912 return consumeString(range);
906 } 913 }
907 914
908 static RawPtr<CSSValue> consumeColumnWidth(CSSParserTokenRange& range) 915 static CSSValue* consumeColumnWidth(CSSParserTokenRange& range)
909 { 916 {
910 if (range.peek().id() == CSSValueAuto) 917 if (range.peek().id() == CSSValueAuto)
911 return consumeIdent(range); 918 return consumeIdent(range);
912 // Always parse lengths in strict mode here, since it would be ambiguous oth erwise when used in 919 // Always parse lengths in strict mode here, since it would be ambiguous oth erwise when used in
913 // the 'columns' shorthand property. 920 // the 'columns' shorthand property.
914 RawPtr<CSSPrimitiveValue> columnWidth = consumeLength(range, HTMLStandardMod e, ValueRangeNonNegative); 921 CSSPrimitiveValue* columnWidth = consumeLength(range, HTMLStandardMode, Valu eRangeNonNegative);
915 if (!columnWidth || (!columnWidth->isCalculated() && columnWidth->getDoubleV alue() == 0)) 922 if (!columnWidth || (!columnWidth->isCalculated() && columnWidth->getDoubleV alue() == 0))
916 return nullptr; 923 return nullptr;
917 return columnWidth.release(); 924 return columnWidth;
918 } 925 }
919 926
920 static RawPtr<CSSValue> consumeColumnCount(CSSParserTokenRange& range) 927 static CSSValue* consumeColumnCount(CSSParserTokenRange& range)
921 { 928 {
922 if (range.peek().id() == CSSValueAuto) 929 if (range.peek().id() == CSSValueAuto)
923 return consumeIdent(range); 930 return consumeIdent(range);
924 return consumePositiveInteger(range); 931 return consumePositiveInteger(range);
925 } 932 }
926 933
927 static RawPtr<CSSValue> consumeColumnGap(CSSParserTokenRange& range, CSSParserMo de cssParserMode) 934 static CSSValue* consumeColumnGap(CSSParserTokenRange& range, CSSParserMode cssP arserMode)
928 { 935 {
929 if (range.peek().id() == CSSValueNormal) 936 if (range.peek().id() == CSSValueNormal)
930 return consumeIdent(range); 937 return consumeIdent(range);
931 return consumeLength(range, cssParserMode, ValueRangeNonNegative); 938 return consumeLength(range, cssParserMode, ValueRangeNonNegative);
932 } 939 }
933 940
934 static RawPtr<CSSValue> consumeColumnSpan(CSSParserTokenRange& range, CSSParserM ode cssParserMode) 941 static CSSValue* consumeColumnSpan(CSSParserTokenRange& range, CSSParserMode css ParserMode)
935 { 942 {
936 return consumeIdent<CSSValueAll, CSSValueNone>(range); 943 return consumeIdent<CSSValueAll, CSSValueNone>(range);
937 } 944 }
938 945
939 static RawPtr<CSSValue> consumeZoom(CSSParserTokenRange& range, const CSSParserC ontext& context) 946 static CSSValue* consumeZoom(CSSParserTokenRange& range, const CSSParserContext& context)
940 { 947 {
941 const CSSParserToken& token = range.peek(); 948 const CSSParserToken& token = range.peek();
942 RawPtr<CSSPrimitiveValue> zoom = nullptr; 949 CSSPrimitiveValue* zoom = nullptr;
943 if (token.type() == IdentToken) { 950 if (token.type() == IdentToken) {
944 zoom = consumeIdent<CSSValueNormal, CSSValueReset, CSSValueDocument>(ran ge); 951 zoom = consumeIdent<CSSValueNormal, CSSValueReset, CSSValueDocument>(ran ge);
945 } else { 952 } else {
946 zoom = consumePercent(range, ValueRangeNonNegative); 953 zoom = consumePercent(range, ValueRangeNonNegative);
947 if (!zoom) 954 if (!zoom)
948 zoom = consumeNumber(range, ValueRangeNonNegative); 955 zoom = consumeNumber(range, ValueRangeNonNegative);
949 } 956 }
950 if (zoom && context.useCounter() 957 if (zoom && context.useCounter()
951 && !(token.id() == CSSValueNormal 958 && !(token.id() == CSSValueNormal
952 || (token.type() == NumberToken && zoom->getDoubleValue() == 1) 959 || (token.type() == NumberToken && zoom->getDoubleValue() == 1)
953 || (token.type() == PercentageToken && zoom->getDoubleValue() == 100 ))) 960 || (token.type() == PercentageToken && zoom->getDoubleValue() == 100 )))
954 context.useCounter()->count(UseCounter::CSSZoomNotEqualToOne); 961 context.useCounter()->count(UseCounter::CSSZoomNotEqualToOne);
955 return zoom.release(); 962 return zoom;
956 } 963 }
957 964
958 static RawPtr<CSSValue> consumeAnimationIterationCount(CSSParserTokenRange& rang e) 965 static CSSValue* consumeAnimationIterationCount(CSSParserTokenRange& range)
959 { 966 {
960 if (range.peek().id() == CSSValueInfinite) 967 if (range.peek().id() == CSSValueInfinite)
961 return consumeIdent(range); 968 return consumeIdent(range);
962 return consumeNumber(range, ValueRangeNonNegative); 969 return consumeNumber(range, ValueRangeNonNegative);
963 } 970 }
964 971
965 static RawPtr<CSSValue> consumeAnimationName(CSSParserTokenRange& range, const C SSParserContext& context, bool allowQuotedName) 972 static CSSValue* consumeAnimationName(CSSParserTokenRange& range, const CSSParse rContext& context, bool allowQuotedName)
966 { 973 {
967 if (range.peek().id() == CSSValueNone) 974 if (range.peek().id() == CSSValueNone)
968 return consumeIdent(range); 975 return consumeIdent(range);
969 976
970 if (allowQuotedName && range.peek().type() == StringToken) { 977 if (allowQuotedName && range.peek().type() == StringToken) {
971 // Legacy support for strings in prefixed animations. 978 // Legacy support for strings in prefixed animations.
972 if (context.useCounter()) 979 if (context.useCounter())
973 context.useCounter()->count(UseCounter::QuotedAnimationName); 980 context.useCounter()->count(UseCounter::QuotedAnimationName);
974 981
975 const CSSParserToken& token = range.consumeIncludingWhitespace(); 982 const CSSParserToken& token = range.consumeIncludingWhitespace();
976 if (token.valueEqualsIgnoringASCIICase("none")) 983 if (token.valueEqualsIgnoringASCIICase("none"))
977 return cssValuePool().createIdentifierValue(CSSValueNone); 984 return cssValuePool().createIdentifierValue(CSSValueNone);
978 return CSSCustomIdentValue::create(token.value()); 985 return CSSCustomIdentValue::create(token.value());
979 } 986 }
980 987
981 return consumeCustomIdent(range); 988 return consumeCustomIdent(range);
982 } 989 }
983 990
984 static RawPtr<CSSValue> consumeTransitionProperty(CSSParserTokenRange& range) 991 static CSSValue* consumeTransitionProperty(CSSParserTokenRange& range)
985 { 992 {
986 const CSSParserToken& token = range.peek(); 993 const CSSParserToken& token = range.peek();
987 if (token.type() != IdentToken) 994 if (token.type() != IdentToken)
988 return nullptr; 995 return nullptr;
989 if (token.id() == CSSValueNone) 996 if (token.id() == CSSValueNone)
990 return consumeIdent(range); 997 return consumeIdent(range);
991 998
992 if (CSSPropertyID property = token.parseAsUnresolvedCSSPropertyID()) { 999 if (CSSPropertyID property = token.parseAsUnresolvedCSSPropertyID()) {
993 ASSERT(CSSPropertyMetadata::isEnabledProperty(property)); 1000 ASSERT(CSSPropertyMetadata::isEnabledProperty(property));
994 range.consumeIncludingWhitespace(); 1001 range.consumeIncludingWhitespace();
995 return cssValuePool().createIdentifierValue(property); 1002 return cssValuePool().createIdentifierValue(property);
996 } 1003 }
997 return consumeCustomIdent(range); 1004 return consumeCustomIdent(range);
998 } 1005 }
999 1006
1000 static RawPtr<CSSValue> consumeSteps(CSSParserTokenRange& range) 1007 static CSSValue* consumeSteps(CSSParserTokenRange& range)
1001 { 1008 {
1002 ASSERT(range.peek().functionId() == CSSValueSteps); 1009 ASSERT(range.peek().functionId() == CSSValueSteps);
1003 CSSParserTokenRange rangeCopy = range; 1010 CSSParserTokenRange rangeCopy = range;
1004 CSSParserTokenRange args = consumeFunction(rangeCopy); 1011 CSSParserTokenRange args = consumeFunction(rangeCopy);
1005 1012
1006 RawPtr<CSSPrimitiveValue> steps = consumePositiveInteger(args); 1013 CSSPrimitiveValue* steps = consumePositiveInteger(args);
1007 if (!steps) 1014 if (!steps)
1008 return nullptr; 1015 return nullptr;
1009 1016
1010 StepsTimingFunction::StepAtPosition position = StepsTimingFunction::End; 1017 StepsTimingFunction::StepAtPosition position = StepsTimingFunction::End;
1011 if (consumeCommaIncludingWhitespace(args)) { 1018 if (consumeCommaIncludingWhitespace(args)) {
1012 switch (args.consumeIncludingWhitespace().id()) { 1019 switch (args.consumeIncludingWhitespace().id()) {
1013 case CSSValueMiddle: 1020 case CSSValueMiddle:
1014 if (!RuntimeEnabledFeatures::webAnimationsAPIEnabled()) 1021 if (!RuntimeEnabledFeatures::webAnimationsAPIEnabled())
1015 return nullptr; 1022 return nullptr;
1016 position = StepsTimingFunction::Middle; 1023 position = StepsTimingFunction::Middle;
1017 break; 1024 break;
1018 case CSSValueStart: 1025 case CSSValueStart:
1019 position = StepsTimingFunction::Start; 1026 position = StepsTimingFunction::Start;
1020 break; 1027 break;
1021 case CSSValueEnd: 1028 case CSSValueEnd:
1022 position = StepsTimingFunction::End; 1029 position = StepsTimingFunction::End;
1023 break; 1030 break;
1024 default: 1031 default:
1025 return nullptr; 1032 return nullptr;
1026 } 1033 }
1027 } 1034 }
1028 1035
1029 if (!args.atEnd()) 1036 if (!args.atEnd())
1030 return nullptr; 1037 return nullptr;
1031 1038
1032 range = rangeCopy; 1039 range = rangeCopy;
1033 return CSSStepsTimingFunctionValue::create(steps->getIntValue(), position); 1040 return CSSStepsTimingFunctionValue::create(steps->getIntValue(), position);
1034 } 1041 }
1035 1042
1036 static RawPtr<CSSValue> consumeCubicBezier(CSSParserTokenRange& range) 1043 static CSSValue* consumeCubicBezier(CSSParserTokenRange& range)
1037 { 1044 {
1038 ASSERT(range.peek().functionId() == CSSValueCubicBezier); 1045 ASSERT(range.peek().functionId() == CSSValueCubicBezier);
1039 CSSParserTokenRange rangeCopy = range; 1046 CSSParserTokenRange rangeCopy = range;
1040 CSSParserTokenRange args = consumeFunction(rangeCopy); 1047 CSSParserTokenRange args = consumeFunction(rangeCopy);
1041 1048
1042 double x1, y1, x2, y2; 1049 double x1, y1, x2, y2;
1043 if (consumeNumberRaw(args, x1) 1050 if (consumeNumberRaw(args, x1)
1044 && x1 >= 0 && x1 <= 1 1051 && x1 >= 0 && x1 <= 1
1045 && consumeCommaIncludingWhitespace(args) 1052 && consumeCommaIncludingWhitespace(args)
1046 && consumeNumberRaw(args, y1) 1053 && consumeNumberRaw(args, y1)
1047 && consumeCommaIncludingWhitespace(args) 1054 && consumeCommaIncludingWhitespace(args)
1048 && consumeNumberRaw(args, x2) 1055 && consumeNumberRaw(args, x2)
1049 && x2 >= 0 && x2 <= 1 1056 && x2 >= 0 && x2 <= 1
1050 && consumeCommaIncludingWhitespace(args) 1057 && consumeCommaIncludingWhitespace(args)
1051 && consumeNumberRaw(args, y2) 1058 && consumeNumberRaw(args, y2)
1052 && args.atEnd()) { 1059 && args.atEnd()) {
1053 range = rangeCopy; 1060 range = rangeCopy;
1054 return CSSCubicBezierTimingFunctionValue::create(x1, y1, x2, y2); 1061 return CSSCubicBezierTimingFunctionValue::create(x1, y1, x2, y2);
1055 } 1062 }
1056 1063
1057 return nullptr; 1064 return nullptr;
1058 } 1065 }
1059 1066
1060 static RawPtr<CSSValue> consumeAnimationTimingFunction(CSSParserTokenRange& rang e) 1067 static CSSValue* consumeAnimationTimingFunction(CSSParserTokenRange& range)
1061 { 1068 {
1062 CSSValueID id = range.peek().id(); 1069 CSSValueID id = range.peek().id();
1063 if (id == CSSValueEase || id == CSSValueLinear || id == CSSValueEaseIn 1070 if (id == CSSValueEase || id == CSSValueLinear || id == CSSValueEaseIn
1064 || id == CSSValueEaseOut || id == CSSValueEaseInOut || id == CSSValueSte pStart 1071 || id == CSSValueEaseOut || id == CSSValueEaseInOut || id == CSSValueSte pStart
1065 || id == CSSValueStepEnd || id == CSSValueStepMiddle) 1072 || id == CSSValueStepEnd || id == CSSValueStepMiddle)
1066 return consumeIdent(range); 1073 return consumeIdent(range);
1067 1074
1068 CSSValueID function = range.peek().functionId(); 1075 CSSValueID function = range.peek().functionId();
1069 if (function == CSSValueSteps) 1076 if (function == CSSValueSteps)
1070 return consumeSteps(range); 1077 return consumeSteps(range);
1071 if (function == CSSValueCubicBezier) 1078 if (function == CSSValueCubicBezier)
1072 return consumeCubicBezier(range); 1079 return consumeCubicBezier(range);
1073 return nullptr; 1080 return nullptr;
1074 } 1081 }
1075 1082
1076 static RawPtr<CSSValue> consumeAnimationValue(CSSPropertyID property, CSSParserT okenRange& range, const CSSParserContext& context, bool useLegacyParsing) 1083 static CSSValue* consumeAnimationValue(CSSPropertyID property, CSSParserTokenRan ge& range, const CSSParserContext& context, bool useLegacyParsing)
1077 { 1084 {
1078 switch (property) { 1085 switch (property) {
1079 case CSSPropertyAnimationDelay: 1086 case CSSPropertyAnimationDelay:
1080 case CSSPropertyTransitionDelay: 1087 case CSSPropertyTransitionDelay:
1081 return consumeTime(range, ValueRangeAll); 1088 return consumeTime(range, ValueRangeAll);
1082 case CSSPropertyAnimationDirection: 1089 case CSSPropertyAnimationDirection:
1083 return consumeIdent<CSSValueNormal, CSSValueAlternate, CSSValueReverse, CSSValueAlternateReverse>(range); 1090 return consumeIdent<CSSValueNormal, CSSValueAlternate, CSSValueReverse, CSSValueAlternateReverse>(range);
1084 case CSSPropertyAnimationDuration: 1091 case CSSPropertyAnimationDuration:
1085 case CSSPropertyTransitionDuration: 1092 case CSSPropertyTransitionDuration:
1086 return consumeTime(range, ValueRangeNonNegative); 1093 return consumeTime(range, ValueRangeNonNegative);
(...skipping 21 matching lines...) Expand all
1108 if (property != CSSPropertyTransitionProperty || valueList.length() < 2) 1115 if (property != CSSPropertyTransitionProperty || valueList.length() < 2)
1109 return true; 1116 return true;
1110 for (auto& value : valueList) { 1117 for (auto& value : valueList) {
1111 if (value->isPrimitiveValue() && toCSSPrimitiveValue(*value).isValueID() 1118 if (value->isPrimitiveValue() && toCSSPrimitiveValue(*value).isValueID()
1112 && toCSSPrimitiveValue(*value).getValueID() == CSSValueNone) 1119 && toCSSPrimitiveValue(*value).getValueID() == CSSValueNone)
1113 return false; 1120 return false;
1114 } 1121 }
1115 return true; 1122 return true;
1116 } 1123 }
1117 1124
1118 static RawPtr<CSSValueList> consumeAnimationPropertyList(CSSPropertyID property, CSSParserTokenRange& range, const CSSParserContext& context, bool useLegacyPars ing) 1125 static CSSValueList* consumeAnimationPropertyList(CSSPropertyID property, CSSPar serTokenRange& range, const CSSParserContext& context, bool useLegacyParsing)
1119 { 1126 {
1120 RawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); 1127 CSSValueList* list = CSSValueList::createCommaSeparated();
1121 do { 1128 do {
1122 RawPtr<CSSValue> value = consumeAnimationValue(property, range, context, useLegacyParsing); 1129 CSSValue* value = consumeAnimationValue(property, range, context, useLeg acyParsing);
1123 if (!value) 1130 if (!value)
1124 return nullptr; 1131 return nullptr;
1125 list->append(value.release()); 1132 list->append(value);
1126 } while (consumeCommaIncludingWhitespace(range)); 1133 } while (consumeCommaIncludingWhitespace(range));
1127 if (!isValidAnimationPropertyList(property, *list)) 1134 if (!isValidAnimationPropertyList(property, *list))
1128 return nullptr; 1135 return nullptr;
1129 ASSERT(list->length()); 1136 ASSERT(list->length());
1130 return list.release(); 1137 return list;
1131 } 1138 }
1132 1139
1133 bool CSSPropertyParser::consumeAnimationShorthand(const StylePropertyShorthand& shorthand, bool useLegacyParsing, bool important) 1140 bool CSSPropertyParser::consumeAnimationShorthand(const StylePropertyShorthand& shorthand, bool useLegacyParsing, bool important)
1134 { 1141 {
1135 const unsigned longhandCount = shorthand.length(); 1142 const unsigned longhandCount = shorthand.length();
1136 RawPtr<CSSValueList> longhands[8]; 1143 CSSValueList* longhands[8];
1137 ASSERT(longhandCount <= 8); 1144 ASSERT(longhandCount <= 8);
1138 for (size_t i = 0; i < longhandCount; ++i) 1145 for (size_t i = 0; i < longhandCount; ++i)
1139 longhands[i] = CSSValueList::createCommaSeparated(); 1146 longhands[i] = CSSValueList::createCommaSeparated();
1140 1147
1141 do { 1148 do {
1142 bool parsedLonghand[8] = { false }; 1149 bool parsedLonghand[8] = { false };
1143 do { 1150 do {
1144 bool foundProperty = false; 1151 bool foundProperty = false;
1145 for (size_t i = 0; i < longhandCount; ++i) { 1152 for (size_t i = 0; i < longhandCount; ++i) {
1146 if (parsedLonghand[i]) 1153 if (parsedLonghand[i])
1147 continue; 1154 continue;
1148 1155
1149 if (RawPtr<CSSValue> value = consumeAnimationValue(shorthand.pro perties()[i], m_range, m_context, useLegacyParsing)) { 1156 if (CSSValue* value = consumeAnimationValue(shorthand.properties ()[i], m_range, m_context, useLegacyParsing)) {
1150 parsedLonghand[i] = true; 1157 parsedLonghand[i] = true;
1151 foundProperty = true; 1158 foundProperty = true;
1152 longhands[i]->append(value.release()); 1159 longhands[i]->append(value);
1153 break; 1160 break;
1154 } 1161 }
1155 } 1162 }
1156 if (!foundProperty) 1163 if (!foundProperty)
1157 return false; 1164 return false;
1158 } while (!m_range.atEnd() && m_range.peek().type() != CommaToken); 1165 } while (!m_range.atEnd() && m_range.peek().type() != CommaToken);
1159 1166
1160 // TODO(timloh): This will make invalid longhands, see crbug.com/386459 1167 // TODO(timloh): This will make invalid longhands, see crbug.com/386459
1161 for (size_t i = 0; i < longhandCount; ++i) { 1168 for (size_t i = 0; i < longhandCount; ++i) {
1162 if (!parsedLonghand[i]) 1169 if (!parsedLonghand[i])
1163 longhands[i]->append(cssValuePool().createImplicitInitialValue() ); 1170 longhands[i]->append(cssValuePool().createImplicitInitialValue() );
1164 parsedLonghand[i] = false; 1171 parsedLonghand[i] = false;
1165 } 1172 }
1166 } while (consumeCommaIncludingWhitespace(m_range)); 1173 } while (consumeCommaIncludingWhitespace(m_range));
1167 1174
1168 for (size_t i = 0; i < longhandCount; ++i) { 1175 for (size_t i = 0; i < longhandCount; ++i) {
1169 if (!isValidAnimationPropertyList(shorthand.properties()[i], *longhands[ i])) 1176 if (!isValidAnimationPropertyList(shorthand.properties()[i], *longhands[ i]))
1170 return false; 1177 return false;
1171 } 1178 }
1172 1179
1173 for (size_t i = 0; i < longhandCount; ++i) 1180 for (size_t i = 0; i < longhandCount; ++i)
1174 addProperty(shorthand.properties()[i], longhands[i].release(), important ); 1181 addProperty(shorthand.properties()[i], longhands[i], important);
1175 1182
1176 return m_range.atEnd(); 1183 return m_range.atEnd();
1177 } 1184 }
1178 1185
1179 static RawPtr<CSSValue> consumeWidowsOrOrphans(CSSParserTokenRange& range) 1186 static CSSValue* consumeWidowsOrOrphans(CSSParserTokenRange& range)
1180 { 1187 {
1181 // Support for auto is non-standard and for backwards compatibility. 1188 // Support for auto is non-standard and for backwards compatibility.
1182 if (range.peek().id() == CSSValueAuto) 1189 if (range.peek().id() == CSSValueAuto)
1183 return consumeIdent(range); 1190 return consumeIdent(range);
1184 return consumePositiveInteger(range); 1191 return consumePositiveInteger(range);
1185 } 1192 }
1186 1193
1187 static RawPtr<CSSValue> consumeZIndex(CSSParserTokenRange& range) 1194 static CSSValue* consumeZIndex(CSSParserTokenRange& range)
1188 { 1195 {
1189 if (range.peek().id() == CSSValueAuto) 1196 if (range.peek().id() == CSSValueAuto)
1190 return consumeIdent(range); 1197 return consumeIdent(range);
1191 return consumeInteger(range); 1198 return consumeInteger(range);
1192 } 1199 }
1193 1200
1194 static RawPtr<CSSShadowValue> parseSingleShadow(CSSParserTokenRange& range, CSSP arserMode cssParserMode, bool allowInset, bool allowSpread) 1201 static CSSShadowValue* parseSingleShadow(CSSParserTokenRange& range, CSSParserMo de cssParserMode, bool allowInset, bool allowSpread)
1195 { 1202 {
1196 RawPtr<CSSPrimitiveValue> style = nullptr; 1203 CSSPrimitiveValue* style = nullptr;
1197 RawPtr<CSSValue> color = nullptr; 1204 CSSValue* color = nullptr;
1198 1205
1199 if (range.atEnd()) 1206 if (range.atEnd())
1200 return nullptr; 1207 return nullptr;
1201 if (range.peek().id() == CSSValueInset) { 1208 if (range.peek().id() == CSSValueInset) {
1202 if (!allowInset) 1209 if (!allowInset)
1203 return nullptr; 1210 return nullptr;
1204 style = consumeIdent(range); 1211 style = consumeIdent(range);
1205 } 1212 }
1206 color = consumeColor(range, cssParserMode); 1213 color = consumeColor(range, cssParserMode);
1207 1214
1208 RawPtr<CSSPrimitiveValue> horizontalOffset = consumeLength(range, cssParserM ode, ValueRangeAll); 1215 CSSPrimitiveValue* horizontalOffset = consumeLength(range, cssParserMode, Va lueRangeAll);
1209 if (!horizontalOffset) 1216 if (!horizontalOffset)
1210 return nullptr; 1217 return nullptr;
1211 1218
1212 RawPtr<CSSPrimitiveValue> verticalOffset = consumeLength(range, cssParserMod e, ValueRangeAll); 1219 CSSPrimitiveValue* verticalOffset = consumeLength(range, cssParserMode, Valu eRangeAll);
1213 if (!verticalOffset) 1220 if (!verticalOffset)
1214 return nullptr; 1221 return nullptr;
1215 1222
1216 RawPtr<CSSPrimitiveValue> blurRadius = consumeLength(range, cssParserMode, V alueRangeAll); 1223 CSSPrimitiveValue* blurRadius = consumeLength(range, cssParserMode, ValueRan geAll);
1217 RawPtr<CSSPrimitiveValue> spreadDistance = nullptr; 1224 CSSPrimitiveValue* spreadDistance = nullptr;
1218 if (blurRadius) { 1225 if (blurRadius) {
1219 // Blur radius must be non-negative. 1226 // Blur radius must be non-negative.
1220 if (blurRadius->getDoubleValue() < 0) 1227 if (blurRadius->getDoubleValue() < 0)
1221 return nullptr; 1228 return nullptr;
1222 if (allowSpread) 1229 if (allowSpread)
1223 spreadDistance = consumeLength(range, cssParserMode, ValueRangeAll); 1230 spreadDistance = consumeLength(range, cssParserMode, ValueRangeAll);
1224 } 1231 }
1225 1232
1226 if (!range.atEnd()) { 1233 if (!range.atEnd()) {
1227 if (!color) 1234 if (!color)
1228 color = consumeColor(range, cssParserMode); 1235 color = consumeColor(range, cssParserMode);
1229 if (range.peek().id() == CSSValueInset) { 1236 if (range.peek().id() == CSSValueInset) {
1230 if (!allowInset || style) 1237 if (!allowInset || style)
1231 return nullptr; 1238 return nullptr;
1232 style = consumeIdent(range); 1239 style = consumeIdent(range);
1233 } 1240 }
1234 } 1241 }
1235 return CSSShadowValue::create(horizontalOffset.release(), verticalOffset.rel ease(), blurRadius.release(), 1242 return CSSShadowValue::create(horizontalOffset, verticalOffset, blurRadius,
1236 spreadDistance.release(), style.release(), color.release()); 1243 spreadDistance, style, color);
1237 } 1244 }
1238 1245
1239 static RawPtr<CSSValue> consumeShadow(CSSParserTokenRange& range, CSSParserMode cssParserMode, bool isBoxShadowProperty) 1246 static CSSValue* consumeShadow(CSSParserTokenRange& range, CSSParserMode cssPars erMode, bool isBoxShadowProperty)
1240 { 1247 {
1241 if (range.peek().id() == CSSValueNone) 1248 if (range.peek().id() == CSSValueNone)
1242 return consumeIdent(range); 1249 return consumeIdent(range);
1243 1250
1244 RawPtr<CSSValueList> shadowValueList = CSSValueList::createCommaSeparated(); 1251 CSSValueList* shadowValueList = CSSValueList::createCommaSeparated();
1245 do { 1252 do {
1246 if (RawPtr<CSSShadowValue> shadowValue = parseSingleShadow(range, cssPar serMode, isBoxShadowProperty, isBoxShadowProperty)) 1253 if (CSSShadowValue* shadowValue = parseSingleShadow(range, cssParserMode , isBoxShadowProperty, isBoxShadowProperty))
1247 shadowValueList->append(shadowValue.release()); 1254 shadowValueList->append(shadowValue);
1248 else 1255 else
1249 return nullptr; 1256 return nullptr;
1250 } while (consumeCommaIncludingWhitespace(range)); 1257 } while (consumeCommaIncludingWhitespace(range));
1251 return shadowValueList; 1258 return shadowValueList;
1252 } 1259 }
1253 1260
1254 static RawPtr<CSSFunctionValue> consumeFilterFunction(CSSParserTokenRange& range , CSSParserMode cssParserMode) 1261 static CSSFunctionValue* consumeFilterFunction(CSSParserTokenRange& range, CSSPa rserMode cssParserMode)
1255 { 1262 {
1256 CSSValueID filterType = range.peek().functionId(); 1263 CSSValueID filterType = range.peek().functionId();
1257 if (filterType < CSSValueInvert || filterType > CSSValueDropShadow) 1264 if (filterType < CSSValueInvert || filterType > CSSValueDropShadow)
1258 return nullptr; 1265 return nullptr;
1259 CSSParserTokenRange args = consumeFunction(range); 1266 CSSParserTokenRange args = consumeFunction(range);
1260 RawPtr<CSSFunctionValue> filterValue = CSSFunctionValue::create(filterType); 1267 CSSFunctionValue* filterValue = CSSFunctionValue::create(filterType);
1261 RawPtr<CSSValue> parsedValue = nullptr; 1268 CSSValue* parsedValue = nullptr;
1262 1269
1263 if (filterType == CSSValueDropShadow) { 1270 if (filterType == CSSValueDropShadow) {
1264 parsedValue = parseSingleShadow(args, cssParserMode, false, false); 1271 parsedValue = parseSingleShadow(args, cssParserMode, false, false);
1265 } else { 1272 } else {
1266 // TODO(timloh): Add UseCounters for empty filter arguments. 1273 // TODO(timloh): Add UseCounters for empty filter arguments.
1267 if (args.atEnd()) 1274 if (args.atEnd())
1268 return filterValue.release(); 1275 return filterValue;
1269 if (filterType == CSSValueBrightness) { 1276 if (filterType == CSSValueBrightness) {
1270 // FIXME (crbug.com/397061): Support calc expressions like calc(10% + 0.5) 1277 // FIXME (crbug.com/397061): Support calc expressions like calc(10% + 0.5)
1271 parsedValue = consumePercent(args, ValueRangeAll); 1278 parsedValue = consumePercent(args, ValueRangeAll);
1272 if (!parsedValue) 1279 if (!parsedValue)
1273 parsedValue = consumeNumber(args, ValueRangeAll); 1280 parsedValue = consumeNumber(args, ValueRangeAll);
1274 } else if (filterType == CSSValueHueRotate) { 1281 } else if (filterType == CSSValueHueRotate) {
1275 parsedValue = consumeAngle(args); 1282 parsedValue = consumeAngle(args);
1276 } else if (filterType == CSSValueBlur) { 1283 } else if (filterType == CSSValueBlur) {
1277 parsedValue = consumeLength(args, HTMLStandardMode, ValueRangeNonNeg ative); 1284 parsedValue = consumeLength(args, HTMLStandardMode, ValueRangeNonNeg ative);
1278 } else { 1285 } else {
1279 // FIXME (crbug.com/397061): Support calc expressions like calc(10% + 0.5) 1286 // FIXME (crbug.com/397061): Support calc expressions like calc(10% + 0.5)
1280 parsedValue = consumePercent(args, ValueRangeNonNegative); 1287 parsedValue = consumePercent(args, ValueRangeNonNegative);
1281 if (!parsedValue) 1288 if (!parsedValue)
1282 parsedValue = consumeNumber(args, ValueRangeNonNegative); 1289 parsedValue = consumeNumber(args, ValueRangeNonNegative);
1283 if (parsedValue && filterType != CSSValueSaturate && filterType != C SSValueContrast) { 1290 if (parsedValue && filterType != CSSValueSaturate && filterType != C SSValueContrast) {
1284 double maxAllowed = toCSSPrimitiveValue(parsedValue.get())->isPe rcentage() ? 100.0 : 1.0; 1291 double maxAllowed = toCSSPrimitiveValue(parsedValue)->isPercenta ge() ? 100.0 : 1.0;
1285 if (toCSSPrimitiveValue(parsedValue.get())->getDoubleValue() > m axAllowed) 1292 if (toCSSPrimitiveValue(parsedValue)->getDoubleValue() > maxAllo wed)
1286 return nullptr; 1293 return nullptr;
1287 } 1294 }
1288 } 1295 }
1289 } 1296 }
1290 if (!parsedValue || !args.atEnd()) 1297 if (!parsedValue || !args.atEnd())
1291 return nullptr; 1298 return nullptr;
1292 filterValue->append(parsedValue.release()); 1299 filterValue->append(parsedValue);
1293 return filterValue.release(); 1300 return filterValue;
1294 } 1301 }
1295 1302
1296 static RawPtr<CSSValue> consumeFilter(CSSParserTokenRange& range, CSSParserMode cssParserMode) 1303 static CSSValue* consumeFilter(CSSParserTokenRange& range, CSSParserMode cssPars erMode)
1297 { 1304 {
1298 if (range.peek().id() == CSSValueNone) 1305 if (range.peek().id() == CSSValueNone)
1299 return consumeIdent(range); 1306 return consumeIdent(range);
1300 1307
1301 RawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 1308 CSSValueList* list = CSSValueList::createSpaceSeparated();
1302 do { 1309 do {
1303 String url = consumeUrl(range); 1310 String url = consumeUrl(range);
1304 RawPtr<CSSFunctionValue> filterValue = nullptr; 1311 CSSFunctionValue* filterValue = nullptr;
1305 if (!url.isNull()) { 1312 if (!url.isNull()) {
1306 filterValue = CSSFunctionValue::create(CSSValueUrl); 1313 filterValue = CSSFunctionValue::create(CSSValueUrl);
1307 filterValue->append(CSSSVGDocumentValue::create(url)); 1314 filterValue->append(CSSSVGDocumentValue::create(url));
1308 } else { 1315 } else {
1309 filterValue = consumeFilterFunction(range, cssParserMode); 1316 filterValue = consumeFilterFunction(range, cssParserMode);
1310 if (!filterValue) 1317 if (!filterValue)
1311 return nullptr; 1318 return nullptr;
1312 } 1319 }
1313 list->append(filterValue.release()); 1320 list->append(filterValue);
1314 } while (!range.atEnd()); 1321 } while (!range.atEnd());
1315 return list.release(); 1322 return list;
1316 } 1323 }
1317 1324
1318 static RawPtr<CSSValue> consumeTextDecorationLine(CSSParserTokenRange& range) 1325 static CSSValue* consumeTextDecorationLine(CSSParserTokenRange& range)
1319 { 1326 {
1320 CSSValueID id = range.peek().id(); 1327 CSSValueID id = range.peek().id();
1321 if (id == CSSValueNone) 1328 if (id == CSSValueNone)
1322 return consumeIdent(range); 1329 return consumeIdent(range);
1323 1330
1324 RawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 1331 CSSValueList* list = CSSValueList::createSpaceSeparated();
1325 RawPtr<CSSPrimitiveValue> ident = nullptr; 1332 while (true) {
1326 while ((ident = consumeIdent<CSSValueBlink, CSSValueUnderline, CSSValueOverl ine, CSSValueLineThrough>(range))) { 1333 CSSPrimitiveValue* ident = consumeIdent<CSSValueBlink, CSSValueUnderline , CSSValueOverline, CSSValueLineThrough>(range);
1327 if (list->hasValue(ident.get())) 1334 if (!ident)
1335 break;
1336 if (list->hasValue(ident))
1328 return nullptr; 1337 return nullptr;
1329 list->append(ident.release()); 1338 list->append(ident);
1330 } 1339 }
1331 1340
1332 if (!list->length()) 1341 if (!list->length())
1333 return nullptr; 1342 return nullptr;
1334 return list.release(); 1343 return list;
1335 } 1344 }
1336 1345
1337 // none | strict | [ layout || style || paint ] 1346 // none | strict | [ layout || style || paint ]
1338 static RawPtr<CSSValue> consumeContain(CSSParserTokenRange& range) 1347 static CSSValue* consumeContain(CSSParserTokenRange& range)
1339 { 1348 {
1340 CSSValueID id = range.peek().id(); 1349 CSSValueID id = range.peek().id();
1341 if (id == CSSValueNone) 1350 if (id == CSSValueNone)
1342 return consumeIdent(range); 1351 return consumeIdent(range);
1343 1352
1344 RawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 1353 CSSValueList* list = CSSValueList::createSpaceSeparated();
1345 if (id == CSSValueStrict) { 1354 if (id == CSSValueStrict) {
1346 list->append(consumeIdent(range)); 1355 list->append(consumeIdent(range));
1347 return list.release(); 1356 return list;
1348 } 1357 }
1349 RawPtr<CSSPrimitiveValue> ident = nullptr; 1358 while (true) {
1350 while ((ident = consumeIdent<CSSValuePaint, CSSValueLayout, CSSValueStyle>(r ange))) { 1359 CSSPrimitiveValue* ident = consumeIdent<CSSValuePaint, CSSValueLayout, C SSValueStyle>(range);
1351 if (list->hasValue(ident.get())) 1360 if (!ident)
1361 break;
1362 if (list->hasValue(ident))
1352 return nullptr; 1363 return nullptr;
1353 list->append(ident.release()); 1364 list->append(ident);
1354 } 1365 }
1355 1366
1356 if (!list->length()) 1367 if (!list->length())
1357 return nullptr; 1368 return nullptr;
1358 return list.release(); 1369 return list;
1359 } 1370 }
1360 1371
1361 static RawPtr<CSSValue> consumePath(CSSParserTokenRange& range) 1372 static CSSValue* consumePath(CSSParserTokenRange& range)
1362 { 1373 {
1363 // FIXME: Add support for <url>, <basic-shape>, <geometry-box>. 1374 // FIXME: Add support for <url>, <basic-shape>, <geometry-box>.
1364 if (range.peek().functionId() != CSSValuePath) 1375 if (range.peek().functionId() != CSSValuePath)
1365 return nullptr; 1376 return nullptr;
1366 1377
1367 CSSParserTokenRange functionRange = range; 1378 CSSParserTokenRange functionRange = range;
1368 CSSParserTokenRange functionArgs = consumeFunction(functionRange); 1379 CSSParserTokenRange functionArgs = consumeFunction(functionRange);
1369 1380
1370 if (functionArgs.peek().type() != StringToken) 1381 if (functionArgs.peek().type() != StringToken)
1371 return nullptr; 1382 return nullptr;
1372 String pathString = functionArgs.consumeIncludingWhitespace().value(); 1383 String pathString = functionArgs.consumeIncludingWhitespace().value();
1373 1384
1374 OwnPtr<SVGPathByteStream> byteStream = SVGPathByteStream::create(); 1385 OwnPtr<SVGPathByteStream> byteStream = SVGPathByteStream::create();
1375 if (buildByteStreamFromString(pathString, *byteStream) != SVGParseStatus::No Error 1386 if (buildByteStreamFromString(pathString, *byteStream) != SVGParseStatus::No Error
1376 || !functionArgs.atEnd()) 1387 || !functionArgs.atEnd())
1377 return nullptr; 1388 return nullptr;
1378 1389
1379 range = functionRange; 1390 range = functionRange;
1380 if (byteStream->isEmpty()) 1391 if (byteStream->isEmpty())
1381 return cssValuePool().createIdentifierValue(CSSValueNone); 1392 return cssValuePool().createIdentifierValue(CSSValueNone);
1382 return CSSPathValue::create(byteStream.release()); 1393 return CSSPathValue::create(byteStream.release());
1383 } 1394 }
1384 1395
1385 static RawPtr<CSSValue> consumePathOrNone(CSSParserTokenRange& range) 1396 static CSSValue* consumePathOrNone(CSSParserTokenRange& range)
1386 { 1397 {
1387 CSSValueID id = range.peek().id(); 1398 CSSValueID id = range.peek().id();
1388 if (id == CSSValueNone) 1399 if (id == CSSValueNone)
1389 return consumeIdent(range); 1400 return consumeIdent(range);
1390 1401
1391 return consumePath(range); 1402 return consumePath(range);
1392 } 1403 }
1393 1404
1394 static RawPtr<CSSValue> consumeMotionRotation(CSSParserTokenRange& range) 1405 static CSSValue* consumeMotionRotation(CSSParserTokenRange& range)
1395 { 1406 {
1396 RawPtr<CSSValue> angle = consumeAngle(range); 1407 CSSValue* angle = consumeAngle(range);
1397 RawPtr<CSSValue> keyword = consumeIdent<CSSValueAuto, CSSValueReverse>(range ); 1408 CSSValue* keyword = consumeIdent<CSSValueAuto, CSSValueReverse>(range);
1398 if (!angle && !keyword) 1409 if (!angle && !keyword)
1399 return nullptr; 1410 return nullptr;
1400 1411
1401 if (!angle) 1412 if (!angle)
1402 angle = consumeAngle(range); 1413 angle = consumeAngle(range);
1403 1414
1404 RawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 1415 CSSValueList* list = CSSValueList::createSpaceSeparated();
1405 if (keyword) 1416 if (keyword)
1406 list->append(keyword.release()); 1417 list->append(keyword);
1407 if (angle) 1418 if (angle)
1408 list->append(angle.release()); 1419 list->append(angle);
1409 return list.release(); 1420 return list;
1410 } 1421 }
1411 1422
1412 static RawPtr<CSSValue> consumeTextEmphasisStyle(CSSParserTokenRange& range) 1423 static CSSValue* consumeTextEmphasisStyle(CSSParserTokenRange& range)
1413 { 1424 {
1414 CSSValueID id = range.peek().id(); 1425 CSSValueID id = range.peek().id();
1415 if (id == CSSValueNone) 1426 if (id == CSSValueNone)
1416 return consumeIdent(range); 1427 return consumeIdent(range);
1417 1428
1418 if (RawPtr<CSSValue> textEmphasisStyle = consumeString(range)) 1429 if (CSSValue* textEmphasisStyle = consumeString(range))
1419 return textEmphasisStyle.release(); 1430 return textEmphasisStyle;
1420 1431
1421 RawPtr<CSSPrimitiveValue> fill = consumeIdent<CSSValueFilled, CSSValueOpen>( range); 1432 CSSPrimitiveValue* fill = consumeIdent<CSSValueFilled, CSSValueOpen>(range);
1422 RawPtr<CSSPrimitiveValue> shape = consumeIdent<CSSValueDot, CSSValueCircle, CSSValueDoubleCircle, CSSValueTriangle, CSSValueSesame>(range); 1433 CSSPrimitiveValue* shape = consumeIdent<CSSValueDot, CSSValueCircle, CSSValu eDoubleCircle, CSSValueTriangle, CSSValueSesame>(range);
1423 if (!fill) 1434 if (!fill)
1424 fill = consumeIdent<CSSValueFilled, CSSValueOpen>(range); 1435 fill = consumeIdent<CSSValueFilled, CSSValueOpen>(range);
1425 if (fill && shape) { 1436 if (fill && shape) {
1426 RawPtr<CSSValueList> parsedValues = CSSValueList::createSpaceSeparated() ; 1437 CSSValueList* parsedValues = CSSValueList::createSpaceSeparated();
1427 parsedValues->append(fill.release()); 1438 parsedValues->append(fill);
1428 parsedValues->append(shape.release()); 1439 parsedValues->append(shape);
1429 return parsedValues.release(); 1440 return parsedValues;
1430 } 1441 }
1431 if (fill) 1442 if (fill)
1432 return fill.release(); 1443 return fill;
1433 if (shape) 1444 if (shape)
1434 return shape.release(); 1445 return shape;
1435 return nullptr; 1446 return nullptr;
1436 } 1447 }
1437 1448
1438 static RawPtr<CSSValue> consumeOutlineColor(CSSParserTokenRange& range, CSSParse rMode cssParserMode) 1449 static CSSValue* consumeOutlineColor(CSSParserTokenRange& range, CSSParserMode c ssParserMode)
1439 { 1450 {
1440 // Outline color has "invert" as additional keyword. 1451 // Outline color has "invert" as additional keyword.
1441 // Also, we want to allow the special focus color even in HTML Standard pars ing mode. 1452 // Also, we want to allow the special focus color even in HTML Standard pars ing mode.
1442 if (range.peek().id() == CSSValueInvert || range.peek().id() == CSSValueWebk itFocusRingColor) 1453 if (range.peek().id() == CSSValueInvert || range.peek().id() == CSSValueWebk itFocusRingColor)
1443 return consumeIdent(range); 1454 return consumeIdent(range);
1444 return consumeColor(range, cssParserMode); 1455 return consumeColor(range, cssParserMode);
1445 } 1456 }
1446 1457
1447 static RawPtr<CSSPrimitiveValue> consumeLineWidth(CSSParserTokenRange& range, CS SParserMode cssParserMode, UnitlessQuirk unitless) 1458 static CSSPrimitiveValue* consumeLineWidth(CSSParserTokenRange& range, CSSParser Mode cssParserMode, UnitlessQuirk unitless)
1448 { 1459 {
1449 CSSValueID id = range.peek().id(); 1460 CSSValueID id = range.peek().id();
1450 if (id == CSSValueThin || id == CSSValueMedium || id == CSSValueThick) 1461 if (id == CSSValueThin || id == CSSValueMedium || id == CSSValueThick)
1451 return consumeIdent(range); 1462 return consumeIdent(range);
1452 return consumeLength(range, cssParserMode, ValueRangeNonNegative, unitless); 1463 return consumeLength(range, cssParserMode, ValueRangeNonNegative, unitless);
1453 } 1464 }
1454 1465
1455 static RawPtr<CSSPrimitiveValue> consumeBorderWidth(CSSParserTokenRange& range, CSSParserMode cssParserMode, UnitlessQuirk unitless) 1466 static CSSPrimitiveValue* consumeBorderWidth(CSSParserTokenRange& range, CSSPars erMode cssParserMode, UnitlessQuirk unitless)
1456 { 1467 {
1457 return consumeLineWidth(range, cssParserMode, unitless); 1468 return consumeLineWidth(range, cssParserMode, unitless);
1458 } 1469 }
1459 1470
1460 static RawPtr<CSSPrimitiveValue> consumeTextStrokeWidth(CSSParserTokenRange& ran ge, CSSParserMode cssParserMode) 1471 static CSSPrimitiveValue* consumeTextStrokeWidth(CSSParserTokenRange& range, CSS ParserMode cssParserMode)
1461 { 1472 {
1462 return consumeLineWidth(range, cssParserMode, UnitlessQuirk::Forbid); 1473 return consumeLineWidth(range, cssParserMode, UnitlessQuirk::Forbid);
1463 } 1474 }
1464 1475
1465 static RawPtr<CSSPrimitiveValue> consumeColumnRuleWidth(CSSParserTokenRange& ran ge, CSSParserMode cssParserMode) 1476 static CSSPrimitiveValue* consumeColumnRuleWidth(CSSParserTokenRange& range, CSS ParserMode cssParserMode)
1466 { 1477 {
1467 return consumeLineWidth(range, cssParserMode, UnitlessQuirk::Forbid); 1478 return consumeLineWidth(range, cssParserMode, UnitlessQuirk::Forbid);
1468 } 1479 }
1469 1480
1470 static bool consumeTranslate3d(CSSParserTokenRange& args, CSSParserMode cssParse rMode, RawPtr<CSSFunctionValue>& transformValue) 1481 static bool consumeTranslate3d(CSSParserTokenRange& args, CSSParserMode cssParse rMode, CSSFunctionValue*& transformValue)
1471 { 1482 {
1472 unsigned numberOfArguments = 2; 1483 unsigned numberOfArguments = 2;
1473 RawPtr<CSSValue> parsedValue = nullptr; 1484 CSSValue* parsedValue = nullptr;
1474 do { 1485 do {
1475 parsedValue = consumeLengthOrPercent(args, cssParserMode, ValueRangeAll) ; 1486 parsedValue = consumeLengthOrPercent(args, cssParserMode, ValueRangeAll) ;
1476 if (!parsedValue) 1487 if (!parsedValue)
1477 return false; 1488 return false;
1478 transformValue->append(parsedValue); 1489 transformValue->append(parsedValue);
1479 if (!consumeCommaIncludingWhitespace(args)) 1490 if (!consumeCommaIncludingWhitespace(args))
1480 return false; 1491 return false;
1481 } while (--numberOfArguments); 1492 } while (--numberOfArguments);
1482 parsedValue = consumeLength(args, cssParserMode, ValueRangeAll); 1493 parsedValue = consumeLength(args, cssParserMode, ValueRangeAll);
1483 if (!parsedValue) 1494 if (!parsedValue)
1484 return false; 1495 return false;
1485 transformValue->append(parsedValue); 1496 transformValue->append(parsedValue);
1486 return true; 1497 return true;
1487 } 1498 }
1488 1499
1489 static bool consumeNumbers(CSSParserTokenRange& args, RawPtr<CSSFunctionValue>& transformValue, unsigned numberOfArguments) 1500 static bool consumeNumbers(CSSParserTokenRange& args, CSSFunctionValue*& transfo rmValue, unsigned numberOfArguments)
1490 { 1501 {
1491 do { 1502 do {
1492 RawPtr<CSSValue> parsedValue = consumeNumber(args, ValueRangeAll); 1503 CSSValue* parsedValue = consumeNumber(args, ValueRangeAll);
1493 if (!parsedValue) 1504 if (!parsedValue)
1494 return false; 1505 return false;
1495 transformValue->append(parsedValue); 1506 transformValue->append(parsedValue);
1496 if (--numberOfArguments && !consumeCommaIncludingWhitespace(args)) 1507 if (--numberOfArguments && !consumeCommaIncludingWhitespace(args))
1497 return false; 1508 return false;
1498 } while (numberOfArguments); 1509 } while (numberOfArguments);
1499 return true; 1510 return true;
1500 } 1511 }
1501 1512
1502 static bool consumePerspective(CSSParserTokenRange& args, CSSParserMode cssParse rMode, RawPtr<CSSFunctionValue>& transformValue, bool useLegacyParsing) 1513 static bool consumePerspective(CSSParserTokenRange& args, CSSParserMode cssParse rMode, CSSFunctionValue*& transformValue, bool useLegacyParsing)
1503 { 1514 {
1504 RawPtr<CSSPrimitiveValue> parsedValue = consumeLength(args, cssParserMode, V alueRangeNonNegative); 1515 CSSPrimitiveValue* parsedValue = consumeLength(args, cssParserMode, ValueRan geNonNegative);
1505 if (!parsedValue && useLegacyParsing) { 1516 if (!parsedValue && useLegacyParsing) {
1506 double perspective; 1517 double perspective;
1507 if (!consumeNumberRaw(args, perspective) || perspective < 0) 1518 if (!consumeNumberRaw(args, perspective) || perspective < 0)
1508 return false; 1519 return false;
1509 parsedValue = cssValuePool().createValue(perspective, CSSPrimitiveValue: :UnitType::Pixels); 1520 parsedValue = cssValuePool().createValue(perspective, CSSPrimitiveValue: :UnitType::Pixels);
1510 } 1521 }
1511 if (!parsedValue) 1522 if (!parsedValue)
1512 return false; 1523 return false;
1513 transformValue->append(parsedValue); 1524 transformValue->append(parsedValue);
1514 return true; 1525 return true;
1515 } 1526 }
1516 1527
1517 static RawPtr<CSSValue> consumeTransformValue(CSSParserTokenRange& range, CSSPar serMode cssParserMode, bool useLegacyParsing) 1528 static CSSValue* consumeTransformValue(CSSParserTokenRange& range, CSSParserMode cssParserMode, bool useLegacyParsing)
1518 { 1529 {
1519 CSSValueID functionId = range.peek().functionId(); 1530 CSSValueID functionId = range.peek().functionId();
1520 if (functionId == CSSValueInvalid) 1531 if (functionId == CSSValueInvalid)
1521 return nullptr; 1532 return nullptr;
1522 CSSParserTokenRange args = consumeFunction(range); 1533 CSSParserTokenRange args = consumeFunction(range);
1523 if (args.atEnd()) 1534 if (args.atEnd())
1524 return nullptr; 1535 return nullptr;
1525 RawPtr<CSSFunctionValue> transformValue = CSSFunctionValue::create(functionI d); 1536 CSSFunctionValue* transformValue = CSSFunctionValue::create(functionId);
1526 RawPtr<CSSValue> parsedValue = nullptr; 1537 CSSValue* parsedValue = nullptr;
1527 switch (functionId) { 1538 switch (functionId) {
1528 case CSSValueRotate: 1539 case CSSValueRotate:
1529 case CSSValueRotateX: 1540 case CSSValueRotateX:
1530 case CSSValueRotateY: 1541 case CSSValueRotateY:
1531 case CSSValueRotateZ: 1542 case CSSValueRotateZ:
1532 case CSSValueSkewX: 1543 case CSSValueSkewX:
1533 case CSSValueSkewY: 1544 case CSSValueSkewY:
1534 case CSSValueSkew: 1545 case CSSValueSkew:
1535 parsedValue = consumeAngle(args); 1546 parsedValue = consumeAngle(args);
1536 if (!parsedValue) 1547 if (!parsedValue)
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1596 if (!consumeTranslate3d(args, cssParserMode, transformValue)) 1607 if (!consumeTranslate3d(args, cssParserMode, transformValue))
1597 return nullptr; 1608 return nullptr;
1598 break; 1609 break;
1599 default: 1610 default:
1600 return nullptr; 1611 return nullptr;
1601 } 1612 }
1602 if (parsedValue) 1613 if (parsedValue)
1603 transformValue->append(parsedValue); 1614 transformValue->append(parsedValue);
1604 if (!args.atEnd()) 1615 if (!args.atEnd())
1605 return nullptr; 1616 return nullptr;
1606 return transformValue.release(); 1617 return transformValue;
1607 } 1618 }
1608 1619
1609 static RawPtr<CSSValue> consumeTransform(CSSParserTokenRange& range, CSSParserMo de cssParserMode, bool useLegacyParsing) 1620 static CSSValue* consumeTransform(CSSParserTokenRange& range, CSSParserMode cssP arserMode, bool useLegacyParsing)
1610 { 1621 {
1611 if (range.peek().id() == CSSValueNone) 1622 if (range.peek().id() == CSSValueNone)
1612 return consumeIdent(range); 1623 return consumeIdent(range);
1613 1624
1614 RawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 1625 CSSValueList* list = CSSValueList::createSpaceSeparated();
1615 do { 1626 do {
1616 RawPtr<CSSValue> parsedTransformValue = consumeTransformValue(range, css ParserMode, useLegacyParsing); 1627 CSSValue* parsedTransformValue = consumeTransformValue(range, cssParserM ode, useLegacyParsing);
1617 if (!parsedTransformValue) 1628 if (!parsedTransformValue)
1618 return nullptr; 1629 return nullptr;
1619 list->append(parsedTransformValue.release()); 1630 list->append(parsedTransformValue);
1620 } while (!range.atEnd()); 1631 } while (!range.atEnd());
1621 1632
1622 return list.release(); 1633 return list;
1623 } 1634 }
1624 1635
1625 template <CSSValueID start, CSSValueID end> 1636 template <CSSValueID start, CSSValueID end>
1626 static RawPtr<CSSValue> consumePositionLonghand(CSSParserTokenRange& range, CSSP arserMode cssParserMode) 1637 static CSSValue* consumePositionLonghand(CSSParserTokenRange& range, CSSParserMo de cssParserMode)
1627 { 1638 {
1628 if (range.peek().type() == IdentToken) { 1639 if (range.peek().type() == IdentToken) {
1629 CSSValueID id = range.peek().id(); 1640 CSSValueID id = range.peek().id();
1630 int percent; 1641 int percent;
1631 if (id == start) 1642 if (id == start)
1632 percent = 0; 1643 percent = 0;
1633 else if (id == CSSValueCenter) 1644 else if (id == CSSValueCenter)
1634 percent = 50; 1645 percent = 50;
1635 else if (id == end) 1646 else if (id == end)
1636 percent = 100; 1647 percent = 100;
1637 else 1648 else
1638 return nullptr; 1649 return nullptr;
1639 range.consumeIncludingWhitespace(); 1650 range.consumeIncludingWhitespace();
1640 return cssValuePool().createValue(percent, CSSPrimitiveValue::UnitType:: Percentage); 1651 return cssValuePool().createValue(percent, CSSPrimitiveValue::UnitType:: Percentage);
1641 } 1652 }
1642 return consumeLengthOrPercent(range, cssParserMode, ValueRangeAll); 1653 return consumeLengthOrPercent(range, cssParserMode, ValueRangeAll);
1643 } 1654 }
1644 1655
1645 static RawPtr<CSSValue> consumePositionX(CSSParserTokenRange& range, CSSParserMo de cssParserMode) 1656 static CSSValue* consumePositionX(CSSParserTokenRange& range, CSSParserMode cssP arserMode)
1646 { 1657 {
1647 return consumePositionLonghand<CSSValueLeft, CSSValueRight>(range, cssParser Mode); 1658 return consumePositionLonghand<CSSValueLeft, CSSValueRight>(range, cssParser Mode);
1648 } 1659 }
1649 1660
1650 static RawPtr<CSSValue> consumePositionY(CSSParserTokenRange& range, CSSParserMo de cssParserMode) 1661 static CSSValue* consumePositionY(CSSParserTokenRange& range, CSSParserMode cssP arserMode)
1651 { 1662 {
1652 return consumePositionLonghand<CSSValueTop, CSSValueBottom>(range, cssParser Mode); 1663 return consumePositionLonghand<CSSValueTop, CSSValueBottom>(range, cssParser Mode);
1653 } 1664 }
1654 1665
1655 static RawPtr<CSSValue> consumePaintStroke(CSSParserTokenRange& range, CSSParser Mode cssParserMode) 1666 static CSSValue* consumePaintStroke(CSSParserTokenRange& range, CSSParserMode cs sParserMode)
1656 { 1667 {
1657 if (range.peek().id() == CSSValueNone) 1668 if (range.peek().id() == CSSValueNone)
1658 return consumeIdent(range); 1669 return consumeIdent(range);
1659 String url = consumeUrl(range); 1670 String url = consumeUrl(range);
1660 if (!url.isNull()) { 1671 if (!url.isNull()) {
1661 RawPtr<CSSValue> parsedValue = nullptr; 1672 CSSValue* parsedValue = nullptr;
1662 if (range.peek().id() == CSSValueNone) 1673 if (range.peek().id() == CSSValueNone)
1663 parsedValue = consumeIdent(range); 1674 parsedValue = consumeIdent(range);
1664 else 1675 else
1665 parsedValue = consumeColor(range, cssParserMode); 1676 parsedValue = consumeColor(range, cssParserMode);
1666 if (parsedValue) { 1677 if (parsedValue) {
1667 RawPtr<CSSValueList> values = CSSValueList::createSpaceSeparated(); 1678 CSSValueList* values = CSSValueList::createSpaceSeparated();
1668 values->append(CSSURIValue::create(url)); 1679 values->append(CSSURIValue::create(url));
1669 values->append(parsedValue); 1680 values->append(parsedValue);
1670 return values.release(); 1681 return values;
1671 } 1682 }
1672 return CSSURIValue::create(url); 1683 return CSSURIValue::create(url);
1673 } 1684 }
1674 return consumeColor(range, cssParserMode); 1685 return consumeColor(range, cssParserMode);
1675 } 1686 }
1676 1687
1677 static RawPtr<CSSValue> consumePaintOrder(CSSParserTokenRange& range) 1688 static CSSValue* consumePaintOrder(CSSParserTokenRange& range)
1678 { 1689 {
1679 if (range.peek().id() == CSSValueNormal) 1690 if (range.peek().id() == CSSValueNormal)
1680 return consumeIdent(range); 1691 return consumeIdent(range);
1681 1692
1682 Vector<CSSValueID, 3> paintTypeList; 1693 Vector<CSSValueID, 3> paintTypeList;
1683 RawPtr<CSSPrimitiveValue> fill = nullptr; 1694 CSSPrimitiveValue* fill = nullptr;
1684 RawPtr<CSSPrimitiveValue> stroke = nullptr; 1695 CSSPrimitiveValue* stroke = nullptr;
1685 RawPtr<CSSPrimitiveValue> markers = nullptr; 1696 CSSPrimitiveValue* markers = nullptr;
1686 do { 1697 do {
1687 CSSValueID id = range.peek().id(); 1698 CSSValueID id = range.peek().id();
1688 if (id == CSSValueFill && !fill) 1699 if (id == CSSValueFill && !fill)
1689 fill = consumeIdent(range); 1700 fill = consumeIdent(range);
1690 else if (id == CSSValueStroke && !stroke) 1701 else if (id == CSSValueStroke && !stroke)
1691 stroke = consumeIdent(range); 1702 stroke = consumeIdent(range);
1692 else if (id == CSSValueMarkers && !markers) 1703 else if (id == CSSValueMarkers && !markers)
1693 markers = consumeIdent(range); 1704 markers = consumeIdent(range);
1694 else 1705 else
1695 return nullptr; 1706 return nullptr;
1696 paintTypeList.append(id); 1707 paintTypeList.append(id);
1697 } while (!range.atEnd()); 1708 } while (!range.atEnd());
1698 1709
1699 // After parsing we serialize the paint-order list. Since it is not possible to 1710 // After parsing we serialize the paint-order list. Since it is not possible to
1700 // pop a last list items from CSSValueList without bigger cost, we create th e 1711 // pop a last list items from CSSValueList without bigger cost, we create th e
1701 // list after parsing. 1712 // list after parsing.
1702 CSSValueID firstPaintOrderType = paintTypeList.at(0); 1713 CSSValueID firstPaintOrderType = paintTypeList.at(0);
1703 RawPtr<CSSValueList> paintOrderList = CSSValueList::createSpaceSeparated(); 1714 CSSValueList* paintOrderList = CSSValueList::createSpaceSeparated();
1704 switch (firstPaintOrderType) { 1715 switch (firstPaintOrderType) {
1705 case CSSValueFill: 1716 case CSSValueFill:
1706 case CSSValueStroke: 1717 case CSSValueStroke:
1707 paintOrderList->append(firstPaintOrderType == CSSValueFill ? fill.releas e() : stroke.release()); 1718 paintOrderList->append(firstPaintOrderType == CSSValueFill ? fill : stro ke);
1708 if (paintTypeList.size() > 1) { 1719 if (paintTypeList.size() > 1) {
1709 if (paintTypeList.at(1) == CSSValueMarkers) 1720 if (paintTypeList.at(1) == CSSValueMarkers)
1710 paintOrderList->append(markers.release()); 1721 paintOrderList->append(markers);
1711 } 1722 }
1712 break; 1723 break;
1713 case CSSValueMarkers: 1724 case CSSValueMarkers:
1714 paintOrderList->append(markers.release()); 1725 paintOrderList->append(markers);
1715 if (paintTypeList.size() > 1) { 1726 if (paintTypeList.size() > 1) {
1716 if (paintTypeList.at(1) == CSSValueStroke) 1727 if (paintTypeList.at(1) == CSSValueStroke)
1717 paintOrderList->append(stroke.release()); 1728 paintOrderList->append(stroke);
1718 } 1729 }
1719 break; 1730 break;
1720 default: 1731 default:
1721 ASSERT_NOT_REACHED(); 1732 ASSERT_NOT_REACHED();
1722 } 1733 }
1723 1734
1724 return paintOrderList.release(); 1735 return paintOrderList;
1725 } 1736 }
1726 1737
1727 static RawPtr<CSSValue> consumeNoneOrURI(CSSParserTokenRange& range) 1738 static CSSValue* consumeNoneOrURI(CSSParserTokenRange& range)
1728 { 1739 {
1729 if (range.peek().id() == CSSValueNone) 1740 if (range.peek().id() == CSSValueNone)
1730 return consumeIdent(range); 1741 return consumeIdent(range);
1731 1742
1732 String url = consumeUrl(range); 1743 String url = consumeUrl(range);
1733 if (url.isNull()) 1744 if (url.isNull())
1734 return nullptr; 1745 return nullptr;
1735 return CSSURIValue::create(url); 1746 return CSSURIValue::create(url);
1736 } 1747 }
1737 1748
1738 static RawPtr<CSSValue> consumeFlexBasis(CSSParserTokenRange& range, CSSParserMo de cssParserMode) 1749 static CSSValue* consumeFlexBasis(CSSParserTokenRange& range, CSSParserMode cssP arserMode)
1739 { 1750 {
1740 // FIXME: Support intrinsic dimensions too. 1751 // FIXME: Support intrinsic dimensions too.
1741 if (range.peek().id() == CSSValueAuto) 1752 if (range.peek().id() == CSSValueAuto)
1742 return consumeIdent(range); 1753 return consumeIdent(range);
1743 return consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative); 1754 return consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative);
1744 } 1755 }
1745 1756
1746 static RawPtr<CSSValue> consumeStrokeDasharray(CSSParserTokenRange& range) 1757 static CSSValue* consumeStrokeDasharray(CSSParserTokenRange& range)
1747 { 1758 {
1748 CSSValueID id = range.peek().id(); 1759 CSSValueID id = range.peek().id();
1749 if (id == CSSValueNone) 1760 if (id == CSSValueNone)
1750 return consumeIdent(range); 1761 return consumeIdent(range);
1751 1762
1752 RawPtr<CSSValueList> dashes = CSSValueList::createCommaSeparated(); 1763 CSSValueList* dashes = CSSValueList::createCommaSeparated();
1753 do { 1764 do {
1754 RawPtr<CSSPrimitiveValue> dash = consumeLengthOrPercent(range, SVGAttrib uteMode, ValueRangeNonNegative, UnitlessQuirk::Allow); 1765 CSSPrimitiveValue* dash = consumeLengthOrPercent(range, SVGAttributeMode , ValueRangeNonNegative, UnitlessQuirk::Allow);
1755 if (!dash || (consumeCommaIncludingWhitespace(range) && range.atEnd())) 1766 if (!dash || (consumeCommaIncludingWhitespace(range) && range.atEnd()))
1756 return nullptr; 1767 return nullptr;
1757 dashes->append(dash.release()); 1768 dashes->append(dash);
1758 } while (!range.atEnd()); 1769 } while (!range.atEnd());
1759 return dashes.release(); 1770 return dashes;
1760 } 1771 }
1761 1772
1762 static RawPtr<CSSPrimitiveValue> consumeBaselineShift(CSSParserTokenRange& range ) 1773 static CSSPrimitiveValue* consumeBaselineShift(CSSParserTokenRange& range)
1763 { 1774 {
1764 CSSValueID id = range.peek().id(); 1775 CSSValueID id = range.peek().id();
1765 if (id == CSSValueBaseline || id == CSSValueSub || id == CSSValueSuper) 1776 if (id == CSSValueBaseline || id == CSSValueSub || id == CSSValueSuper)
1766 return consumeIdent(range); 1777 return consumeIdent(range);
1767 return consumeLengthOrPercent(range, SVGAttributeMode, ValueRangeAll); 1778 return consumeLengthOrPercent(range, SVGAttributeMode, ValueRangeAll);
1768 } 1779 }
1769 1780
1770 static RawPtr<CSSValue> createCSSImageValueWithReferrer(const AtomicString& rawV alue, const CSSParserContext& context) 1781 static CSSValue* createCSSImageValueWithReferrer(const AtomicString& rawValue, c onst CSSParserContext& context)
1771 { 1782 {
1772 RawPtr<CSSValue> imageValue = CSSImageValue::create(rawValue, context.comple teURL(rawValue)); 1783 CSSValue* imageValue = CSSImageValue::create(rawValue, context.completeURL(r awValue));
1773 toCSSImageValue(imageValue.get())->setReferrer(context.referrer()); 1784 toCSSImageValue(imageValue)->setReferrer(context.referrer());
1774 return imageValue; 1785 return imageValue;
1775 } 1786 }
1776 1787
1777 static RawPtr<CSSValue> consumeImageSet(CSSParserTokenRange& range, const CSSPar serContext& context) 1788 static CSSValue* consumeImageSet(CSSParserTokenRange& range, const CSSParserCont ext& context)
1778 { 1789 {
1779 CSSParserTokenRange rangeCopy = range; 1790 CSSParserTokenRange rangeCopy = range;
1780 CSSParserTokenRange args = consumeFunction(rangeCopy); 1791 CSSParserTokenRange args = consumeFunction(rangeCopy);
1781 RawPtr<CSSImageSetValue> imageSet = CSSImageSetValue::create(); 1792 CSSImageSetValue* imageSet = CSSImageSetValue::create();
1782 do { 1793 do {
1783 AtomicString urlValue(consumeUrl(args)); 1794 AtomicString urlValue(consumeUrl(args));
1784 if (urlValue.isNull()) 1795 if (urlValue.isNull())
1785 return nullptr; 1796 return nullptr;
1786 1797
1787 RawPtr<CSSValue> image = createCSSImageValueWithReferrer(urlValue, conte xt); 1798 CSSValue* image = createCSSImageValueWithReferrer(urlValue, context);
1788 imageSet->append(image); 1799 imageSet->append(image);
1789 1800
1790 const CSSParserToken& token = args.consumeIncludingWhitespace(); 1801 const CSSParserToken& token = args.consumeIncludingWhitespace();
1791 if (token.type() != DimensionToken) 1802 if (token.type() != DimensionToken)
1792 return nullptr; 1803 return nullptr;
1793 if (String(token.value()) != "x") 1804 if (String(token.value()) != "x")
1794 return nullptr; 1805 return nullptr;
1795 ASSERT(token.unitType() == CSSPrimitiveValue::UnitType::Unknown); 1806 ASSERT(token.unitType() == CSSPrimitiveValue::UnitType::Unknown);
1796 double imageScaleFactor = token.numericValue(); 1807 double imageScaleFactor = token.numericValue();
1797 if (imageScaleFactor <= 0) 1808 if (imageScaleFactor <= 0)
1798 return nullptr; 1809 return nullptr;
1799 imageSet->append(cssValuePool().createValue(imageScaleFactor, CSSPrimiti veValue::UnitType::Number)); 1810 imageSet->append(cssValuePool().createValue(imageScaleFactor, CSSPrimiti veValue::UnitType::Number));
1800 } while (consumeCommaIncludingWhitespace(args)); 1811 } while (consumeCommaIncludingWhitespace(args));
1801 if (!args.atEnd()) 1812 if (!args.atEnd())
1802 return nullptr; 1813 return nullptr;
1803 range = rangeCopy; 1814 range = rangeCopy;
1804 return imageSet.release(); 1815 return imageSet;
1805 } 1816 }
1806 1817
1807 static RawPtr<CSSValue> consumeCursor(CSSParserTokenRange& range, const CSSParse rContext& context, bool inQuirksMode) 1818 static CSSValue* consumeCursor(CSSParserTokenRange& range, const CSSParserContex t& context, bool inQuirksMode)
1808 { 1819 {
1809 RawPtr<CSSValueList> list = nullptr; 1820 CSSValueList* list = nullptr;
1810 while (true) { 1821 while (true) {
1811 RawPtr<CSSValue> image = nullptr; 1822 CSSValue* image = nullptr;
1812 AtomicString uri(consumeUrl(range)); 1823 AtomicString uri(consumeUrl(range));
1813 if (!uri.isNull()) { 1824 if (!uri.isNull()) {
1814 image = createCSSImageValueWithReferrer(uri, context); 1825 image = createCSSImageValueWithReferrer(uri, context);
1815 } else if (range.peek().type() == FunctionToken && range.peek().function Id() == CSSValueWebkitImageSet) { 1826 } else if (range.peek().type() == FunctionToken && range.peek().function Id() == CSSValueWebkitImageSet) {
1816 image = consumeImageSet(range, context); 1827 image = consumeImageSet(range, context);
1817 if (!image) 1828 if (!image)
1818 return nullptr; 1829 return nullptr;
1819 } else { 1830 } else {
1820 break; 1831 break;
1821 } 1832 }
(...skipping 17 matching lines...) Expand all
1839 return nullptr; 1850 return nullptr;
1840 } 1851 }
1841 1852
1842 CSSValueID id = range.peek().id(); 1853 CSSValueID id = range.peek().id();
1843 if (!range.atEnd() && context.useCounter()) { 1854 if (!range.atEnd() && context.useCounter()) {
1844 if (id == CSSValueWebkitZoomIn) 1855 if (id == CSSValueWebkitZoomIn)
1845 context.useCounter()->count(UseCounter::PrefixedCursorZoomIn); 1856 context.useCounter()->count(UseCounter::PrefixedCursorZoomIn);
1846 else if (id == CSSValueWebkitZoomOut) 1857 else if (id == CSSValueWebkitZoomOut)
1847 context.useCounter()->count(UseCounter::PrefixedCursorZoomOut); 1858 context.useCounter()->count(UseCounter::PrefixedCursorZoomOut);
1848 } 1859 }
1849 RawPtr<CSSValue> cursorType = nullptr; 1860 CSSValue* cursorType = nullptr;
1850 if (id == CSSValueHand) { 1861 if (id == CSSValueHand) {
1851 if (!inQuirksMode) // Non-standard behavior 1862 if (!inQuirksMode) // Non-standard behavior
1852 return nullptr; 1863 return nullptr;
1853 cursorType = cssValuePool().createIdentifierValue(CSSValuePointer); 1864 cursorType = cssValuePool().createIdentifierValue(CSSValuePointer);
1854 range.consumeIncludingWhitespace(); 1865 range.consumeIncludingWhitespace();
1855 } else if ((id >= CSSValueAuto && id <= CSSValueWebkitZoomOut) || id == CSSV alueCopy || id == CSSValueNone) { 1866 } else if ((id >= CSSValueAuto && id <= CSSValueWebkitZoomOut) || id == CSSV alueCopy || id == CSSValueNone) {
1856 cursorType = consumeIdent(range); 1867 cursorType = consumeIdent(range);
1857 } else { 1868 } else {
1858 return nullptr; 1869 return nullptr;
1859 } 1870 }
1860 1871
1861 if (!list) 1872 if (!list)
1862 return cursorType.release(); 1873 return cursorType;
1863 list->append(cursorType.release()); 1874 list->append(cursorType);
1864 return list.release(); 1875 return list;
1865 } 1876 }
1866 1877
1867 // This should go away once we drop support for -webkit-gradient 1878 // This should go away once we drop support for -webkit-gradient
1868 static RawPtr<CSSPrimitiveValue> consumeDeprecatedGradientPoint(CSSParserTokenRa nge& args, bool horizontal) 1879 static CSSPrimitiveValue* consumeDeprecatedGradientPoint(CSSParserTokenRange& ar gs, bool horizontal)
1869 { 1880 {
1870 if (args.peek().type() == IdentToken) { 1881 if (args.peek().type() == IdentToken) {
1871 if ((horizontal && consumeIdent<CSSValueLeft>(args)) || (!horizontal && consumeIdent<CSSValueTop>(args))) 1882 if ((horizontal && consumeIdent<CSSValueLeft>(args)) || (!horizontal && consumeIdent<CSSValueTop>(args)))
1872 return cssValuePool().createValue(0., CSSPrimitiveValue::UnitType::P ercentage); 1883 return cssValuePool().createValue(0., CSSPrimitiveValue::UnitType::P ercentage);
1873 if ((horizontal && consumeIdent<CSSValueRight>(args)) || (!horizontal && consumeIdent<CSSValueBottom>(args))) 1884 if ((horizontal && consumeIdent<CSSValueRight>(args)) || (!horizontal && consumeIdent<CSSValueBottom>(args)))
1874 return cssValuePool().createValue(100., CSSPrimitiveValue::UnitType: :Percentage); 1885 return cssValuePool().createValue(100., CSSPrimitiveValue::UnitType: :Percentage);
1875 if (consumeIdent<CSSValueCenter>(args)) 1886 if (consumeIdent<CSSValueCenter>(args))
1876 return cssValuePool().createValue(50., CSSPrimitiveValue::UnitType:: Percentage); 1887 return cssValuePool().createValue(50., CSSPrimitiveValue::UnitType:: Percentage);
1877 return nullptr; 1888 return nullptr;
1878 } 1889 }
1879 RawPtr<CSSPrimitiveValue> result = consumePercent(args, ValueRangeAll); 1890 CSSPrimitiveValue* result = consumePercent(args, ValueRangeAll);
1880 if (!result) 1891 if (!result)
1881 result = consumeNumber(args, ValueRangeAll); 1892 result = consumeNumber(args, ValueRangeAll);
1882 return result; 1893 return result;
1883 } 1894 }
1884 1895
1885 // Used to parse colors for -webkit-gradient(...). 1896 // Used to parse colors for -webkit-gradient(...).
1886 static RawPtr<CSSValue> consumeDeprecatedGradientStopColor(CSSParserTokenRange& args, CSSParserMode cssParserMode) 1897 static CSSValue* consumeDeprecatedGradientStopColor(CSSParserTokenRange& args, C SSParserMode cssParserMode)
1887 { 1898 {
1888 if (args.peek().id() == CSSValueCurrentcolor) 1899 if (args.peek().id() == CSSValueCurrentcolor)
1889 return nullptr; 1900 return nullptr;
1890 return consumeColor(args, cssParserMode); 1901 return consumeColor(args, cssParserMode);
1891 } 1902 }
1892 1903
1893 static bool consumeDeprecatedGradientColorStop(CSSParserTokenRange& range, CSSGr adientColorStop& stop, CSSParserMode cssParserMode) 1904 static bool consumeDeprecatedGradientColorStop(CSSParserTokenRange& range, CSSGr adientColorStop& stop, CSSParserMode cssParserMode)
1894 { 1905 {
1895 CSSValueID id = range.peek().functionId(); 1906 CSSValueID id = range.peek().functionId();
1896 if (id != CSSValueFrom && id != CSSValueTo && id != CSSValueColorStop) 1907 if (id != CSSValueFrom && id != CSSValueTo && id != CSSValueColorStop)
(...skipping 15 matching lines...) Expand all
1912 1923
1913 if (!consumeCommaIncludingWhitespace(args)) 1924 if (!consumeCommaIncludingWhitespace(args))
1914 return false; 1925 return false;
1915 } 1926 }
1916 1927
1917 stop.m_position = cssValuePool().createValue(position, CSSPrimitiveValue::Un itType::Number); 1928 stop.m_position = cssValuePool().createValue(position, CSSPrimitiveValue::Un itType::Number);
1918 stop.m_color = consumeDeprecatedGradientStopColor(args, cssParserMode); 1929 stop.m_color = consumeDeprecatedGradientStopColor(args, cssParserMode);
1919 return stop.m_color && args.atEnd(); 1930 return stop.m_color && args.atEnd();
1920 } 1931 }
1921 1932
1922 static RawPtr<CSSValue> consumeDeprecatedGradient(CSSParserTokenRange& args, CSS ParserMode cssParserMode) 1933 static CSSValue* consumeDeprecatedGradient(CSSParserTokenRange& args, CSSParserM ode cssParserMode)
1923 { 1934 {
1924 RawPtr<CSSGradientValue> result = nullptr; 1935 CSSGradientValue* result = nullptr;
1925 CSSValueID id = args.consumeIncludingWhitespace().id(); 1936 CSSValueID id = args.consumeIncludingWhitespace().id();
1926 bool isDeprecatedRadialGradient = (id == CSSValueRadial); 1937 bool isDeprecatedRadialGradient = (id == CSSValueRadial);
1927 if (isDeprecatedRadialGradient) 1938 if (isDeprecatedRadialGradient)
1928 result = CSSRadialGradientValue::create(NonRepeating, CSSDeprecatedRadia lGradient); 1939 result = CSSRadialGradientValue::create(NonRepeating, CSSDeprecatedRadia lGradient);
1929 else if (id == CSSValueLinear) 1940 else if (id == CSSValueLinear)
1930 result = CSSLinearGradientValue::create(NonRepeating, CSSDeprecatedLinea rGradient); 1941 result = CSSLinearGradientValue::create(NonRepeating, CSSDeprecatedLinea rGradient);
1931 if (!result || !consumeCommaIncludingWhitespace(args)) 1942 if (!result || !consumeCommaIncludingWhitespace(args))
1932 return nullptr; 1943 return nullptr;
1933 1944
1934 RawPtr<CSSPrimitiveValue> point = consumeDeprecatedGradientPoint(args, true) ; 1945 CSSPrimitiveValue* point = consumeDeprecatedGradientPoint(args, true);
1935 if (!point) 1946 if (!point)
1936 return nullptr; 1947 return nullptr;
1937 result->setFirstX(point.release()); 1948 result->setFirstX(point);
1938 point = consumeDeprecatedGradientPoint(args, false); 1949 point = consumeDeprecatedGradientPoint(args, false);
1939 if (!point) 1950 if (!point)
1940 return nullptr; 1951 return nullptr;
1941 result->setFirstY(point.release()); 1952 result->setFirstY(point);
1942 1953
1943 if (!consumeCommaIncludingWhitespace(args)) 1954 if (!consumeCommaIncludingWhitespace(args))
1944 return nullptr; 1955 return nullptr;
1945 1956
1946 // For radial gradients only, we now expect a numeric radius. 1957 // For radial gradients only, we now expect a numeric radius.
1947 if (isDeprecatedRadialGradient) { 1958 if (isDeprecatedRadialGradient) {
1948 RawPtr<CSSPrimitiveValue> radius = consumeNumber(args, ValueRangeAll); 1959 CSSPrimitiveValue* radius = consumeNumber(args, ValueRangeAll);
1949 if (!radius || !consumeCommaIncludingWhitespace(args)) 1960 if (!radius || !consumeCommaIncludingWhitespace(args))
1950 return nullptr; 1961 return nullptr;
1951 toCSSRadialGradientValue(result.get())->setFirstRadius(radius.release()) ; 1962 toCSSRadialGradientValue(result)->setFirstRadius(radius);
1952 } 1963 }
1953 1964
1954 point = consumeDeprecatedGradientPoint(args, true); 1965 point = consumeDeprecatedGradientPoint(args, true);
1955 if (!point) 1966 if (!point)
1956 return nullptr; 1967 return nullptr;
1957 result->setSecondX(point.release()); 1968 result->setSecondX(point);
1958 point = consumeDeprecatedGradientPoint(args, false); 1969 point = consumeDeprecatedGradientPoint(args, false);
1959 if (!point) 1970 if (!point)
1960 return nullptr; 1971 return nullptr;
1961 result->setSecondY(point.release()); 1972 result->setSecondY(point);
1962 1973
1963 // For radial gradients only, we now expect the second radius. 1974 // For radial gradients only, we now expect the second radius.
1964 if (isDeprecatedRadialGradient) { 1975 if (isDeprecatedRadialGradient) {
1965 if (!consumeCommaIncludingWhitespace(args)) 1976 if (!consumeCommaIncludingWhitespace(args))
1966 return nullptr; 1977 return nullptr;
1967 RawPtr<CSSPrimitiveValue> radius = consumeNumber(args, ValueRangeAll); 1978 CSSPrimitiveValue* radius = consumeNumber(args, ValueRangeAll);
1968 if (!radius) 1979 if (!radius)
1969 return nullptr; 1980 return nullptr;
1970 toCSSRadialGradientValue(result.get())->setSecondRadius(radius.release() ); 1981 toCSSRadialGradientValue(result)->setSecondRadius(radius);
1971 } 1982 }
1972 1983
1973 CSSGradientColorStop stop; 1984 CSSGradientColorStop stop;
1974 while (consumeCommaIncludingWhitespace(args)) { 1985 while (consumeCommaIncludingWhitespace(args)) {
1975 if (!consumeDeprecatedGradientColorStop(args, stop, cssParserMode)) 1986 if (!consumeDeprecatedGradientColorStop(args, stop, cssParserMode))
1976 return nullptr; 1987 return nullptr;
1977 result->addStop(stop); 1988 result->addStop(stop);
1978 } 1989 }
1979 1990
1980 return result.release(); 1991 return result;
1981 } 1992 }
1982 1993
1983 static bool consumeGradientColorStops(CSSParserTokenRange& range, CSSParserMode cssParserMode, CSSGradientValue* gradient) 1994 static bool consumeGradientColorStops(CSSParserTokenRange& range, CSSParserMode cssParserMode, CSSGradientValue* gradient)
1984 { 1995 {
1985 bool supportsColorHints = gradient->gradientType() == CSSLinearGradient || g radient->gradientType() == CSSRadialGradient; 1996 bool supportsColorHints = gradient->gradientType() == CSSLinearGradient || g radient->gradientType() == CSSRadialGradient;
1986 1997
1987 // The first color stop cannot be a color hint. 1998 // The first color stop cannot be a color hint.
1988 bool previousStopWasColorHint = true; 1999 bool previousStopWasColorHint = true;
1989 do { 2000 do {
1990 CSSGradientColorStop stop; 2001 CSSGradientColorStop stop;
1991 stop.m_color = consumeColor(range, cssParserMode); 2002 stop.m_color = consumeColor(range, cssParserMode);
1992 // Two hints in a row are not allowed. 2003 // Two hints in a row are not allowed.
1993 if (!stop.m_color && (!supportsColorHints || previousStopWasColorHint)) 2004 if (!stop.m_color && (!supportsColorHints || previousStopWasColorHint))
1994 return false; 2005 return false;
1995 previousStopWasColorHint = !stop.m_color; 2006 previousStopWasColorHint = !stop.m_color;
1996 stop.m_position = consumeLengthOrPercent(range, cssParserMode, ValueRang eAll); 2007 stop.m_position = consumeLengthOrPercent(range, cssParserMode, ValueRang eAll);
1997 if (!stop.m_color && !stop.m_position) 2008 if (!stop.m_color && !stop.m_position)
1998 return false; 2009 return false;
1999 gradient->addStop(stop); 2010 gradient->addStop(stop);
2000 } while (consumeCommaIncludingWhitespace(range)); 2011 } while (consumeCommaIncludingWhitespace(range));
2001 2012
2002 // The last color stop cannot be a color hint. 2013 // The last color stop cannot be a color hint.
2003 if (previousStopWasColorHint) 2014 if (previousStopWasColorHint)
2004 return false; 2015 return false;
2005 2016
2006 // Must have 2 or more stops to be valid. 2017 // Must have 2 or more stops to be valid.
2007 return gradient->stopCount() >= 2; 2018 return gradient->stopCount() >= 2;
2008 } 2019 }
2009 2020
2010 static RawPtr<CSSValue> consumeDeprecatedRadialGradient(CSSParserTokenRange& arg s, CSSParserMode cssParserMode, CSSGradientRepeat repeating) 2021 static CSSValue* consumeDeprecatedRadialGradient(CSSParserTokenRange& args, CSSP arserMode cssParserMode, CSSGradientRepeat repeating)
2011 { 2022 {
2012 RawPtr<CSSRadialGradientValue> result = CSSRadialGradientValue::create(repea ting, CSSPrefixedRadialGradient); 2023 CSSRadialGradientValue* result = CSSRadialGradientValue::create(repeating, C SSPrefixedRadialGradient);
2013 RawPtr<CSSValue> centerX = nullptr; 2024 CSSValue* centerX = nullptr;
2014 RawPtr<CSSValue> centerY = nullptr; 2025 CSSValue* centerY = nullptr;
2015 consumeOneOrTwoValuedPosition(args, cssParserMode, UnitlessQuirk::Forbid, ce nterX, centerY); 2026 consumeOneOrTwoValuedPosition(args, cssParserMode, UnitlessQuirk::Forbid, ce nterX, centerY);
2016 if ((centerX || centerY) && !consumeCommaIncludingWhitespace(args)) 2027 if ((centerX || centerY) && !consumeCommaIncludingWhitespace(args))
2017 return nullptr; 2028 return nullptr;
2018 2029
2019 result->setFirstX(toCSSPrimitiveValue(centerX.get())); 2030 result->setFirstX(toCSSPrimitiveValue(centerX));
2020 result->setSecondX(toCSSPrimitiveValue(centerX.get())); 2031 result->setSecondX(toCSSPrimitiveValue(centerX));
2021 result->setFirstY(toCSSPrimitiveValue(centerY.get())); 2032 result->setFirstY(toCSSPrimitiveValue(centerY));
2022 result->setSecondY(toCSSPrimitiveValue(centerY.get())); 2033 result->setSecondY(toCSSPrimitiveValue(centerY));
2023 2034
2024 RawPtr<CSSPrimitiveValue> shape = consumeIdent<CSSValueCircle, CSSValueEllip se>(args); 2035 CSSPrimitiveValue* shape = consumeIdent<CSSValueCircle, CSSValueEllipse>(arg s);
2025 RawPtr<CSSPrimitiveValue> sizeKeyword = consumeIdent<CSSValueClosestSide, CS SValueClosestCorner, CSSValueFarthestSide, CSSValueFarthestCorner, CSSValueConta in, CSSValueCover>(args); 2036 CSSPrimitiveValue* sizeKeyword = consumeIdent<CSSValueClosestSide, CSSValueC losestCorner, CSSValueFarthestSide, CSSValueFarthestCorner, CSSValueContain, CSS ValueCover>(args);
2026 if (!shape) 2037 if (!shape)
2027 shape = consumeIdent<CSSValueCircle, CSSValueEllipse>(args); 2038 shape = consumeIdent<CSSValueCircle, CSSValueEllipse>(args);
2028 result->setShape(shape); 2039 result->setShape(shape);
2029 result->setSizingBehavior(sizeKeyword); 2040 result->setSizingBehavior(sizeKeyword);
2030 2041
2031 // Or, two lengths or percentages 2042 // Or, two lengths or percentages
2032 if (!shape && !sizeKeyword) { 2043 if (!shape && !sizeKeyword) {
2033 RawPtr<CSSPrimitiveValue> horizontalSize = nullptr; 2044 CSSPrimitiveValue* horizontalSize = consumeLengthOrPercent(args, cssPars erMode, ValueRangeAll);
2034 RawPtr<CSSPrimitiveValue> verticalSize = nullptr; 2045 CSSPrimitiveValue* verticalSize = nullptr;
2035 if ((horizontalSize = consumeLengthOrPercent(args, cssParserMode, ValueR angeAll))) { 2046 if (horizontalSize) {
2036 verticalSize = consumeLengthOrPercent(args, cssParserMode, ValueRang eAll); 2047 verticalSize = consumeLengthOrPercent(args, cssParserMode, ValueRang eAll);
2037 if (!verticalSize) 2048 if (!verticalSize)
2038 return nullptr; 2049 return nullptr;
2039 consumeCommaIncludingWhitespace(args); 2050 consumeCommaIncludingWhitespace(args);
2040 result->setEndHorizontalSize(horizontalSize); 2051 result->setEndHorizontalSize(horizontalSize);
2041 result->setEndVerticalSize(verticalSize); 2052 result->setEndVerticalSize(verticalSize);
2042 } 2053 }
2043 } else { 2054 } else {
2044 consumeCommaIncludingWhitespace(args); 2055 consumeCommaIncludingWhitespace(args);
2045 } 2056 }
2046 if (!consumeGradientColorStops(args, cssParserMode, result.get())) 2057 if (!consumeGradientColorStops(args, cssParserMode, result))
2047 return nullptr; 2058 return nullptr;
2048 2059
2049 return result.release(); 2060 return result;
2050 } 2061 }
2051 2062
2052 static RawPtr<CSSValue> consumeRadialGradient(CSSParserTokenRange& args, CSSPars erMode cssParserMode, CSSGradientRepeat repeating) 2063 static CSSValue* consumeRadialGradient(CSSParserTokenRange& args, CSSParserMode cssParserMode, CSSGradientRepeat repeating)
2053 { 2064 {
2054 RawPtr<CSSRadialGradientValue> result = CSSRadialGradientValue::create(repea ting, CSSRadialGradient); 2065 CSSRadialGradientValue* result = CSSRadialGradientValue::create(repeating, C SSRadialGradient);
2055 2066
2056 RawPtr<CSSPrimitiveValue> shape = nullptr; 2067 CSSPrimitiveValue* shape = nullptr;
2057 RawPtr<CSSPrimitiveValue> sizeKeyword = nullptr; 2068 CSSPrimitiveValue* sizeKeyword = nullptr;
2058 RawPtr<CSSPrimitiveValue> horizontalSize = nullptr; 2069 CSSPrimitiveValue* horizontalSize = nullptr;
2059 RawPtr<CSSPrimitiveValue> verticalSize = nullptr; 2070 CSSPrimitiveValue* verticalSize = nullptr;
2060 2071
2061 // First part of grammar, the size/shape clause: 2072 // First part of grammar, the size/shape clause:
2062 // [ circle || <length> ] | 2073 // [ circle || <length> ] |
2063 // [ ellipse || [ <length> | <percentage> ]{2} ] | 2074 // [ ellipse || [ <length> | <percentage> ]{2} ] |
2064 // [ [ circle | ellipse] || <size-keyword> ] 2075 // [ [ circle | ellipse] || <size-keyword> ]
2065 for (int i = 0; i < 3; ++i) { 2076 for (int i = 0; i < 3; ++i) {
2066 if (args.peek().type() == IdentToken) { 2077 if (args.peek().type() == IdentToken) {
2067 CSSValueID id = args.peek().id(); 2078 CSSValueID id = args.peek().id();
2068 if (id == CSSValueCircle || id == CSSValueEllipse) { 2079 if (id == CSSValueCircle || id == CSSValueEllipse) {
2069 if (shape) 2080 if (shape)
2070 return nullptr; 2081 return nullptr;
2071 shape = consumeIdent(args); 2082 shape = consumeIdent(args);
2072 } else if (id == CSSValueClosestSide || id == CSSValueClosestCorner || id == CSSValueFarthestSide || id == CSSValueFarthestCorner) { 2083 } else if (id == CSSValueClosestSide || id == CSSValueClosestCorner || id == CSSValueFarthestSide || id == CSSValueFarthestCorner) {
2073 if (sizeKeyword) 2084 if (sizeKeyword)
2074 return nullptr; 2085 return nullptr;
2075 sizeKeyword = consumeIdent(args); 2086 sizeKeyword = consumeIdent(args);
2076 } else { 2087 } else {
2077 break; 2088 break;
2078 } 2089 }
2079 } else { 2090 } else {
2080 RawPtr<CSSPrimitiveValue> center = consumeLengthOrPercent(args, cssP arserMode, ValueRangeAll); 2091 CSSPrimitiveValue* center = consumeLengthOrPercent(args, cssParserMo de, ValueRangeAll);
2081 if (!center) 2092 if (!center)
2082 break; 2093 break;
2083 if (horizontalSize) 2094 if (horizontalSize)
2084 return nullptr; 2095 return nullptr;
2085 horizontalSize = center; 2096 horizontalSize = center;
2086 if ((center = consumeLengthOrPercent(args, cssParserMode, ValueRange All))) { 2097 center = consumeLengthOrPercent(args, cssParserMode, ValueRangeAll);
2087 verticalSize = center.release(); 2098 if (center) {
2099 verticalSize = center;
2088 ++i; 2100 ++i;
2089 } 2101 }
2090 } 2102 }
2091 } 2103 }
2092 2104
2093 // You can specify size as a keyword or a length/percentage, not both. 2105 // You can specify size as a keyword or a length/percentage, not both.
2094 if (sizeKeyword && horizontalSize) 2106 if (sizeKeyword && horizontalSize)
2095 return nullptr; 2107 return nullptr;
2096 // Circles must have 0 or 1 lengths. 2108 // Circles must have 0 or 1 lengths.
2097 if (shape && shape->getValueID() == CSSValueCircle && verticalSize) 2109 if (shape && shape->getValueID() == CSSValueCircle && verticalSize)
2098 return nullptr; 2110 return nullptr;
2099 // Ellipses must have 0 or 2 length/percentages. 2111 // Ellipses must have 0 or 2 length/percentages.
2100 if (shape && shape->getValueID() == CSSValueEllipse && horizontalSize && !ve rticalSize) 2112 if (shape && shape->getValueID() == CSSValueEllipse && horizontalSize && !ve rticalSize)
2101 return nullptr; 2113 return nullptr;
2102 // If there's only one size, it must be a length. 2114 // If there's only one size, it must be a length.
2103 // TODO(timloh): Calcs with both lengths and percentages should be rejected. 2115 // TODO(timloh): Calcs with both lengths and percentages should be rejected.
2104 if (!verticalSize && horizontalSize && horizontalSize->isPercentage()) 2116 if (!verticalSize && horizontalSize && horizontalSize->isPercentage())
2105 return nullptr; 2117 return nullptr;
2106 2118
2107 result->setShape(shape); 2119 result->setShape(shape);
2108 result->setSizingBehavior(sizeKeyword); 2120 result->setSizingBehavior(sizeKeyword);
2109 result->setEndHorizontalSize(horizontalSize); 2121 result->setEndHorizontalSize(horizontalSize);
2110 result->setEndVerticalSize(verticalSize); 2122 result->setEndVerticalSize(verticalSize);
2111 2123
2112 RawPtr<CSSValue> centerX = nullptr; 2124 CSSValue* centerX = nullptr;
2113 RawPtr<CSSValue> centerY = nullptr; 2125 CSSValue* centerY = nullptr;
2114 if (args.peek().id() == CSSValueAt) { 2126 if (args.peek().id() == CSSValueAt) {
2115 args.consumeIncludingWhitespace(); 2127 args.consumeIncludingWhitespace();
2116 consumePosition(args, cssParserMode, UnitlessQuirk::Forbid, centerX, cen terY); 2128 consumePosition(args, cssParserMode, UnitlessQuirk::Forbid, centerX, cen terY);
2117 if (!(centerX && centerY)) 2129 if (!(centerX && centerY))
2118 return nullptr; 2130 return nullptr;
2119 result->setFirstX(centerX); 2131 result->setFirstX(centerX);
2120 result->setFirstY(centerY); 2132 result->setFirstY(centerY);
2121 // Right now, CSS radial gradients have the same start and end centers. 2133 // Right now, CSS radial gradients have the same start and end centers.
2122 result->setSecondX(centerX); 2134 result->setSecondX(centerX);
2123 result->setSecondY(centerY); 2135 result->setSecondY(centerY);
2124 } 2136 }
2125 2137
2126 if ((shape || sizeKeyword || horizontalSize || centerX || centerY) && !consu meCommaIncludingWhitespace(args)) 2138 if ((shape || sizeKeyword || horizontalSize || centerX || centerY) && !consu meCommaIncludingWhitespace(args))
2127 return nullptr; 2139 return nullptr;
2128 if (!consumeGradientColorStops(args, cssParserMode, result.get())) 2140 if (!consumeGradientColorStops(args, cssParserMode, result))
2129 return nullptr; 2141 return nullptr;
2130 return result.release(); 2142 return result;
2131 } 2143 }
2132 2144
2133 static RawPtr<CSSValue> consumeLinearGradient(CSSParserTokenRange& args, CSSPars erMode cssParserMode, CSSGradientRepeat repeating, CSSGradientType gradientType) 2145 static CSSValue* consumeLinearGradient(CSSParserTokenRange& args, CSSParserMode cssParserMode, CSSGradientRepeat repeating, CSSGradientType gradientType)
2134 { 2146 {
2135 RawPtr<CSSLinearGradientValue> result = CSSLinearGradientValue::create(repea ting, gradientType); 2147 CSSLinearGradientValue* result = CSSLinearGradientValue::create(repeating, g radientType);
2136 2148
2137 bool expectComma = true; 2149 bool expectComma = true;
2138 RawPtr<CSSPrimitiveValue> angle = consumeAngle(args); 2150 CSSPrimitiveValue* angle = consumeAngle(args);
2139 if (angle) { 2151 if (angle) {
2140 result->setAngle(angle.release()); 2152 result->setAngle(angle);
2141 } else if (gradientType == CSSPrefixedLinearGradient || consumeIdent<CSSValu eTo>(args)) { 2153 } else if (gradientType == CSSPrefixedLinearGradient || consumeIdent<CSSValu eTo>(args)) {
2142 RawPtr<CSSPrimitiveValue> endX = consumeIdent<CSSValueLeft, CSSValueRigh t>(args); 2154 CSSPrimitiveValue* endX = consumeIdent<CSSValueLeft, CSSValueRight>(args );
2143 RawPtr<CSSPrimitiveValue> endY = consumeIdent<CSSValueBottom, CSSValueTo p>(args); 2155 CSSPrimitiveValue* endY = consumeIdent<CSSValueBottom, CSSValueTop>(args );
2144 if (!endX && !endY) { 2156 if (!endX && !endY) {
2145 if (gradientType == CSSLinearGradient) 2157 if (gradientType == CSSLinearGradient)
2146 return nullptr; 2158 return nullptr;
2147 endY = cssValuePool().createIdentifierValue(CSSValueTop); 2159 endY = cssValuePool().createIdentifierValue(CSSValueTop);
2148 expectComma = false; 2160 expectComma = false;
2149 } else if (!endX) { 2161 } else if (!endX) {
2150 endX = consumeIdent<CSSValueLeft, CSSValueRight>(args); 2162 endX = consumeIdent<CSSValueLeft, CSSValueRight>(args);
2151 } 2163 }
2152 2164
2153 result->setFirstX(endX.release()); 2165 result->setFirstX(endX);
2154 result->setFirstY(endY.release()); 2166 result->setFirstY(endY);
2155 } else { 2167 } else {
2156 expectComma = false; 2168 expectComma = false;
2157 } 2169 }
2158 2170
2159 if (expectComma && !consumeCommaIncludingWhitespace(args)) 2171 if (expectComma && !consumeCommaIncludingWhitespace(args))
2160 return nullptr; 2172 return nullptr;
2161 if (!consumeGradientColorStops(args, cssParserMode, result.get())) 2173 if (!consumeGradientColorStops(args, cssParserMode, result))
2162 return nullptr; 2174 return nullptr;
2163 return result.release(); 2175 return result;
2164 } 2176 }
2165 2177
2166 static RawPtr<CSSValue> consumeImageOrNone(CSSParserTokenRange&, CSSParserContex t); 2178 static CSSValue* consumeImageOrNone(CSSParserTokenRange&, CSSParserContext);
2167 2179
2168 static RawPtr<CSSValue> consumeCrossFade(CSSParserTokenRange& args, CSSParserCon text context) 2180 static CSSValue* consumeCrossFade(CSSParserTokenRange& args, CSSParserContext co ntext)
2169 { 2181 {
2170 RawPtr<CSSValue> fromImageValue = consumeImageOrNone(args, context); 2182 CSSValue* fromImageValue = consumeImageOrNone(args, context);
2171 if (!fromImageValue || !consumeCommaIncludingWhitespace(args)) 2183 if (!fromImageValue || !consumeCommaIncludingWhitespace(args))
2172 return nullptr; 2184 return nullptr;
2173 RawPtr<CSSValue> toImageValue = consumeImageOrNone(args, context); 2185 CSSValue* toImageValue = consumeImageOrNone(args, context);
2174 if (!toImageValue || !consumeCommaIncludingWhitespace(args)) 2186 if (!toImageValue || !consumeCommaIncludingWhitespace(args))
2175 return nullptr; 2187 return nullptr;
2176 2188
2177 RawPtr<CSSPrimitiveValue> percentage = nullptr; 2189 CSSPrimitiveValue* percentage = nullptr;
2178 const CSSParserToken& percentageArg = args.consumeIncludingWhitespace(); 2190 const CSSParserToken& percentageArg = args.consumeIncludingWhitespace();
2179 if (percentageArg.type() == PercentageToken) 2191 if (percentageArg.type() == PercentageToken)
2180 percentage = cssValuePool().createValue(clampTo<double>(percentageArg.nu mericValue() / 100, 0, 1), CSSPrimitiveValue::UnitType::Number); 2192 percentage = cssValuePool().createValue(clampTo<double>(percentageArg.nu mericValue() / 100, 0, 1), CSSPrimitiveValue::UnitType::Number);
2181 else if (percentageArg.type() == NumberToken) 2193 else if (percentageArg.type() == NumberToken)
2182 percentage = cssValuePool().createValue(clampTo<double>(percentageArg.nu mericValue(), 0, 1), CSSPrimitiveValue::UnitType::Number); 2194 percentage = cssValuePool().createValue(clampTo<double>(percentageArg.nu mericValue(), 0, 1), CSSPrimitiveValue::UnitType::Number);
2183 2195
2184 if (!percentage) 2196 if (!percentage)
2185 return nullptr; 2197 return nullptr;
2186 return CSSCrossfadeValue::create(fromImageValue, toImageValue, percentage); 2198 return CSSCrossfadeValue::create(fromImageValue, toImageValue, percentage);
2187 } 2199 }
2188 2200
2189 static RawPtr<CSSValue> consumePaint(CSSParserTokenRange& args, CSSParserContext context) 2201 static CSSValue* consumePaint(CSSParserTokenRange& args, CSSParserContext contex t)
2190 { 2202 {
2191 ASSERT(RuntimeEnabledFeatures::cssPaintAPIEnabled()); 2203 ASSERT(RuntimeEnabledFeatures::cssPaintAPIEnabled());
2192 2204
2193 RawPtr<CSSCustomIdentValue> name = consumeCustomIdent(args); 2205 CSSCustomIdentValue* name = consumeCustomIdent(args);
2194 if (!name) 2206 if (!name)
2195 return nullptr; 2207 return nullptr;
2196 2208
2197 return CSSPaintValue::create(name.release()); 2209 return CSSPaintValue::create(name);
2198 } 2210 }
2199 2211
2200 static RawPtr<CSSValue> consumeGeneratedImage(CSSParserTokenRange& range, CSSPar serContext context) 2212 static CSSValue* consumeGeneratedImage(CSSParserTokenRange& range, CSSParserCont ext context)
2201 { 2213 {
2202 CSSValueID id = range.peek().functionId(); 2214 CSSValueID id = range.peek().functionId();
2203 CSSParserTokenRange rangeCopy = range; 2215 CSSParserTokenRange rangeCopy = range;
2204 CSSParserTokenRange args = consumeFunction(rangeCopy); 2216 CSSParserTokenRange args = consumeFunction(rangeCopy);
2205 RawPtr<CSSValue> result = nullptr; 2217 CSSValue* result = nullptr;
2206 if (id == CSSValueRadialGradient) { 2218 if (id == CSSValueRadialGradient) {
2207 result = consumeRadialGradient(args, context.mode(), NonRepeating); 2219 result = consumeRadialGradient(args, context.mode(), NonRepeating);
2208 } else if (id == CSSValueRepeatingRadialGradient) { 2220 } else if (id == CSSValueRepeatingRadialGradient) {
2209 result = consumeRadialGradient(args, context.mode(), Repeating); 2221 result = consumeRadialGradient(args, context.mode(), Repeating);
2210 } else if (id == CSSValueWebkitLinearGradient) { 2222 } else if (id == CSSValueWebkitLinearGradient) {
2211 // FIXME: This should send a deprecation message. 2223 // FIXME: This should send a deprecation message.
2212 if (context.useCounter()) 2224 if (context.useCounter())
2213 context.useCounter()->count(UseCounter::DeprecatedWebKitLinearGradie nt); 2225 context.useCounter()->count(UseCounter::DeprecatedWebKitLinearGradie nt);
2214 result = consumeLinearGradient(args, context.mode(), NonRepeating, CSSPr efixedLinearGradient); 2226 result = consumeLinearGradient(args, context.mode(), NonRepeating, CSSPr efixedLinearGradient);
2215 } else if (id == CSSValueWebkitRepeatingLinearGradient) { 2227 } else if (id == CSSValueWebkitRepeatingLinearGradient) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2248 2260
2249 static bool isGeneratedImage(CSSValueID id) 2261 static bool isGeneratedImage(CSSValueID id)
2250 { 2262 {
2251 return id == CSSValueLinearGradient || id == CSSValueRadialGradient 2263 return id == CSSValueLinearGradient || id == CSSValueRadialGradient
2252 || id == CSSValueRepeatingLinearGradient || id == CSSValueRepeatingRadia lGradient 2264 || id == CSSValueRepeatingLinearGradient || id == CSSValueRepeatingRadia lGradient
2253 || id == CSSValueWebkitLinearGradient || id == CSSValueWebkitRadialGradi ent 2265 || id == CSSValueWebkitLinearGradient || id == CSSValueWebkitRadialGradi ent
2254 || id == CSSValueWebkitRepeatingLinearGradient || id == CSSValueWebkitRe peatingRadialGradient 2266 || id == CSSValueWebkitRepeatingLinearGradient || id == CSSValueWebkitRe peatingRadialGradient
2255 || id == CSSValueWebkitGradient || id == CSSValueWebkitCrossFade || id = = CSSValuePaint; 2267 || id == CSSValueWebkitGradient || id == CSSValueWebkitCrossFade || id = = CSSValuePaint;
2256 } 2268 }
2257 2269
2258 static RawPtr<CSSValue> consumeImage(CSSParserTokenRange& range, CSSParserContex t context) 2270 static CSSValue* consumeImage(CSSParserTokenRange& range, CSSParserContext conte xt)
2259 { 2271 {
2260 AtomicString uri(consumeUrl(range)); 2272 AtomicString uri(consumeUrl(range));
2261 if (!uri.isNull()) 2273 if (!uri.isNull())
2262 return createCSSImageValueWithReferrer(uri, context); 2274 return createCSSImageValueWithReferrer(uri, context);
2263 if (range.peek().type() == FunctionToken) { 2275 if (range.peek().type() == FunctionToken) {
2264 CSSValueID id = range.peek().functionId(); 2276 CSSValueID id = range.peek().functionId();
2265 if (id == CSSValueWebkitImageSet) 2277 if (id == CSSValueWebkitImageSet)
2266 return consumeImageSet(range, context); 2278 return consumeImageSet(range, context);
2267 if (isGeneratedImage(id)) 2279 if (isGeneratedImage(id))
2268 return consumeGeneratedImage(range, context); 2280 return consumeGeneratedImage(range, context);
2269 } 2281 }
2270 return nullptr; 2282 return nullptr;
2271 } 2283 }
2272 2284
2273 static RawPtr<CSSValue> consumeImageOrNone(CSSParserTokenRange& range, CSSParser Context context) 2285 static CSSValue* consumeImageOrNone(CSSParserTokenRange& range, CSSParserContext context)
2274 { 2286 {
2275 if (range.peek().id() == CSSValueNone) 2287 if (range.peek().id() == CSSValueNone)
2276 return consumeIdent(range); 2288 return consumeIdent(range);
2277 return consumeImage(range, context); 2289 return consumeImage(range, context);
2278 } 2290 }
2279 2291
2280 static RawPtr<CSSValue> consumeAttr(CSSParserTokenRange args, CSSParserContext c ontext) 2292 static CSSValue* consumeAttr(CSSParserTokenRange args, CSSParserContext context)
2281 { 2293 {
2282 if (args.peek().type() != IdentToken) 2294 if (args.peek().type() != IdentToken)
2283 return nullptr; 2295 return nullptr;
2284 2296
2285 String attrName = args.consumeIncludingWhitespace().value(); 2297 String attrName = args.consumeIncludingWhitespace().value();
2286 // CSS allows identifiers with "-" at the start, like "-webkit-mask-image". 2298 // CSS allows identifiers with "-" at the start, like "-webkit-mask-image".
2287 // But HTML attribute names can't have those characters, and we should not 2299 // But HTML attribute names can't have those characters, and we should not
2288 // even parse them inside attr(). 2300 // even parse them inside attr().
2289 // TODO(timloh): We should allow any <ident-token> here. 2301 // TODO(timloh): We should allow any <ident-token> here.
2290 if (attrName[0] == '-' || !args.atEnd()) 2302 if (attrName[0] == '-' || !args.atEnd())
2291 return nullptr; 2303 return nullptr;
2292 2304
2293 if (context.isHTMLDocument()) 2305 if (context.isHTMLDocument())
2294 attrName = attrName.lower(); 2306 attrName = attrName.lower();
2295 2307
2296 RawPtr<CSSFunctionValue> attrValue = CSSFunctionValue::create(CSSValueAttr); 2308 CSSFunctionValue* attrValue = CSSFunctionValue::create(CSSValueAttr);
2297 attrValue->append(CSSCustomIdentValue::create(attrName)); 2309 attrValue->append(CSSCustomIdentValue::create(attrName));
2298 return attrValue.release(); 2310 return attrValue;
2299 } 2311 }
2300 2312
2301 static RawPtr<CSSValue> consumeCounterContent(CSSParserTokenRange args, bool cou nters) 2313 static CSSValue* consumeCounterContent(CSSParserTokenRange args, bool counters)
2302 { 2314 {
2303 RawPtr<CSSCustomIdentValue> identifier = consumeCustomIdent(args); 2315 CSSCustomIdentValue* identifier = consumeCustomIdent(args);
2304 if (!identifier) 2316 if (!identifier)
2305 return nullptr; 2317 return nullptr;
2306 2318
2307 // TODO(timloh): Make this a CSSStringValue. 2319 // TODO(timloh): Make this a CSSStringValue.
2308 RawPtr<CSSCustomIdentValue> separator = nullptr; 2320 CSSCustomIdentValue* separator = nullptr;
2309 if (!counters) { 2321 if (!counters) {
2310 separator = CSSCustomIdentValue::create(String()); 2322 separator = CSSCustomIdentValue::create(String());
2311 } else { 2323 } else {
2312 if (!consumeCommaIncludingWhitespace(args)) 2324 if (!consumeCommaIncludingWhitespace(args))
2313 return nullptr; 2325 return nullptr;
2314 if (args.peek().type() != StringToken) 2326 if (args.peek().type() != StringToken)
2315 return nullptr; 2327 return nullptr;
2316 separator = CSSCustomIdentValue::create(args.consumeIncludingWhitespace( ).value()); 2328 separator = CSSCustomIdentValue::create(args.consumeIncludingWhitespace( ).value());
2317 } 2329 }
2318 2330
2319 RawPtr<CSSPrimitiveValue> listStyle = nullptr; 2331 CSSPrimitiveValue* listStyle = nullptr;
2320 if (consumeCommaIncludingWhitespace(args)) { 2332 if (consumeCommaIncludingWhitespace(args)) {
2321 CSSValueID id = args.peek().id(); 2333 CSSValueID id = args.peek().id();
2322 if ((id != CSSValueNone && (id < CSSValueDisc || id > CSSValueKatakanaIr oha))) 2334 if ((id != CSSValueNone && (id < CSSValueDisc || id > CSSValueKatakanaIr oha)))
2323 return nullptr; 2335 return nullptr;
2324 listStyle = consumeIdent(args); 2336 listStyle = consumeIdent(args);
2325 } else { 2337 } else {
2326 listStyle = cssValuePool().createIdentifierValue(CSSValueDecimal); 2338 listStyle = cssValuePool().createIdentifierValue(CSSValueDecimal);
2327 } 2339 }
2328 2340
2329 if (!args.atEnd()) 2341 if (!args.atEnd())
2330 return nullptr; 2342 return nullptr;
2331 return CSSCounterValue::create(identifier.release(), listStyle.release(), se parator.release()); 2343 return CSSCounterValue::create(identifier, listStyle, separator);
2332 } 2344 }
2333 2345
2334 static RawPtr<CSSValue> consumeContent(CSSParserTokenRange& range, CSSParserCont ext context) 2346 static CSSValue* consumeContent(CSSParserTokenRange& range, CSSParserContext con text)
2335 { 2347 {
2336 if (identMatches<CSSValueNone, CSSValueNormal>(range.peek().id())) 2348 if (identMatches<CSSValueNone, CSSValueNormal>(range.peek().id()))
2337 return consumeIdent(range); 2349 return consumeIdent(range);
2338 2350
2339 RawPtr<CSSValueList> values = CSSValueList::createSpaceSeparated(); 2351 CSSValueList* values = CSSValueList::createSpaceSeparated();
2340 2352
2341 do { 2353 do {
2342 RawPtr<CSSValue> parsedValue = consumeImage(range, context); 2354 CSSValue* parsedValue = consumeImage(range, context);
2343 if (!parsedValue) 2355 if (!parsedValue)
2344 parsedValue = consumeIdent<CSSValueOpenQuote, CSSValueCloseQuote, CS SValueNoOpenQuote, CSSValueNoCloseQuote>(range); 2356 parsedValue = consumeIdent<CSSValueOpenQuote, CSSValueCloseQuote, CS SValueNoOpenQuote, CSSValueNoCloseQuote>(range);
2345 if (!parsedValue) 2357 if (!parsedValue)
2346 parsedValue = consumeString(range); 2358 parsedValue = consumeString(range);
2347 if (!parsedValue) { 2359 if (!parsedValue) {
2348 if (range.peek().functionId() == CSSValueAttr) 2360 if (range.peek().functionId() == CSSValueAttr)
2349 parsedValue = consumeAttr(consumeFunction(range), context); 2361 parsedValue = consumeAttr(consumeFunction(range), context);
2350 else if (range.peek().functionId() == CSSValueCounter) 2362 else if (range.peek().functionId() == CSSValueCounter)
2351 parsedValue = consumeCounterContent(consumeFunction(range), fals e); 2363 parsedValue = consumeCounterContent(consumeFunction(range), fals e);
2352 else if (range.peek().functionId() == CSSValueCounters) 2364 else if (range.peek().functionId() == CSSValueCounters)
2353 parsedValue = consumeCounterContent(consumeFunction(range), true ); 2365 parsedValue = consumeCounterContent(consumeFunction(range), true );
2354 if (!parsedValue) 2366 if (!parsedValue)
2355 return nullptr; 2367 return nullptr;
2356 } 2368 }
2357 values->append(parsedValue.release()); 2369 values->append(parsedValue);
2358 } while (!range.atEnd()); 2370 } while (!range.atEnd());
2359 2371
2360 return values.release(); 2372 return values;
2361 } 2373 }
2362 2374
2363 static RawPtr<CSSPrimitiveValue> consumePerspective(CSSParserTokenRange& range, CSSParserMode cssParserMode, CSSPropertyID unresolvedProperty) 2375 static CSSPrimitiveValue* consumePerspective(CSSParserTokenRange& range, CSSPars erMode cssParserMode, CSSPropertyID unresolvedProperty)
2364 { 2376 {
2365 if (range.peek().id() == CSSValueNone) 2377 if (range.peek().id() == CSSValueNone)
2366 return consumeIdent(range); 2378 return consumeIdent(range);
2367 RawPtr<CSSPrimitiveValue> parsedValue = consumeLength(range, cssParserMode, ValueRangeAll); 2379 CSSPrimitiveValue* parsedValue = consumeLength(range, cssParserMode, ValueRa ngeAll);
2368 if (!parsedValue && (unresolvedProperty == CSSPropertyAliasWebkitPerspective )) { 2380 if (!parsedValue && (unresolvedProperty == CSSPropertyAliasWebkitPerspective )) {
2369 double perspective; 2381 double perspective;
2370 if (!consumeNumberRaw(range, perspective)) 2382 if (!consumeNumberRaw(range, perspective))
2371 return nullptr; 2383 return nullptr;
2372 parsedValue = cssValuePool().createValue(perspective, CSSPrimitiveValue: :UnitType::Pixels); 2384 parsedValue = cssValuePool().createValue(perspective, CSSPrimitiveValue: :UnitType::Pixels);
2373 } 2385 }
2374 if (parsedValue && (parsedValue->isCalculated() || parsedValue->getDoubleVal ue() > 0)) 2386 if (parsedValue && (parsedValue->isCalculated() || parsedValue->getDoubleVal ue() > 0))
2375 return parsedValue.release(); 2387 return parsedValue;
2376 return nullptr; 2388 return nullptr;
2377 } 2389 }
2378 2390
2379 static RawPtr<CSSValueList> consumePositionList(CSSParserTokenRange& range, CSSP arserMode cssParserMode) 2391 static CSSValueList* consumePositionList(CSSParserTokenRange& range, CSSParserMo de cssParserMode)
2380 { 2392 {
2381 RawPtr<CSSValueList> positions = CSSValueList::createCommaSeparated(); 2393 CSSValueList* positions = CSSValueList::createCommaSeparated();
2382 do { 2394 do {
2383 RawPtr<CSSValue> position = consumePosition(range, cssParserMode, Unitle ssQuirk::Forbid); 2395 CSSValue* position = consumePosition(range, cssParserMode, UnitlessQuirk ::Forbid);
2384 if (!position) 2396 if (!position)
2385 return nullptr; 2397 return nullptr;
2386 positions->append(position); 2398 positions->append(position);
2387 } while (consumeCommaIncludingWhitespace(range)); 2399 } while (consumeCommaIncludingWhitespace(range));
2388 return positions.release(); 2400 return positions;
2389 } 2401 }
2390 2402
2391 static RawPtr<CSSValue> consumeScrollSnapCoordinate(CSSParserTokenRange& range, CSSParserMode cssParserMode) 2403 static CSSValue* consumeScrollSnapCoordinate(CSSParserTokenRange& range, CSSPars erMode cssParserMode)
2392 { 2404 {
2393 if (range.peek().id() == CSSValueNone) 2405 if (range.peek().id() == CSSValueNone)
2394 return consumeIdent(range); 2406 return consumeIdent(range);
2395 return consumePositionList(range, cssParserMode); 2407 return consumePositionList(range, cssParserMode);
2396 } 2408 }
2397 2409
2398 static RawPtr<CSSValue> consumeScrollSnapPoints(CSSParserTokenRange& range, CSSP arserMode cssParserMode) 2410 static CSSValue* consumeScrollSnapPoints(CSSParserTokenRange& range, CSSParserMo de cssParserMode)
2399 { 2411 {
2400 if (range.peek().id() == CSSValueNone) 2412 if (range.peek().id() == CSSValueNone)
2401 return consumeIdent(range); 2413 return consumeIdent(range);
2402 if (range.peek().functionId() == CSSValueRepeat) { 2414 if (range.peek().functionId() == CSSValueRepeat) {
2403 CSSParserTokenRange args = consumeFunction(range); 2415 CSSParserTokenRange args = consumeFunction(range);
2404 RawPtr<CSSPrimitiveValue> parsedValue = consumeLengthOrPercent(args, css ParserMode, ValueRangeNonNegative); 2416 CSSPrimitiveValue* parsedValue = consumeLengthOrPercent(args, cssParserM ode, ValueRangeNonNegative);
2405 if (args.atEnd() && parsedValue && (parsedValue->isCalculated() || parse dValue->getDoubleValue() > 0)) { 2417 if (args.atEnd() && parsedValue && (parsedValue->isCalculated() || parse dValue->getDoubleValue() > 0)) {
2406 RawPtr<CSSFunctionValue> result = CSSFunctionValue::create(CSSValueR epeat); 2418 CSSFunctionValue* result = CSSFunctionValue::create(CSSValueRepeat);
2407 result->append(parsedValue.release()); 2419 result->append(parsedValue);
2408 return result.release(); 2420 return result;
2409 } 2421 }
2410 } 2422 }
2411 return nullptr; 2423 return nullptr;
2412 } 2424 }
2413 2425
2414 static RawPtr<CSSValue> consumeBorderRadiusCorner(CSSParserTokenRange& range, CS SParserMode cssParserMode) 2426 static CSSValue* consumeBorderRadiusCorner(CSSParserTokenRange& range, CSSParser Mode cssParserMode)
2415 { 2427 {
2416 RawPtr<CSSValue> parsedValue1 = consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative); 2428 CSSValue* parsedValue1 = consumeLengthOrPercent(range, cssParserMode, ValueR angeNonNegative);
2417 if (!parsedValue1) 2429 if (!parsedValue1)
2418 return nullptr; 2430 return nullptr;
2419 RawPtr<CSSValue> parsedValue2 = consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative); 2431 CSSValue* parsedValue2 = consumeLengthOrPercent(range, cssParserMode, ValueR angeNonNegative);
2420 if (!parsedValue2) 2432 if (!parsedValue2)
2421 parsedValue2 = parsedValue1; 2433 parsedValue2 = parsedValue1;
2422 return CSSValuePair::create(parsedValue1.release(), parsedValue2.release(), CSSValuePair::DropIdenticalValues); 2434 return CSSValuePair::create(parsedValue1, parsedValue2, CSSValuePair::DropId enticalValues);
2423 } 2435 }
2424 2436
2425 static RawPtr<CSSPrimitiveValue> consumeVerticalAlign(CSSParserTokenRange& range , CSSParserMode cssParserMode) 2437 static CSSPrimitiveValue* consumeVerticalAlign(CSSParserTokenRange& range, CSSPa rserMode cssParserMode)
2426 { 2438 {
2427 RawPtr<CSSPrimitiveValue> parsedValue = consumeIdentRange(range, CSSValueBas eline, CSSValueWebkitBaselineMiddle); 2439 CSSPrimitiveValue* parsedValue = consumeIdentRange(range, CSSValueBaseline, CSSValueWebkitBaselineMiddle);
2428 if (!parsedValue) 2440 if (!parsedValue)
2429 parsedValue = consumeLengthOrPercent(range, cssParserMode, ValueRangeAll , UnitlessQuirk::Allow); 2441 parsedValue = consumeLengthOrPercent(range, cssParserMode, ValueRangeAll , UnitlessQuirk::Allow);
2430 return parsedValue.release(); 2442 return parsedValue;
2431 } 2443 }
2432 2444
2433 static RawPtr<CSSPrimitiveValue> consumeShapeRadius(CSSParserTokenRange& args, C SSParserMode cssParserMode) 2445 static CSSPrimitiveValue* consumeShapeRadius(CSSParserTokenRange& args, CSSParse rMode cssParserMode)
2434 { 2446 {
2435 if (identMatches<CSSValueClosestSide, CSSValueFarthestSide>(args.peek().id() )) 2447 if (identMatches<CSSValueClosestSide, CSSValueFarthestSide>(args.peek().id() ))
2436 return consumeIdent(args); 2448 return consumeIdent(args);
2437 return consumeLengthOrPercent(args, cssParserMode, ValueRangeNonNegative); 2449 return consumeLengthOrPercent(args, cssParserMode, ValueRangeNonNegative);
2438 } 2450 }
2439 2451
2440 static RawPtr<CSSBasicShapeCircleValue> consumeBasicShapeCircle(CSSParserTokenRa nge& args, const CSSParserContext& context) 2452 static CSSBasicShapeCircleValue* consumeBasicShapeCircle(CSSParserTokenRange& ar gs, const CSSParserContext& context)
2441 { 2453 {
2442 // spec: https://drafts.csswg.org/css-shapes/#supported-basic-shapes 2454 // spec: https://drafts.csswg.org/css-shapes/#supported-basic-shapes
2443 // circle( [<shape-radius>]? [at <position>]? ) 2455 // circle( [<shape-radius>]? [at <position>]? )
2444 RawPtr<CSSBasicShapeCircleValue> shape = CSSBasicShapeCircleValue::create(); 2456 CSSBasicShapeCircleValue* shape = CSSBasicShapeCircleValue::create();
2445 if (RawPtr<CSSPrimitiveValue> radius = consumeShapeRadius(args, context.mode ())) 2457 if (CSSPrimitiveValue* radius = consumeShapeRadius(args, context.mode()))
2446 shape->setRadius(radius.release()); 2458 shape->setRadius(radius);
2447 if (consumeIdent<CSSValueAt>(args)) { 2459 if (consumeIdent<CSSValueAt>(args)) {
2448 RawPtr<CSSValue> centerX = nullptr; 2460 CSSValue* centerX = nullptr;
2449 RawPtr<CSSValue> centerY = nullptr; 2461 CSSValue* centerY = nullptr;
2450 if (!consumePosition(args, context.mode(), UnitlessQuirk::Forbid, center X, centerY)) 2462 if (!consumePosition(args, context.mode(), UnitlessQuirk::Forbid, center X, centerY))
2451 return nullptr; 2463 return nullptr;
2452 shape->setCenterX(centerX); 2464 shape->setCenterX(centerX);
2453 shape->setCenterY(centerY); 2465 shape->setCenterY(centerY);
2454 } 2466 }
2455 return shape.release(); 2467 return shape;
2456 } 2468 }
2457 2469
2458 static RawPtr<CSSBasicShapeEllipseValue> consumeBasicShapeEllipse(CSSParserToken Range& args, const CSSParserContext& context) 2470 static CSSBasicShapeEllipseValue* consumeBasicShapeEllipse(CSSParserTokenRange& args, const CSSParserContext& context)
2459 { 2471 {
2460 // spec: https://drafts.csswg.org/css-shapes/#supported-basic-shapes 2472 // spec: https://drafts.csswg.org/css-shapes/#supported-basic-shapes
2461 // ellipse( [<shape-radius>{2}]? [at <position>]? ) 2473 // ellipse( [<shape-radius>{2}]? [at <position>]? )
2462 RawPtr<CSSBasicShapeEllipseValue> shape = CSSBasicShapeEllipseValue::create( ); 2474 CSSBasicShapeEllipseValue* shape = CSSBasicShapeEllipseValue::create();
2463 if (RawPtr<CSSPrimitiveValue> radiusX = consumeShapeRadius(args, context.mod e())) { 2475 if (CSSPrimitiveValue* radiusX = consumeShapeRadius(args, context.mode())) {
2464 shape->setRadiusX(radiusX); 2476 shape->setRadiusX(radiusX);
2465 if (RawPtr<CSSPrimitiveValue> radiusY = consumeShapeRadius(args, context .mode())) 2477 if (CSSPrimitiveValue* radiusY = consumeShapeRadius(args, context.mode() ))
2466 shape->setRadiusY(radiusY); 2478 shape->setRadiusY(radiusY);
2467 } 2479 }
2468 if (consumeIdent<CSSValueAt>(args)) { 2480 if (consumeIdent<CSSValueAt>(args)) {
2469 RawPtr<CSSValue> centerX = nullptr; 2481 CSSValue* centerX = nullptr;
2470 RawPtr<CSSValue> centerY = nullptr; 2482 CSSValue* centerY = nullptr;
2471 if (!consumePosition(args, context.mode(), UnitlessQuirk::Forbid, center X, centerY)) 2483 if (!consumePosition(args, context.mode(), UnitlessQuirk::Forbid, center X, centerY))
2472 return nullptr; 2484 return nullptr;
2473 shape->setCenterX(centerX); 2485 shape->setCenterX(centerX);
2474 shape->setCenterY(centerY); 2486 shape->setCenterY(centerY);
2475 } 2487 }
2476 return shape.release(); 2488 return shape;
2477 } 2489 }
2478 2490
2479 static RawPtr<CSSBasicShapePolygonValue> consumeBasicShapePolygon(CSSParserToken Range& args, const CSSParserContext& context) 2491 static CSSBasicShapePolygonValue* consumeBasicShapePolygon(CSSParserTokenRange& args, const CSSParserContext& context)
2480 { 2492 {
2481 RawPtr<CSSBasicShapePolygonValue> shape = CSSBasicShapePolygonValue::create( ); 2493 CSSBasicShapePolygonValue* shape = CSSBasicShapePolygonValue::create();
2482 if (identMatches<CSSValueEvenodd, CSSValueNonzero>(args.peek().id())) { 2494 if (identMatches<CSSValueEvenodd, CSSValueNonzero>(args.peek().id())) {
2483 shape->setWindRule(args.consumeIncludingWhitespace().id() == CSSValueEve nodd ? RULE_EVENODD : RULE_NONZERO); 2495 shape->setWindRule(args.consumeIncludingWhitespace().id() == CSSValueEve nodd ? RULE_EVENODD : RULE_NONZERO);
2484 if (!consumeCommaIncludingWhitespace(args)) 2496 if (!consumeCommaIncludingWhitespace(args))
2485 return nullptr; 2497 return nullptr;
2486 } 2498 }
2487 2499
2488 do { 2500 do {
2489 RawPtr<CSSPrimitiveValue> xLength = consumeLengthOrPercent(args, context .mode(), ValueRangeAll); 2501 CSSPrimitiveValue* xLength = consumeLengthOrPercent(args, context.mode() , ValueRangeAll);
2490 if (!xLength) 2502 if (!xLength)
2491 return nullptr; 2503 return nullptr;
2492 RawPtr<CSSPrimitiveValue> yLength = consumeLengthOrPercent(args, context .mode(), ValueRangeAll); 2504 CSSPrimitiveValue* yLength = consumeLengthOrPercent(args, context.mode() , ValueRangeAll);
2493 if (!yLength) 2505 if (!yLength)
2494 return nullptr; 2506 return nullptr;
2495 shape->appendPoint(xLength.release(), yLength.release()); 2507 shape->appendPoint(xLength, yLength);
2496 } while (consumeCommaIncludingWhitespace(args)); 2508 } while (consumeCommaIncludingWhitespace(args));
2497 return shape.release(); 2509 return shape;
2498 } 2510 }
2499 2511
2500 static void complete4Sides(RawPtr<CSSPrimitiveValue> side[4]) 2512 static void complete4Sides(CSSPrimitiveValue* side[4])
2501 { 2513 {
2502 if (side[3]) 2514 if (side[3])
2503 return; 2515 return;
2504 if (!side[2]) { 2516 if (!side[2]) {
2505 if (!side[1]) 2517 if (!side[1])
2506 side[1] = side[0]; 2518 side[1] = side[0];
2507 side[2] = side[0]; 2519 side[2] = side[0];
2508 } 2520 }
2509 side[3] = side[1]; 2521 side[3] = side[1];
2510 } 2522 }
2511 2523
2512 static bool consumeRadii(RawPtr<CSSPrimitiveValue> horizontalRadii[4], RawPtr<CS SPrimitiveValue> verticalRadii[4], CSSParserTokenRange& range, CSSParserMode css ParserMode, bool useLegacyParsing) 2524 static bool consumeRadii(CSSPrimitiveValue* horizontalRadii[4], CSSPrimitiveValu e* verticalRadii[4], CSSParserTokenRange& range, CSSParserMode cssParserMode, bo ol useLegacyParsing)
2513 { 2525 {
2514 #if ENABLE(OILPAN) 2526 #if ENABLE(OILPAN)
2515 // Unconditionally zero initialize the arrays of raw pointers. 2527 // Unconditionally zero initialize the arrays of raw pointers.
2516 memset(horizontalRadii, 0, 4 * sizeof(horizontalRadii[0])); 2528 memset(horizontalRadii, 0, 4 * sizeof(horizontalRadii[0]));
2517 memset(verticalRadii, 0, 4 * sizeof(verticalRadii[0])); 2529 memset(verticalRadii, 0, 4 * sizeof(verticalRadii[0]));
2518 #endif 2530 #endif
2519 unsigned i = 0; 2531 unsigned i = 0;
2520 for (; i < 4 && !range.atEnd() && range.peek().type() != DelimiterToken; ++i ) { 2532 for (; i < 4 && !range.atEnd() && range.peek().type() != DelimiterToken; ++i ) {
2521 horizontalRadii[i] = consumeLengthOrPercent(range, cssParserMode, ValueR angeNonNegative); 2533 horizontalRadii[i] = consumeLengthOrPercent(range, cssParserMode, ValueR angeNonNegative);
2522 if (!horizontalRadii[i]) 2534 if (!horizontalRadii[i])
(...skipping 21 matching lines...) Expand all
2544 return false; 2556 return false;
2545 } 2557 }
2546 if (!verticalRadii[0] || !range.atEnd()) 2558 if (!verticalRadii[0] || !range.atEnd())
2547 return false; 2559 return false;
2548 } 2560 }
2549 complete4Sides(horizontalRadii); 2561 complete4Sides(horizontalRadii);
2550 complete4Sides(verticalRadii); 2562 complete4Sides(verticalRadii);
2551 return true; 2563 return true;
2552 } 2564 }
2553 2565
2554 static RawPtr<CSSBasicShapeInsetValue> consumeBasicShapeInset(CSSParserTokenRang e& args, const CSSParserContext& context) 2566 static CSSBasicShapeInsetValue* consumeBasicShapeInset(CSSParserTokenRange& args , const CSSParserContext& context)
2555 { 2567 {
2556 RawPtr<CSSBasicShapeInsetValue> shape = CSSBasicShapeInsetValue::create(); 2568 CSSBasicShapeInsetValue* shape = CSSBasicShapeInsetValue::create();
2557 RawPtr<CSSPrimitiveValue> top = consumeLengthOrPercent(args, context.mode(), ValueRangeAll); 2569 CSSPrimitiveValue* top = consumeLengthOrPercent(args, context.mode(), ValueR angeAll);
2558 if (!top) 2570 if (!top)
2559 return nullptr; 2571 return nullptr;
2560 RawPtr<CSSPrimitiveValue> right = nullptr; 2572 CSSPrimitiveValue* right = consumeLengthOrPercent(args, context.mode(), Valu eRangeAll);
2561 RawPtr<CSSPrimitiveValue> bottom = nullptr; 2573 CSSPrimitiveValue* bottom = nullptr;
2562 RawPtr<CSSPrimitiveValue> left = nullptr; 2574 CSSPrimitiveValue* left = nullptr;
2563 if ((right = consumeLengthOrPercent(args, context.mode(), ValueRangeAll))) { 2575 if (right) {
2564 if ((bottom = consumeLengthOrPercent(args, context.mode(), ValueRangeAll ))) 2576 bottom = consumeLengthOrPercent(args, context.mode(), ValueRangeAll);
2577 if (bottom)
2565 left = consumeLengthOrPercent(args, context.mode(), ValueRangeAll); 2578 left = consumeLengthOrPercent(args, context.mode(), ValueRangeAll);
2566 } 2579 }
2567 if (left) 2580 if (left)
2568 shape->updateShapeSize4Values(top.get(), right.get(), bottom.get(), left .get()); 2581 shape->updateShapeSize4Values(top, right, bottom, left);
2569 else if (bottom) 2582 else if (bottom)
2570 shape->updateShapeSize3Values(top.get(), right.get(), bottom.get()); 2583 shape->updateShapeSize3Values(top, right, bottom);
2571 else if (right) 2584 else if (right)
2572 shape->updateShapeSize2Values(top.get(), right.get()); 2585 shape->updateShapeSize2Values(top, right);
2573 else 2586 else
2574 shape->updateShapeSize1Value(top.get()); 2587 shape->updateShapeSize1Value(top);
2575 2588
2576 if (consumeIdent<CSSValueRound>(args)) { 2589 if (consumeIdent<CSSValueRound>(args)) {
2577 RawPtr<CSSPrimitiveValue> horizontalRadii[4]; 2590 CSSPrimitiveValue* horizontalRadii[4];
2578 RawPtr<CSSPrimitiveValue> verticalRadii[4]; 2591 CSSPrimitiveValue* verticalRadii[4];
2579 if (!consumeRadii(horizontalRadii, verticalRadii, args, context.mode(), false)) 2592 if (!consumeRadii(horizontalRadii, verticalRadii, args, context.mode(), false))
2580 return nullptr; 2593 return nullptr;
2581 shape->setTopLeftRadius(CSSValuePair::create(horizontalRadii[0].release( ), verticalRadii[0].release(), CSSValuePair::DropIdenticalValues)); 2594 shape->setTopLeftRadius(CSSValuePair::create(horizontalRadii[0], vertica lRadii[0], CSSValuePair::DropIdenticalValues));
2582 shape->setTopRightRadius(CSSValuePair::create(horizontalRadii[1].release (), verticalRadii[1].release(), CSSValuePair::DropIdenticalValues)); 2595 shape->setTopRightRadius(CSSValuePair::create(horizontalRadii[1], vertic alRadii[1], CSSValuePair::DropIdenticalValues));
2583 shape->setBottomRightRadius(CSSValuePair::create(horizontalRadii[2].rele ase(), verticalRadii[2].release(), CSSValuePair::DropIdenticalValues)); 2596 shape->setBottomRightRadius(CSSValuePair::create(horizontalRadii[2], ver ticalRadii[2], CSSValuePair::DropIdenticalValues));
2584 shape->setBottomLeftRadius(CSSValuePair::create(horizontalRadii[3].relea se(), verticalRadii[3].release(), CSSValuePair::DropIdenticalValues)); 2597 shape->setBottomLeftRadius(CSSValuePair::create(horizontalRadii[3], vert icalRadii[3], CSSValuePair::DropIdenticalValues));
2585 } 2598 }
2586 return shape.release(); 2599 return shape;
2587 } 2600 }
2588 2601
2589 static RawPtr<CSSValue> consumeBasicShape(CSSParserTokenRange& range, const CSSP arserContext& context) 2602 static CSSValue* consumeBasicShape(CSSParserTokenRange& range, const CSSParserCo ntext& context)
2590 { 2603 {
2591 RawPtr<CSSValue> shape = nullptr; 2604 CSSValue* shape = nullptr;
2592 if (range.peek().type() != FunctionToken) 2605 if (range.peek().type() != FunctionToken)
2593 return nullptr; 2606 return nullptr;
2594 CSSValueID id = range.peek().functionId(); 2607 CSSValueID id = range.peek().functionId();
2595 CSSParserTokenRange rangeCopy = range; 2608 CSSParserTokenRange rangeCopy = range;
2596 CSSParserTokenRange args = consumeFunction(rangeCopy); 2609 CSSParserTokenRange args = consumeFunction(rangeCopy);
2597 if (id == CSSValueCircle) 2610 if (id == CSSValueCircle)
2598 shape = consumeBasicShapeCircle(args, context); 2611 shape = consumeBasicShapeCircle(args, context);
2599 else if (id == CSSValueEllipse) 2612 else if (id == CSSValueEllipse)
2600 shape = consumeBasicShapeEllipse(args, context); 2613 shape = consumeBasicShapeEllipse(args, context);
2601 else if (id == CSSValuePolygon) 2614 else if (id == CSSValuePolygon)
2602 shape = consumeBasicShapePolygon(args, context); 2615 shape = consumeBasicShapePolygon(args, context);
2603 else if (id == CSSValueInset) 2616 else if (id == CSSValueInset)
2604 shape = consumeBasicShapeInset(args, context); 2617 shape = consumeBasicShapeInset(args, context);
2605 if (!shape || !args.atEnd()) 2618 if (!shape || !args.atEnd())
2606 return nullptr; 2619 return nullptr;
2607 range = rangeCopy; 2620 range = rangeCopy;
2608 return shape.release(); 2621 return shape;
2609 } 2622 }
2610 2623
2611 static RawPtr<CSSValue> consumeClipPath(CSSParserTokenRange& range, const CSSPar serContext& context) 2624 static CSSValue* consumeClipPath(CSSParserTokenRange& range, const CSSParserCont ext& context)
2612 { 2625 {
2613 if (range.peek().id() == CSSValueNone) 2626 if (range.peek().id() == CSSValueNone)
2614 return consumeIdent(range); 2627 return consumeIdent(range);
2615 String url = consumeUrl(range); 2628 String url = consumeUrl(range);
2616 if (!url.isNull()) 2629 if (!url.isNull())
2617 return CSSURIValue::create(url); 2630 return CSSURIValue::create(url);
2618 return consumeBasicShape(range, context); 2631 return consumeBasicShape(range, context);
2619 } 2632 }
2620 2633
2621 static RawPtr<CSSValue> consumeShapeOutside(CSSParserTokenRange& range, const CS SParserContext& context) 2634 static CSSValue* consumeShapeOutside(CSSParserTokenRange& range, const CSSParser Context& context)
2622 { 2635 {
2623 if (RawPtr<CSSValue> imageValue = consumeImageOrNone(range, context)) 2636 if (CSSValue* imageValue = consumeImageOrNone(range, context))
2624 return imageValue.release(); 2637 return imageValue;
2625 RawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 2638 CSSValueList* list = CSSValueList::createSpaceSeparated();
2626 if (RawPtr<CSSValue> boxValue = consumeIdent<CSSValueContentBox, CSSValuePad dingBox, CSSValueBorderBox, CSSValueMarginBox>(range)) 2639 if (CSSValue* boxValue = consumeIdent<CSSValueContentBox, CSSValuePaddingBox , CSSValueBorderBox, CSSValueMarginBox>(range))
2627 list->append(boxValue.release()); 2640 list->append(boxValue);
2628 if (RawPtr<CSSValue> shapeValue = consumeBasicShape(range, context)) { 2641 if (CSSValue* shapeValue = consumeBasicShape(range, context)) {
2629 list->append(shapeValue.release()); 2642 list->append(shapeValue);
2630 if (list->length() < 2) { 2643 if (list->length() < 2) {
2631 if (RawPtr<CSSValue> boxValue = consumeIdent<CSSValueContentBox, CSS ValuePaddingBox, CSSValueBorderBox, CSSValueMarginBox>(range)) 2644 if (CSSValue* boxValue = consumeIdent<CSSValueContentBox, CSSValuePa ddingBox, CSSValueBorderBox, CSSValueMarginBox>(range))
2632 list->append(boxValue.release()); 2645 list->append(boxValue);
2633 } 2646 }
2634 } 2647 }
2635 if (!list->length()) 2648 if (!list->length())
2636 return nullptr; 2649 return nullptr;
2637 return list.release(); 2650 return list;
2638 } 2651 }
2639 2652
2640 static RawPtr<CSSValue> consumeContentDistributionOverflowPosition(CSSParserToke nRange& range) 2653 static CSSValue* consumeContentDistributionOverflowPosition(CSSParserTokenRange& range)
2641 { 2654 {
2642 if (identMatches<CSSValueNormal, CSSValueBaseline, CSSValueLastBaseline>(ran ge.peek().id())) 2655 if (identMatches<CSSValueNormal, CSSValueBaseline, CSSValueLastBaseline>(ran ge.peek().id()))
2643 return CSSContentDistributionValue::create(CSSValueInvalid, range.consum eIncludingWhitespace().id(), CSSValueInvalid); 2656 return CSSContentDistributionValue::create(CSSValueInvalid, range.consum eIncludingWhitespace().id(), CSSValueInvalid);
2644 2657
2645 CSSValueID distribution = CSSValueInvalid; 2658 CSSValueID distribution = CSSValueInvalid;
2646 CSSValueID position = CSSValueInvalid; 2659 CSSValueID position = CSSValueInvalid;
2647 CSSValueID overflow = CSSValueInvalid; 2660 CSSValueID overflow = CSSValueInvalid;
2648 do { 2661 do {
2649 CSSValueID id = range.peek().id(); 2662 CSSValueID id = range.peek().id();
2650 if (identMatches<CSSValueSpaceBetween, CSSValueSpaceAround, CSSValueSpac eEvenly, CSSValueStretch>(id)) { 2663 if (identMatches<CSSValueSpaceBetween, CSSValueSpaceAround, CSSValueSpac eEvenly, CSSValueStretch>(id)) {
(...skipping 18 matching lines...) Expand all
2669 if (position == CSSValueInvalid && distribution == CSSValueInvalid) 2682 if (position == CSSValueInvalid && distribution == CSSValueInvalid)
2670 return nullptr; 2683 return nullptr;
2671 2684
2672 // The grammar states that <overflow-position> must be associated to <conten t-position>. 2685 // The grammar states that <overflow-position> must be associated to <conten t-position>.
2673 if (overflow != CSSValueInvalid && position == CSSValueInvalid) 2686 if (overflow != CSSValueInvalid && position == CSSValueInvalid)
2674 return nullptr; 2687 return nullptr;
2675 2688
2676 return CSSContentDistributionValue::create(distribution, position, overflow) ; 2689 return CSSContentDistributionValue::create(distribution, position, overflow) ;
2677 } 2690 }
2678 2691
2679 static RawPtr<CSSPrimitiveValue> consumeBorderImageRepeatKeyword(CSSParserTokenR ange& range) 2692 static CSSPrimitiveValue* consumeBorderImageRepeatKeyword(CSSParserTokenRange& r ange)
2680 { 2693 {
2681 return consumeIdent<CSSValueStretch, CSSValueRepeat, CSSValueSpace, CSSValue Round>(range); 2694 return consumeIdent<CSSValueStretch, CSSValueRepeat, CSSValueSpace, CSSValue Round>(range);
2682 } 2695 }
2683 2696
2684 static RawPtr<CSSValue> consumeBorderImageRepeat(CSSParserTokenRange& range) 2697 static CSSValue* consumeBorderImageRepeat(CSSParserTokenRange& range)
2685 { 2698 {
2686 RawPtr<CSSPrimitiveValue> horizontal = consumeBorderImageRepeatKeyword(range ); 2699 CSSPrimitiveValue* horizontal = consumeBorderImageRepeatKeyword(range);
2687 if (!horizontal) 2700 if (!horizontal)
2688 return nullptr; 2701 return nullptr;
2689 RawPtr<CSSPrimitiveValue> vertical = consumeBorderImageRepeatKeyword(range); 2702 CSSPrimitiveValue* vertical = consumeBorderImageRepeatKeyword(range);
2690 if (!vertical) 2703 if (!vertical)
2691 vertical = horizontal; 2704 vertical = horizontal;
2692 return CSSValuePair::create(horizontal.release(), vertical.release(), CSSVal uePair::DropIdenticalValues); 2705 return CSSValuePair::create(horizontal, vertical, CSSValuePair::DropIdentica lValues);
2693 } 2706 }
2694 2707
2695 static RawPtr<CSSValue> consumeBorderImageSlice(CSSPropertyID property, CSSParse rTokenRange& range, CSSParserMode cssParserMode) 2708 static CSSValue* consumeBorderImageSlice(CSSPropertyID property, CSSParserTokenR ange& range, CSSParserMode cssParserMode)
2696 { 2709 {
2697 bool fill = consumeIdent<CSSValueFill>(range); 2710 bool fill = consumeIdent<CSSValueFill>(range);
2698 RawPtr<CSSPrimitiveValue> slices[4]; 2711 CSSPrimitiveValue* slices[4];
2699 #if ENABLE(OILPAN) 2712 #if ENABLE(OILPAN)
2700 // Unconditionally zero initialize the arrays of raw pointers. 2713 // Unconditionally zero initialize the arrays of raw pointers.
2701 memset(slices, 0, 4 * sizeof(slices[0])); 2714 memset(slices, 0, 4 * sizeof(slices[0]));
2702 #endif 2715 #endif
2703 for (size_t index = 0; index < 4; ++index) { 2716 for (size_t index = 0; index < 4; ++index) {
2704 RawPtr<CSSPrimitiveValue> value = consumePercent(range, ValueRangeNonNeg ative); 2717 CSSPrimitiveValue* value = consumePercent(range, ValueRangeNonNegative);
2705 if (!value) 2718 if (!value)
2706 value = consumeNumber(range, ValueRangeNonNegative); 2719 value = consumeNumber(range, ValueRangeNonNegative);
2707 if (!value) 2720 if (!value)
2708 break; 2721 break;
2709 slices[index] = value; 2722 slices[index] = value;
2710 } 2723 }
2711 if (!slices[0]) 2724 if (!slices[0])
2712 return nullptr; 2725 return nullptr;
2713 if (consumeIdent<CSSValueFill>(range)) { 2726 if (consumeIdent<CSSValueFill>(range)) {
2714 if (fill) 2727 if (fill)
2715 return nullptr; 2728 return nullptr;
2716 fill = true; 2729 fill = true;
2717 } 2730 }
2718 complete4Sides(slices); 2731 complete4Sides(slices);
2719 // FIXME: For backwards compatibility, -webkit-border-image, -webkit-mask-bo x-image and -webkit-box-reflect have to do a fill by default. 2732 // FIXME: For backwards compatibility, -webkit-border-image, -webkit-mask-bo x-image and -webkit-box-reflect have to do a fill by default.
2720 // FIXME: What do we do with -webkit-box-reflect and -webkit-mask-box-image? Probably just have to leave them filling... 2733 // FIXME: What do we do with -webkit-box-reflect and -webkit-mask-box-image? Probably just have to leave them filling...
2721 if (property == CSSPropertyWebkitBorderImage || property == CSSPropertyWebki tMaskBoxImage || property == CSSPropertyWebkitBoxReflect) 2734 if (property == CSSPropertyWebkitBorderImage || property == CSSPropertyWebki tMaskBoxImage || property == CSSPropertyWebkitBoxReflect)
2722 fill = true; 2735 fill = true;
2723 return CSSBorderImageSliceValue::create(CSSQuadValue::create(slices[0].relea se(), slices[1].release(), slices[2].release(), slices[3].release(), CSSQuadValu e::SerializeAsQuad), fill); 2736 return CSSBorderImageSliceValue::create(CSSQuadValue::create(slices[0], slic es[1], slices[2], slices[3], CSSQuadValue::SerializeAsQuad), fill);
2724 } 2737 }
2725 2738
2726 static RawPtr<CSSValue> consumeBorderImageOutset(CSSParserTokenRange& range) 2739 static CSSValue* consumeBorderImageOutset(CSSParserTokenRange& range)
2727 { 2740 {
2728 RawPtr<CSSPrimitiveValue> outsets[4]; 2741 CSSPrimitiveValue* outsets[4];
2729 #if ENABLE(OILPAN) 2742 #if ENABLE(OILPAN)
2730 // Unconditionally zero initialize the arrays of raw pointers. 2743 // Unconditionally zero initialize the arrays of raw pointers.
2731 memset(outsets, 0, 4 * sizeof(outsets[0])); 2744 memset(outsets, 0, 4 * sizeof(outsets[0]));
2732 #endif 2745 #endif
2733 RawPtr<CSSPrimitiveValue> value = nullptr; 2746 CSSPrimitiveValue* value = nullptr;
2734 for (size_t index = 0; index < 4; ++index) { 2747 for (size_t index = 0; index < 4; ++index) {
2735 value = consumeNumber(range, ValueRangeNonNegative); 2748 value = consumeNumber(range, ValueRangeNonNegative);
2736 if (!value) 2749 if (!value)
2737 value = consumeLength(range, HTMLStandardMode, ValueRangeNonNegative ); 2750 value = consumeLength(range, HTMLStandardMode, ValueRangeNonNegative );
2738 if (!value) 2751 if (!value)
2739 break; 2752 break;
2740 outsets[index] = value; 2753 outsets[index] = value;
2741 } 2754 }
2742 if (!outsets[0]) 2755 if (!outsets[0])
2743 return nullptr; 2756 return nullptr;
2744 complete4Sides(outsets); 2757 complete4Sides(outsets);
2745 return CSSQuadValue::create(outsets[0].release(), outsets[1].release(), outs ets[2].release(), outsets[3].release(), CSSQuadValue::SerializeAsQuad); 2758 return CSSQuadValue::create(outsets[0], outsets[1], outsets[2], outsets[3], CSSQuadValue::SerializeAsQuad);
2746 } 2759 }
2747 2760
2748 static RawPtr<CSSValue> consumeBorderImageWidth(CSSParserTokenRange& range) 2761 static CSSValue* consumeBorderImageWidth(CSSParserTokenRange& range)
2749 { 2762 {
2750 RawPtr<CSSPrimitiveValue> widths[4]; 2763 CSSPrimitiveValue* widths[4];
2751 #if ENABLE(OILPAN) 2764 #if ENABLE(OILPAN)
2752 // Unconditionally zero initialize the arrays of raw pointers. 2765 // Unconditionally zero initialize the arrays of raw pointers.
2753 memset(widths, 0, 4 * sizeof(widths[0])); 2766 memset(widths, 0, 4 * sizeof(widths[0]));
2754 #endif 2767 #endif
2755 RawPtr<CSSPrimitiveValue> value = nullptr; 2768 CSSPrimitiveValue* value = nullptr;
2756 for (size_t index = 0; index < 4; ++index) { 2769 for (size_t index = 0; index < 4; ++index) {
2757 value = consumeNumber(range, ValueRangeNonNegative); 2770 value = consumeNumber(range, ValueRangeNonNegative);
2758 if (!value) 2771 if (!value)
2759 value = consumeLengthOrPercent(range, HTMLStandardMode, ValueRangeNo nNegative, UnitlessQuirk::Forbid); 2772 value = consumeLengthOrPercent(range, HTMLStandardMode, ValueRangeNo nNegative, UnitlessQuirk::Forbid);
2760 if (!value) 2773 if (!value)
2761 value = consumeIdent<CSSValueAuto>(range); 2774 value = consumeIdent<CSSValueAuto>(range);
2762 if (!value) 2775 if (!value)
2763 break; 2776 break;
2764 widths[index] = value; 2777 widths[index] = value;
2765 } 2778 }
2766 if (!widths[0]) 2779 if (!widths[0])
2767 return nullptr; 2780 return nullptr;
2768 complete4Sides(widths); 2781 complete4Sides(widths);
2769 return CSSQuadValue::create(widths[0].release(), widths[1].release(), widths [2].release(), widths[3].release(), CSSQuadValue::SerializeAsQuad); 2782 return CSSQuadValue::create(widths[0], widths[1], widths[2], widths[3], CSSQ uadValue::SerializeAsQuad);
2770 } 2783 }
2771 2784
2772 static bool consumeBorderImageComponents(CSSPropertyID property, CSSParserTokenR ange& range, const CSSParserContext& context, RawPtr<CSSValue>& source, 2785 static bool consumeBorderImageComponents(CSSPropertyID property, CSSParserTokenR ange& range, const CSSParserContext& context, CSSValue*& source,
2773 RawPtr<CSSValue>& slice, RawPtr<CSSValue>& width, RawPtr<CSSValue>& outset, RawPtr<CSSValue>& repeat) 2786 CSSValue*& slice, CSSValue*& width, CSSValue*& outset, CSSValue*& repeat)
2774 { 2787 {
2775 do { 2788 do {
2776 if (!source && (source = consumeImageOrNone(range, context))) 2789 if (!source) {
2777 continue; 2790 source = consumeImageOrNone(range, context);
2778 if (!repeat && (repeat = consumeBorderImageRepeat(range))) 2791 if (source)
2779 continue; 2792 continue;
2780 if (!slice && (slice = consumeBorderImageSlice(property, range, context. mode()))) { 2793 }
2781 ASSERT(!width && !outset); 2794 if (!repeat) {
2782 if (consumeSlashIncludingWhitespace(range)) { 2795 repeat = consumeBorderImageRepeat(range);
2783 width = consumeBorderImageWidth(range); 2796 if (repeat)
2797 continue;
2798 }
2799 if (!slice) {
2800 slice = consumeBorderImageSlice(property, range, context.mode());
2801 if (slice) {
2802 ASSERT(!width && !outset);
2784 if (consumeSlashIncludingWhitespace(range)) { 2803 if (consumeSlashIncludingWhitespace(range)) {
2785 outset = consumeBorderImageOutset(range); 2804 width = consumeBorderImageWidth(range);
2786 if (!outset) 2805 if (consumeSlashIncludingWhitespace(range)) {
2806 outset = consumeBorderImageOutset(range);
2807 if (!outset)
2808 return false;
2809 } else if (!width) {
2787 return false; 2810 return false;
2788 } else if (!width) { 2811 }
2789 return false;
2790 } 2812 }
2813 } else {
2814 return false;
2791 } 2815 }
2792 } else { 2816 } else {
2793 return false; 2817 return false;
2794 } 2818 }
2795 } while (!range.atEnd()); 2819 } while (!range.atEnd());
2796 return true; 2820 return true;
2797 } 2821 }
2798 2822
2799 static RawPtr<CSSValue> consumeWebkitBorderImage(CSSPropertyID property, CSSPars erTokenRange& range, const CSSParserContext& context) 2823 static CSSValue* consumeWebkitBorderImage(CSSPropertyID property, CSSParserToken Range& range, const CSSParserContext& context)
2800 { 2824 {
2801 RawPtr<CSSValue> source = nullptr; 2825 CSSValue* source = nullptr;
2802 RawPtr<CSSValue> slice = nullptr; 2826 CSSValue* slice = nullptr;
2803 RawPtr<CSSValue> width = nullptr; 2827 CSSValue* width = nullptr;
2804 RawPtr<CSSValue> outset = nullptr; 2828 CSSValue* outset = nullptr;
2805 RawPtr<CSSValue> repeat = nullptr; 2829 CSSValue* repeat = nullptr;
2806 if (consumeBorderImageComponents(property, range, context, source, slice, wi dth, outset, repeat)) 2830 if (consumeBorderImageComponents(property, range, context, source, slice, wi dth, outset, repeat))
2807 return createBorderImageValue(source, slice, width, outset, repeat); 2831 return createBorderImageValue(source, slice, width, outset, repeat);
2808 return nullptr; 2832 return nullptr;
2809 } 2833 }
2810 2834
2811 static RawPtr<CSSValue> consumeReflect(CSSParserTokenRange& range, const CSSPars erContext& context) 2835 static CSSValue* consumeReflect(CSSParserTokenRange& range, const CSSParserConte xt& context)
2812 { 2836 {
2813 RawPtr<CSSPrimitiveValue> direction = consumeIdent<CSSValueAbove, CSSValueBe low, CSSValueLeft, CSSValueRight>(range); 2837 CSSPrimitiveValue* direction = consumeIdent<CSSValueAbove, CSSValueBelow, CS SValueLeft, CSSValueRight>(range);
2814 if (!direction) 2838 if (!direction)
2815 return nullptr; 2839 return nullptr;
2816 2840
2817 RawPtr<CSSPrimitiveValue> offset = nullptr; 2841 CSSPrimitiveValue* offset = nullptr;
2818 if (range.atEnd()) { 2842 if (range.atEnd()) {
2819 offset = cssValuePool().createValue(0, CSSPrimitiveValue::UnitType::Pixe ls); 2843 offset = cssValuePool().createValue(0, CSSPrimitiveValue::UnitType::Pixe ls);
2820 } else { 2844 } else {
2821 offset = consumeLengthOrPercent(range, context.mode(), ValueRangeAll, Un itlessQuirk::Forbid); 2845 offset = consumeLengthOrPercent(range, context.mode(), ValueRangeAll, Un itlessQuirk::Forbid);
2822 if (!offset) 2846 if (!offset)
2823 return nullptr; 2847 return nullptr;
2824 } 2848 }
2825 2849
2826 RawPtr<CSSValue> mask = nullptr; 2850 CSSValue* mask = nullptr;
2827 if (!range.atEnd()) { 2851 if (!range.atEnd()) {
2828 mask = consumeWebkitBorderImage(CSSPropertyWebkitBoxReflect, range, cont ext); 2852 mask = consumeWebkitBorderImage(CSSPropertyWebkitBoxReflect, range, cont ext);
2829 if (!mask) 2853 if (!mask)
2830 return nullptr; 2854 return nullptr;
2831 } 2855 }
2832 return CSSReflectValue::create(direction.release(), offset.release(), mask.r elease()); 2856 return CSSReflectValue::create(direction, offset, mask);
2833 } 2857 }
2834 2858
2835 static RawPtr<CSSValue> consumeFontSizeAdjust(CSSParserTokenRange& range) 2859 static CSSValue* consumeFontSizeAdjust(CSSParserTokenRange& range)
2836 { 2860 {
2837 if (range.peek().id() == CSSValueNone) 2861 if (range.peek().id() == CSSValueNone)
2838 return consumeIdent(range); 2862 return consumeIdent(range);
2839 return consumeNumber(range, ValueRangeNonNegative); 2863 return consumeNumber(range, ValueRangeNonNegative);
2840 } 2864 }
2841 2865
2842 static RawPtr<CSSValue> consumeImageOrientation(CSSParserTokenRange& range) 2866 static CSSValue* consumeImageOrientation(CSSParserTokenRange& range)
2843 { 2867 {
2844 if (range.peek().id() == CSSValueFromImage) 2868 if (range.peek().id() == CSSValueFromImage)
2845 return consumeIdent(range); 2869 return consumeIdent(range);
2846 if (range.peek().type() != NumberToken) { 2870 if (range.peek().type() != NumberToken) {
2847 RawPtr<CSSPrimitiveValue> angle = consumeAngle(range); 2871 CSSPrimitiveValue* angle = consumeAngle(range);
2848 if (angle && angle->getDoubleValue() == 0) 2872 if (angle && angle->getDoubleValue() == 0)
2849 return angle; 2873 return angle;
2850 } 2874 }
2851 return nullptr; 2875 return nullptr;
2852 } 2876 }
2853 2877
2854 static RawPtr<CSSValue> consumeBackgroundBlendMode(CSSParserTokenRange& range) 2878 static CSSValue* consumeBackgroundBlendMode(CSSParserTokenRange& range)
2855 { 2879 {
2856 CSSValueID id = range.peek().id(); 2880 CSSValueID id = range.peek().id();
2857 if (id == CSSValueNormal || id == CSSValueOverlay || (id >= CSSValueMultiply && id <= CSSValueLuminosity)) 2881 if (id == CSSValueNormal || id == CSSValueOverlay || (id >= CSSValueMultiply && id <= CSSValueLuminosity))
2858 return consumeIdent(range); 2882 return consumeIdent(range);
2859 return nullptr; 2883 return nullptr;
2860 } 2884 }
2861 2885
2862 static RawPtr<CSSValue> consumeBackgroundAttachment(CSSParserTokenRange& range) 2886 static CSSValue* consumeBackgroundAttachment(CSSParserTokenRange& range)
2863 { 2887 {
2864 return consumeIdent<CSSValueScroll, CSSValueFixed, CSSValueLocal>(range); 2888 return consumeIdent<CSSValueScroll, CSSValueFixed, CSSValueLocal>(range);
2865 } 2889 }
2866 2890
2867 static RawPtr<CSSValue> consumeBackgroundBox(CSSParserTokenRange& range) 2891 static CSSValue* consumeBackgroundBox(CSSParserTokenRange& range)
2868 { 2892 {
2869 return consumeIdent<CSSValueBorderBox, CSSValuePaddingBox, CSSValueContentBo x>(range); 2893 return consumeIdent<CSSValueBorderBox, CSSValuePaddingBox, CSSValueContentBo x>(range);
2870 } 2894 }
2871 2895
2872 static RawPtr<CSSValue> consumeBackgroundComposite(CSSParserTokenRange& range) 2896 static CSSValue* consumeBackgroundComposite(CSSParserTokenRange& range)
2873 { 2897 {
2874 return consumeIdentRange(range, CSSValueClear, CSSValuePlusLighter); 2898 return consumeIdentRange(range, CSSValueClear, CSSValuePlusLighter);
2875 } 2899 }
2876 2900
2877 static RawPtr<CSSValue> consumeMaskSourceType(CSSParserTokenRange& range) 2901 static CSSValue* consumeMaskSourceType(CSSParserTokenRange& range)
2878 { 2902 {
2879 ASSERT(RuntimeEnabledFeatures::cssMaskSourceTypeEnabled()); 2903 ASSERT(RuntimeEnabledFeatures::cssMaskSourceTypeEnabled());
2880 return consumeIdent<CSSValueAuto, CSSValueAlpha, CSSValueLuminance>(range); 2904 return consumeIdent<CSSValueAuto, CSSValueAlpha, CSSValueLuminance>(range);
2881 } 2905 }
2882 2906
2883 static RawPtr<CSSValue> consumePrefixedBackgroundBox(CSSPropertyID property, CSS ParserTokenRange& range, const CSSParserContext& context) 2907 static CSSValue* consumePrefixedBackgroundBox(CSSPropertyID property, CSSParserT okenRange& range, const CSSParserContext& context)
2884 { 2908 {
2885 // The values 'border', 'padding' and 'content' are deprecated and do not ap ply to the version of the property that has the -webkit- prefix removed. 2909 // The values 'border', 'padding' and 'content' are deprecated and do not ap ply to the version of the property that has the -webkit- prefix removed.
2886 if (RawPtr<CSSValue> value = consumeIdentRange(range, CSSValueBorder, CSSVal uePaddingBox)) 2910 if (CSSValue* value = consumeIdentRange(range, CSSValueBorder, CSSValuePaddi ngBox))
2887 return value.release(); 2911 return value;
2888 if ((property == CSSPropertyWebkitBackgroundClip || property == CSSPropertyW ebkitMaskClip) && range.peek().id() == CSSValueText) 2912 if ((property == CSSPropertyWebkitBackgroundClip || property == CSSPropertyW ebkitMaskClip) && range.peek().id() == CSSValueText)
2889 return consumeIdent(range); 2913 return consumeIdent(range);
2890 return nullptr; 2914 return nullptr;
2891 } 2915 }
2892 2916
2893 static RawPtr<CSSValue> consumeBackgroundSize(CSSPropertyID unresolvedProperty, CSSParserTokenRange& range, CSSParserMode mode) 2917 static CSSValue* consumeBackgroundSize(CSSPropertyID unresolvedProperty, CSSPars erTokenRange& range, CSSParserMode mode)
2894 { 2918 {
2895 if (identMatches<CSSValueContain, CSSValueCover>(range.peek().id())) 2919 if (identMatches<CSSValueContain, CSSValueCover>(range.peek().id()))
2896 return consumeIdent(range); 2920 return consumeIdent(range);
2897 2921
2898 RawPtr<CSSPrimitiveValue> horizontal = consumeIdent<CSSValueAuto>(range); 2922 CSSPrimitiveValue* horizontal = consumeIdent<CSSValueAuto>(range);
2899 if (!horizontal) 2923 if (!horizontal)
2900 horizontal = consumeLengthOrPercent(range, mode, ValueRangeAll, Unitless Quirk::Forbid); 2924 horizontal = consumeLengthOrPercent(range, mode, ValueRangeAll, Unitless Quirk::Forbid);
2901 2925
2902 RawPtr<CSSPrimitiveValue> vertical = nullptr; 2926 CSSPrimitiveValue* vertical = nullptr;
2903 if (!range.atEnd()) { 2927 if (!range.atEnd()) {
2904 if (range.peek().id() == CSSValueAuto) // `auto' is the default 2928 if (range.peek().id() == CSSValueAuto) // `auto' is the default
2905 range.consumeIncludingWhitespace(); 2929 range.consumeIncludingWhitespace();
2906 else 2930 else
2907 vertical = consumeLengthOrPercent(range, mode, ValueRangeAll, Unitle ssQuirk::Forbid); 2931 vertical = consumeLengthOrPercent(range, mode, ValueRangeAll, Unitle ssQuirk::Forbid);
2908 } else if (unresolvedProperty == CSSPropertyAliasWebkitBackgroundSize) { 2932 } else if (unresolvedProperty == CSSPropertyAliasWebkitBackgroundSize) {
2909 // Legacy syntax: "-webkit-background-size: 10px" is equivalent to "back ground-size: 10px 10px". 2933 // Legacy syntax: "-webkit-background-size: 10px" is equivalent to "back ground-size: 10px 10px".
2910 vertical = horizontal; 2934 vertical = horizontal;
2911 } 2935 }
2912 if (!vertical) 2936 if (!vertical)
2913 return horizontal; 2937 return horizontal;
2914 return CSSValuePair::create(horizontal.release(), vertical.release(), CSSVal uePair::KeepIdenticalValues); 2938 return CSSValuePair::create(horizontal, vertical, CSSValuePair::KeepIdentica lValues);
2915 } 2939 }
2916 2940
2917 static RawPtr<CSSValue> consumeBackgroundComponent(CSSPropertyID unresolvedPrope rty, CSSParserTokenRange& range, const CSSParserContext& context) 2941 static CSSValue* consumeBackgroundComponent(CSSPropertyID unresolvedProperty, CS SParserTokenRange& range, const CSSParserContext& context)
2918 { 2942 {
2919 switch (unresolvedProperty) { 2943 switch (unresolvedProperty) {
2920 case CSSPropertyBackgroundClip: 2944 case CSSPropertyBackgroundClip:
2921 return consumeBackgroundBox(range); 2945 return consumeBackgroundBox(range);
2922 case CSSPropertyBackgroundBlendMode: 2946 case CSSPropertyBackgroundBlendMode:
2923 return consumeBackgroundBlendMode(range); 2947 return consumeBackgroundBlendMode(range);
2924 case CSSPropertyBackgroundAttachment: 2948 case CSSPropertyBackgroundAttachment:
2925 return consumeBackgroundAttachment(range); 2949 return consumeBackgroundAttachment(range);
2926 case CSSPropertyBackgroundOrigin: 2950 case CSSPropertyBackgroundOrigin:
2927 return consumeBackgroundBox(range); 2951 return consumeBackgroundBox(range);
(...skipping 20 matching lines...) Expand all
2948 case CSSPropertyWebkitMaskSize: 2972 case CSSPropertyWebkitMaskSize:
2949 return consumeBackgroundSize(unresolvedProperty, range, context.mode()); 2973 return consumeBackgroundSize(unresolvedProperty, range, context.mode());
2950 case CSSPropertyBackgroundColor: 2974 case CSSPropertyBackgroundColor:
2951 return consumeColor(range, context.mode()); 2975 return consumeColor(range, context.mode());
2952 default: 2976 default:
2953 break; 2977 break;
2954 }; 2978 };
2955 return nullptr; 2979 return nullptr;
2956 } 2980 }
2957 2981
2958 static void addBackgroundValue(RawPtr<CSSValue>& list, RawPtr<CSSValue> value) 2982 static void addBackgroundValue(CSSValue*& list, CSSValue* value)
2959 { 2983 {
2960 if (list) { 2984 if (list) {
2961 if (!list->isBaseValueList()) { 2985 if (!list->isBaseValueList()) {
2962 RawPtr<CSSValue> firstValue = list.release(); 2986 CSSValue* firstValue = list;
2963 list = CSSValueList::createCommaSeparated(); 2987 list = CSSValueList::createCommaSeparated();
2964 toCSSValueList(list.get())->append(firstValue.release()); 2988 toCSSValueList(list)->append(firstValue);
2965 } 2989 }
2966 toCSSValueList(list.get())->append(value); 2990 toCSSValueList(list)->append(value);
2967 } else { 2991 } else {
2968 // To conserve memory we don't actually wrap a single value in a list. 2992 // To conserve memory we don't actually wrap a single value in a list.
2969 list = value; 2993 list = value;
2970 } 2994 }
2971 } 2995 }
2972 2996
2973 static RawPtr<CSSValue> consumeCommaSeparatedBackgroundComponent(CSSPropertyID u nresolvedProperty, CSSParserTokenRange& range, const CSSParserContext& context) 2997 static CSSValue* consumeCommaSeparatedBackgroundComponent(CSSPropertyID unresolv edProperty, CSSParserTokenRange& range, const CSSParserContext& context)
2974 { 2998 {
2975 RawPtr<CSSValue> result = nullptr; 2999 CSSValue* result = nullptr;
2976 do { 3000 do {
2977 RawPtr<CSSValue> value = consumeBackgroundComponent(unresolvedProperty, range, context); 3001 CSSValue* value = consumeBackgroundComponent(unresolvedProperty, range, context);
2978 if (!value) 3002 if (!value)
2979 return nullptr; 3003 return nullptr;
2980 addBackgroundValue(result, value); 3004 addBackgroundValue(result, value);
2981 } while (consumeCommaIncludingWhitespace(range)); 3005 } while (consumeCommaIncludingWhitespace(range));
2982 return result.release(); 3006 return result;
2983 } 3007 }
2984 3008
2985 static RawPtr<CSSPrimitiveValue> consumeSelfPositionKeyword(CSSParserTokenRange& range) 3009 static CSSPrimitiveValue* consumeSelfPositionKeyword(CSSParserTokenRange& range)
2986 { 3010 {
2987 CSSValueID id = range.peek().id(); 3011 CSSValueID id = range.peek().id();
2988 if (id == CSSValueStart || id == CSSValueEnd || id == CSSValueCenter 3012 if (id == CSSValueStart || id == CSSValueEnd || id == CSSValueCenter
2989 || id == CSSValueSelfStart || id == CSSValueSelfEnd || id == CSSValueFle xStart 3013 || id == CSSValueSelfStart || id == CSSValueSelfEnd || id == CSSValueFle xStart
2990 || id == CSSValueFlexEnd || id == CSSValueLeft || id == CSSValueRight) 3014 || id == CSSValueFlexEnd || id == CSSValueLeft || id == CSSValueRight)
2991 return consumeIdent(range); 3015 return consumeIdent(range);
2992 return nullptr; 3016 return nullptr;
2993 } 3017 }
2994 3018
2995 static RawPtr<CSSValue> consumeSelfPositionOverflowPosition(CSSParserTokenRange& range) 3019 static CSSValue* consumeSelfPositionOverflowPosition(CSSParserTokenRange& range)
2996 { 3020 {
2997 if (identMatches<CSSValueAuto, CSSValueStretch, CSSValueBaseline, CSSValueLa stBaseline>(range.peek().id())) 3021 if (identMatches<CSSValueAuto, CSSValueStretch, CSSValueBaseline, CSSValueLa stBaseline>(range.peek().id()))
2998 return consumeIdent(range); 3022 return consumeIdent(range);
2999 3023
3000 RawPtr<CSSPrimitiveValue> overflowPosition = consumeIdent<CSSValueUnsafe, CS SValueSafe>(range); 3024 CSSPrimitiveValue* overflowPosition = consumeIdent<CSSValueUnsafe, CSSValueS afe>(range);
3001 RawPtr<CSSPrimitiveValue> selfPosition = consumeSelfPositionKeyword(range); 3025 CSSPrimitiveValue* selfPosition = consumeSelfPositionKeyword(range);
3002 if (!selfPosition) 3026 if (!selfPosition)
3003 return nullptr; 3027 return nullptr;
3004 if (!overflowPosition) 3028 if (!overflowPosition)
3005 overflowPosition = consumeIdent<CSSValueUnsafe, CSSValueSafe>(range); 3029 overflowPosition = consumeIdent<CSSValueUnsafe, CSSValueSafe>(range);
3006 if (overflowPosition) 3030 if (overflowPosition)
3007 return CSSValuePair::create(selfPosition.release(), overflowPosition, CS SValuePair::DropIdenticalValues); 3031 return CSSValuePair::create(selfPosition, overflowPosition, CSSValuePair ::DropIdenticalValues);
3008 return selfPosition.release(); 3032 return selfPosition;
3009 } 3033 }
3010 3034
3011 static RawPtr<CSSValue> consumeJustifyItems(CSSParserTokenRange& range) 3035 static CSSValue* consumeJustifyItems(CSSParserTokenRange& range)
3012 { 3036 {
3013 CSSParserTokenRange rangeCopy = range; 3037 CSSParserTokenRange rangeCopy = range;
3014 RawPtr<CSSPrimitiveValue> legacy = consumeIdent<CSSValueLegacy>(rangeCopy); 3038 CSSPrimitiveValue* legacy = consumeIdent<CSSValueLegacy>(rangeCopy);
3015 RawPtr<CSSPrimitiveValue> positionKeyword = consumeIdent<CSSValueCenter, CSS ValueLeft, CSSValueRight>(rangeCopy); 3039 CSSPrimitiveValue* positionKeyword = consumeIdent<CSSValueCenter, CSSValueLe ft, CSSValueRight>(rangeCopy);
3016 if (!legacy) 3040 if (!legacy)
3017 legacy = consumeIdent<CSSValueLegacy>(rangeCopy); 3041 legacy = consumeIdent<CSSValueLegacy>(rangeCopy);
3018 if (legacy && positionKeyword) { 3042 if (legacy && positionKeyword) {
3019 range = rangeCopy; 3043 range = rangeCopy;
3020 return CSSValuePair::create(legacy.release(), positionKeyword.release(), CSSValuePair::DropIdenticalValues); 3044 return CSSValuePair::create(legacy, positionKeyword, CSSValuePair::DropI denticalValues);
3021 } 3045 }
3022 return consumeSelfPositionOverflowPosition(range); 3046 return consumeSelfPositionOverflowPosition(range);
3023 } 3047 }
3024 3048
3025 static RawPtr<CSSCustomIdentValue> consumeCustomIdentForGridLine(CSSParserTokenR ange& range) 3049 static CSSCustomIdentValue* consumeCustomIdentForGridLine(CSSParserTokenRange& r ange)
3026 { 3050 {
3027 if (range.peek().id() == CSSValueAuto || range.peek().id() == CSSValueSpan) 3051 if (range.peek().id() == CSSValueAuto || range.peek().id() == CSSValueSpan)
3028 return nullptr; 3052 return nullptr;
3029 return consumeCustomIdent(range); 3053 return consumeCustomIdent(range);
3030 } 3054 }
3031 3055
3032 static RawPtr<CSSValue> consumeGridLine(CSSParserTokenRange& range) 3056 static CSSValue* consumeGridLine(CSSParserTokenRange& range)
3033 { 3057 {
3034 if (range.peek().id() == CSSValueAuto) 3058 if (range.peek().id() == CSSValueAuto)
3035 return consumeIdent(range); 3059 return consumeIdent(range);
3036 3060
3037 RawPtr<CSSPrimitiveValue> spanValue = nullptr; 3061 CSSPrimitiveValue* spanValue = nullptr;
3038 RawPtr<CSSCustomIdentValue> gridLineName = nullptr; 3062 CSSCustomIdentValue* gridLineName = nullptr;
3039 RawPtr<CSSPrimitiveValue> numericValue = consumeInteger(range); 3063 CSSPrimitiveValue* numericValue = consumeInteger(range);
3040 if (numericValue) { 3064 if (numericValue) {
3041 gridLineName = consumeCustomIdentForGridLine(range); 3065 gridLineName = consumeCustomIdentForGridLine(range);
3042 spanValue = consumeIdent<CSSValueSpan>(range); 3066 spanValue = consumeIdent<CSSValueSpan>(range);
3043 } else if ((spanValue = consumeIdent<CSSValueSpan>(range))) { 3067 } else {
3044 numericValue = consumeInteger(range); 3068 spanValue = consumeIdent<CSSValueSpan>(range);
3045 gridLineName = consumeCustomIdentForGridLine(range); 3069 if (spanValue) {
3046 if (!numericValue)
3047 numericValue = consumeInteger(range); 3070 numericValue = consumeInteger(range);
3048 } else if ((gridLineName = consumeCustomIdentForGridLine(range))) { 3071 gridLineName = consumeCustomIdentForGridLine(range);
3049 numericValue = consumeInteger(range); 3072 if (!numericValue)
3050 spanValue = consumeIdent<CSSValueSpan>(range); 3073 numericValue = consumeInteger(range);
3051 if (!spanValue && !numericValue) 3074 } else {
3052 return gridLineName.release(); 3075 gridLineName = consumeCustomIdentForGridLine(range);
3053 } else { 3076 if (gridLineName) {
3054 return nullptr; 3077 numericValue = consumeInteger(range);
3078 spanValue = consumeIdent<CSSValueSpan>(range);
3079 if (!spanValue && !numericValue)
3080 return gridLineName;
3081 } else {
3082 return nullptr;
3083 }
3084 }
3055 } 3085 }
3056 3086
3057 if (spanValue && numericValue && numericValue->getIntValue() < 0) 3087 if (spanValue && numericValue && numericValue->getIntValue() < 0)
3058 return nullptr; // Negative numbers are not allowed for span. 3088 return nullptr; // Negative numbers are not allowed for span.
3059 if (numericValue && numericValue->getIntValue() == 0) 3089 if (numericValue && numericValue->getIntValue() == 0)
3060 return nullptr; // An <integer> value of zero makes the declaration inva lid. 3090 return nullptr; // An <integer> value of zero makes the declaration inva lid.
3061 3091
3062 RawPtr<CSSValueList> values = CSSValueList::createSpaceSeparated(); 3092 CSSValueList* values = CSSValueList::createSpaceSeparated();
3063 if (spanValue) 3093 if (spanValue)
3064 values->append(spanValue.release()); 3094 values->append(spanValue);
3065 if (numericValue) 3095 if (numericValue)
3066 values->append(numericValue.release()); 3096 values->append(numericValue);
3067 if (gridLineName) 3097 if (gridLineName)
3068 values->append(gridLineName.release()); 3098 values->append(gridLineName);
3069 ASSERT(values->length()); 3099 ASSERT(values->length());
3070 return values.release(); 3100 return values;
3071 } 3101 }
3072 3102
3073 static RawPtr<CSSPrimitiveValue> consumeGridBreadth(CSSParserTokenRange& range, CSSParserMode cssParserMode, TrackSizeRestriction restriction = AllowAll) 3103 static CSSPrimitiveValue* consumeGridBreadth(CSSParserTokenRange& range, CSSPars erMode cssParserMode, TrackSizeRestriction restriction = AllowAll)
3074 { 3104 {
3075 if (restriction == AllowAll) { 3105 if (restriction == AllowAll) {
3076 const CSSParserToken& token = range.peek(); 3106 const CSSParserToken& token = range.peek();
3077 if (identMatches<CSSValueMinContent, CSSValueMaxContent, CSSValueAuto>(t oken.id())) 3107 if (identMatches<CSSValueMinContent, CSSValueMaxContent, CSSValueAuto>(t oken.id()))
3078 return consumeIdent(range); 3108 return consumeIdent(range);
3079 if (token.type() == DimensionToken && token.unitType() == CSSPrimitiveVa lue::UnitType::Fraction) { 3109 if (token.type() == DimensionToken && token.unitType() == CSSPrimitiveVa lue::UnitType::Fraction) {
3080 if (range.peek().numericValue() < 0) 3110 if (range.peek().numericValue() < 0)
3081 return nullptr; 3111 return nullptr;
3082 return cssValuePool().createValue(range.consumeIncludingWhitespace() .numericValue(), CSSPrimitiveValue::UnitType::Fraction); 3112 return cssValuePool().createValue(range.consumeIncludingWhitespace() .numericValue(), CSSPrimitiveValue::UnitType::Fraction);
3083 } 3113 }
3084 } 3114 }
3085 return consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative, U nitlessQuirk::Allow); 3115 return consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative, U nitlessQuirk::Allow);
3086 } 3116 }
3087 3117
3088 static RawPtr<CSSValue> consumeGridTrackSize(CSSParserTokenRange& range, CSSPars erMode cssParserMode, TrackSizeRestriction restriction = AllowAll) 3118 static CSSValue* consumeGridTrackSize(CSSParserTokenRange& range, CSSParserMode cssParserMode, TrackSizeRestriction restriction = AllowAll)
3089 { 3119 {
3090 const CSSParserToken& token = range.peek(); 3120 const CSSParserToken& token = range.peek();
3091 if (restriction == AllowAll && identMatches<CSSValueAuto>(token.id())) 3121 if (restriction == AllowAll && identMatches<CSSValueAuto>(token.id()))
3092 return consumeIdent(range); 3122 return consumeIdent(range);
3093 3123
3094 if (token.functionId() == CSSValueMinmax) { 3124 if (token.functionId() == CSSValueMinmax) {
3095 CSSParserTokenRange rangeCopy = range; 3125 CSSParserTokenRange rangeCopy = range;
3096 CSSParserTokenRange args = consumeFunction(rangeCopy); 3126 CSSParserTokenRange args = consumeFunction(rangeCopy);
3097 RawPtr<CSSPrimitiveValue> minTrackBreadth = consumeGridBreadth(args, css ParserMode, restriction); 3127 CSSPrimitiveValue* minTrackBreadth = consumeGridBreadth(args, cssParserM ode, restriction);
3098 if (!minTrackBreadth || !consumeCommaIncludingWhitespace(args)) 3128 if (!minTrackBreadth || !consumeCommaIncludingWhitespace(args))
3099 return nullptr; 3129 return nullptr;
3100 RawPtr<CSSPrimitiveValue> maxTrackBreadth = consumeGridBreadth(args, css ParserMode); 3130 CSSPrimitiveValue* maxTrackBreadth = consumeGridBreadth(args, cssParserM ode);
3101 if (!maxTrackBreadth || !args.atEnd()) 3131 if (!maxTrackBreadth || !args.atEnd())
3102 return nullptr; 3132 return nullptr;
3103 range = rangeCopy; 3133 range = rangeCopy;
3104 RawPtr<CSSFunctionValue> result = CSSFunctionValue::create(CSSValueMinma x); 3134 CSSFunctionValue* result = CSSFunctionValue::create(CSSValueMinmax);
3105 result->append(minTrackBreadth.release()); 3135 result->append(minTrackBreadth);
3106 result->append(maxTrackBreadth.release()); 3136 result->append(maxTrackBreadth);
3107 return result.release(); 3137 return result;
3108 } 3138 }
3109 return consumeGridBreadth(range, cssParserMode, restriction); 3139 return consumeGridBreadth(range, cssParserMode, restriction);
3110 } 3140 }
3111 3141
3112 static RawPtr<CSSGridLineNamesValue> consumeGridLineNames(CSSParserTokenRange& r ange) 3142 static CSSGridLineNamesValue* consumeGridLineNames(CSSParserTokenRange& range)
3113 { 3143 {
3114 CSSParserTokenRange rangeCopy = range; 3144 CSSParserTokenRange rangeCopy = range;
3115 if (rangeCopy.consumeIncludingWhitespace().type() != LeftBracketToken) 3145 if (rangeCopy.consumeIncludingWhitespace().type() != LeftBracketToken)
3116 return nullptr; 3146 return nullptr;
3117 RawPtr<CSSGridLineNamesValue> lineNames = CSSGridLineNamesValue::create(); 3147 CSSGridLineNamesValue* lineNames = CSSGridLineNamesValue::create();
3118 while (RawPtr<CSSCustomIdentValue> lineName = consumeCustomIdentForGridLine( rangeCopy)) 3148 while (CSSCustomIdentValue* lineName = consumeCustomIdentForGridLine(rangeCo py))
3119 lineNames->append(lineName.release()); 3149 lineNames->append(lineName);
3120 if (rangeCopy.consumeIncludingWhitespace().type() != RightBracketToken) 3150 if (rangeCopy.consumeIncludingWhitespace().type() != RightBracketToken)
3121 return nullptr; 3151 return nullptr;
3122 range = rangeCopy; 3152 range = rangeCopy;
3123 return lineNames.release(); 3153 return lineNames;
3124 } 3154 }
3125 3155
3126 static bool consumeGridTrackRepeatFunction(CSSParserTokenRange& range, CSSParser Mode cssParserMode, CSSValueList& list, bool& isAutoRepeat) 3156 static bool consumeGridTrackRepeatFunction(CSSParserTokenRange& range, CSSParser Mode cssParserMode, CSSValueList& list, bool& isAutoRepeat)
3127 { 3157 {
3128 CSSParserTokenRange args = consumeFunction(range); 3158 CSSParserTokenRange args = consumeFunction(range);
3129 // The number of repetitions for <auto-repeat> is not important at parsing l evel 3159 // The number of repetitions for <auto-repeat> is not important at parsing l evel
3130 // because it will be computed later, let's set it to 1. 3160 // because it will be computed later, let's set it to 1.
3131 size_t repetitions = 1; 3161 size_t repetitions = 1;
3132 isAutoRepeat = identMatches<CSSValueAutoFill, CSSValueAutoFit>(args.peek().i d()); 3162 isAutoRepeat = identMatches<CSSValueAutoFill, CSSValueAutoFit>(args.peek().i d());
3133 RawPtr<CSSValueList> repeatedValues; 3163 CSSValueList* repeatedValues;
3134 if (isAutoRepeat) { 3164 if (isAutoRepeat) {
3135 repeatedValues = CSSGridAutoRepeatValue::create(args.consumeIncludingWhi tespace().id()); 3165 repeatedValues = CSSGridAutoRepeatValue::create(args.consumeIncludingWhi tespace().id());
3136 } else { 3166 } else {
3137 // TODO(rob.buis): a consumeIntegerRaw would be more efficient here. 3167 // TODO(rob.buis): a consumeIntegerRaw would be more efficient here.
3138 RawPtr<CSSPrimitiveValue> repetition = consumePositiveInteger(args); 3168 CSSPrimitiveValue* repetition = consumePositiveInteger(args);
3139 if (!repetition) 3169 if (!repetition)
3140 return false; 3170 return false;
3141 repetitions = clampTo<size_t>(repetition->getDoubleValue(), 0, kGridMaxT racks); 3171 repetitions = clampTo<size_t>(repetition->getDoubleValue(), 0, kGridMaxT racks);
3142 repeatedValues = CSSValueList::createSpaceSeparated(); 3172 repeatedValues = CSSValueList::createSpaceSeparated();
3143 } 3173 }
3144 if (!consumeCommaIncludingWhitespace(args)) 3174 if (!consumeCommaIncludingWhitespace(args))
3145 return false; 3175 return false;
3146 RawPtr<CSSGridLineNamesValue> lineNames = consumeGridLineNames(args); 3176 CSSGridLineNamesValue* lineNames = consumeGridLineNames(args);
3147 if (lineNames) 3177 if (lineNames)
3148 repeatedValues->append(lineNames.release()); 3178 repeatedValues->append(lineNames);
3149 3179
3150 size_t numberOfTracks = 0; 3180 size_t numberOfTracks = 0;
3151 TrackSizeRestriction restriction = isAutoRepeat ? FixedSizeOnly : AllowAll; 3181 TrackSizeRestriction restriction = isAutoRepeat ? FixedSizeOnly : AllowAll;
3152 while (!args.atEnd()) { 3182 while (!args.atEnd()) {
3153 if (isAutoRepeat && numberOfTracks) 3183 if (isAutoRepeat && numberOfTracks)
3154 return false; 3184 return false;
3155 RawPtr<CSSValue> trackSize = consumeGridTrackSize(args, cssParserMode, r estriction); 3185 CSSValue* trackSize = consumeGridTrackSize(args, cssParserMode, restrict ion);
3156 if (!trackSize) 3186 if (!trackSize)
3157 return false; 3187 return false;
3158 repeatedValues->append(trackSize.release()); 3188 repeatedValues->append(trackSize);
3159 ++numberOfTracks; 3189 ++numberOfTracks;
3160 lineNames = consumeGridLineNames(args); 3190 lineNames = consumeGridLineNames(args);
3161 if (lineNames) 3191 if (lineNames)
3162 repeatedValues->append(lineNames.release()); 3192 repeatedValues->append(lineNames);
3163 } 3193 }
3164 // We should have found at least one <track-size> or else it is not a valid <track-list>. 3194 // We should have found at least one <track-size> or else it is not a valid <track-list>.
3165 if (!numberOfTracks) 3195 if (!numberOfTracks)
3166 return false; 3196 return false;
3167 3197
3168 if (isAutoRepeat) { 3198 if (isAutoRepeat) {
3169 list.append(repeatedValues.release()); 3199 list.append(repeatedValues);
3170 } else { 3200 } else {
3171 // We clamp the repetitions to a multiple of the repeat() track list's s ize, while staying below the max grid size. 3201 // We clamp the repetitions to a multiple of the repeat() track list's s ize, while staying below the max grid size.
3172 repetitions = std::min(repetitions, kGridMaxTracks / numberOfTracks); 3202 repetitions = std::min(repetitions, kGridMaxTracks / numberOfTracks);
3173 for (size_t i = 0; i < repetitions; ++i) { 3203 for (size_t i = 0; i < repetitions; ++i) {
3174 for (size_t j = 0; j < repeatedValues->length(); ++j) 3204 for (size_t j = 0; j < repeatedValues->length(); ++j)
3175 list.append(repeatedValues->item(j)); 3205 list.append(repeatedValues->item(j));
3176 } 3206 }
3177 } 3207 }
3178 return true; 3208 return true;
3179 } 3209 }
3180 3210
3181 static RawPtr<CSSValue> consumeGridTrackList(CSSParserTokenRange& range, CSSPars erMode cssParserMode) 3211 static CSSValue* consumeGridTrackList(CSSParserTokenRange& range, CSSParserMode cssParserMode)
3182 { 3212 {
3183 RawPtr<CSSValueList> values = CSSValueList::createSpaceSeparated(); 3213 CSSValueList* values = CSSValueList::createSpaceSeparated();
3184 RawPtr<CSSGridLineNamesValue> lineNames = consumeGridLineNames(range); 3214 CSSGridLineNamesValue* lineNames = consumeGridLineNames(range);
3185 if (lineNames) 3215 if (lineNames)
3186 values->append(lineNames.release()); 3216 values->append(lineNames);
3187 3217
3188 bool seenAutoRepeat = false; 3218 bool seenAutoRepeat = false;
3189 // TODO(rob.buis): <line-names> should not be able to directly precede <auto -repeat>. 3219 // TODO(rob.buis): <line-names> should not be able to directly precede <auto -repeat>.
3190 do { 3220 do {
3191 bool isAutoRepeat; 3221 bool isAutoRepeat;
3192 if (range.peek().functionId() == CSSValueRepeat) { 3222 if (range.peek().functionId() == CSSValueRepeat) {
3193 if (!consumeGridTrackRepeatFunction(range, cssParserMode, *values, i sAutoRepeat)) 3223 if (!consumeGridTrackRepeatFunction(range, cssParserMode, *values, i sAutoRepeat))
3194 return nullptr; 3224 return nullptr;
3195 if (isAutoRepeat && seenAutoRepeat) 3225 if (isAutoRepeat && seenAutoRepeat)
3196 return nullptr; 3226 return nullptr;
3197 seenAutoRepeat = seenAutoRepeat || isAutoRepeat; 3227 seenAutoRepeat = seenAutoRepeat || isAutoRepeat;
3198 } else if (RawPtr<CSSValue> value = consumeGridTrackSize(range, cssParse rMode, seenAutoRepeat ? FixedSizeOnly : AllowAll)) { 3228 } else if (CSSValue* value = consumeGridTrackSize(range, cssParserMode, seenAutoRepeat ? FixedSizeOnly : AllowAll)) {
3199 values->append(value.release()); 3229 values->append(value);
3200 } else { 3230 } else {
3201 return nullptr; 3231 return nullptr;
3202 } 3232 }
3203 lineNames = consumeGridLineNames(range); 3233 lineNames = consumeGridLineNames(range);
3204 if (lineNames) 3234 if (lineNames)
3205 values->append(lineNames.release()); 3235 values->append(lineNames);
3206 } while (!range.atEnd() && range.peek().type() != DelimiterToken); 3236 } while (!range.atEnd() && range.peek().type() != DelimiterToken);
3207 // <auto-repeat> requires definite minimum track sizes in order to compute t he number of repetitions. 3237 // <auto-repeat> requires definite minimum track sizes in order to compute t he number of repetitions.
3208 // The above while loop detects those appearances after the <auto-repeat> bu t not the ones before. 3238 // The above while loop detects those appearances after the <auto-repeat> bu t not the ones before.
3209 if (seenAutoRepeat && !allTracksAreFixedSized(*values)) 3239 if (seenAutoRepeat && !allTracksAreFixedSized(*values))
3210 return nullptr; 3240 return nullptr;
3211 return values.release(); 3241 return values;
3212 } 3242 }
3213 3243
3214 static RawPtr<CSSValue> consumeGridTemplatesRowsOrColumns(CSSParserTokenRange& r ange, CSSParserMode cssParserMode) 3244 static CSSValue* consumeGridTemplatesRowsOrColumns(CSSParserTokenRange& range, C SSParserMode cssParserMode)
3215 { 3245 {
3216 if (range.peek().id() == CSSValueNone) 3246 if (range.peek().id() == CSSValueNone)
3217 return consumeIdent(range); 3247 return consumeIdent(range);
3218 return consumeGridTrackList(range, cssParserMode); 3248 return consumeGridTrackList(range, cssParserMode);
3219 } 3249 }
3220 3250
3221 static RawPtr<CSSValue> consumeGridTemplateAreas(CSSParserTokenRange& range) 3251 static CSSValue* consumeGridTemplateAreas(CSSParserTokenRange& range)
3222 { 3252 {
3223 if (range.peek().id() == CSSValueNone) 3253 if (range.peek().id() == CSSValueNone)
3224 return consumeIdent(range); 3254 return consumeIdent(range);
3225 3255
3226 NamedGridAreaMap gridAreaMap; 3256 NamedGridAreaMap gridAreaMap;
3227 size_t rowCount = 0; 3257 size_t rowCount = 0;
3228 size_t columnCount = 0; 3258 size_t columnCount = 0;
3229 3259
3230 while (range.peek().type() == StringToken) { 3260 while (range.peek().type() == StringToken) {
3231 if (!parseGridTemplateAreasRow(range.consumeIncludingWhitespace().value( ), gridAreaMap, rowCount, columnCount)) 3261 if (!parseGridTemplateAreasRow(range.consumeIncludingWhitespace().value( ), gridAreaMap, rowCount, columnCount))
3232 return nullptr; 3262 return nullptr;
3233 ++rowCount; 3263 ++rowCount;
3234 } 3264 }
3235 3265
3236 if (rowCount == 0) 3266 if (rowCount == 0)
3237 return nullptr; 3267 return nullptr;
3238 ASSERT(columnCount); 3268 ASSERT(columnCount);
3239 return CSSGridTemplateAreasValue::create(gridAreaMap, rowCount, columnCount) ; 3269 return CSSGridTemplateAreasValue::create(gridAreaMap, rowCount, columnCount) ;
3240 } 3270 }
3241 3271
3242 RawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSPropertyID unresolvedPro perty) 3272 CSSValue* CSSPropertyParser::parseSingleValue(CSSPropertyID unresolvedProperty)
3243 { 3273 {
3244 CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty); 3274 CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty);
3245 if (CSSParserFastPaths::isKeywordPropertyID(property)) { 3275 if (CSSParserFastPaths::isKeywordPropertyID(property)) {
3246 if (!CSSParserFastPaths::isValidKeywordPropertyAndValue(property, m_rang e.peek().id())) 3276 if (!CSSParserFastPaths::isValidKeywordPropertyAndValue(property, m_rang e.peek().id()))
3247 return nullptr; 3277 return nullptr;
3248 return consumeIdent(m_range); 3278 return consumeIdent(m_range);
3249 } 3279 }
3250 switch (property) { 3280 switch (property) {
3251 case CSSPropertyWillChange: 3281 case CSSPropertyWillChange:
3252 return consumeWillChange(m_range); 3282 return consumeWillChange(m_range);
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after
3615 case CSSPropertyGridTemplateRows: 3645 case CSSPropertyGridTemplateRows:
3616 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); 3646 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled());
3617 return consumeGridTemplatesRowsOrColumns(m_range, m_context.mode()); 3647 return consumeGridTemplatesRowsOrColumns(m_range, m_context.mode());
3618 case CSSPropertyGridTemplateAreas: 3648 case CSSPropertyGridTemplateAreas:
3619 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); 3649 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled());
3620 return consumeGridTemplateAreas(m_range); 3650 return consumeGridTemplateAreas(m_range);
3621 default: 3651 default:
3622 CSSParserValueList valueList(m_range); 3652 CSSParserValueList valueList(m_range);
3623 if (valueList.size()) { 3653 if (valueList.size()) {
3624 m_valueList = &valueList; 3654 m_valueList = &valueList;
3625 if (RawPtr<CSSValue> result = legacyParseValue(unresolvedProperty)) { 3655 if (CSSValue* result = legacyParseValue(unresolvedProperty)) {
3626 while (!m_range.atEnd()) 3656 while (!m_range.atEnd())
3627 m_range.consume(); 3657 m_range.consume();
3628 return result.release(); 3658 return result;
3629 } 3659 }
3630 } 3660 }
3631 return nullptr; 3661 return nullptr;
3632 } 3662 }
3633 } 3663 }
3634 3664
3635 static RawPtr<CSSValueList> consumeFontFaceUnicodeRange(CSSParserTokenRange& ran ge) 3665 static CSSValueList* consumeFontFaceUnicodeRange(CSSParserTokenRange& range)
3636 { 3666 {
3637 RawPtr<CSSValueList> values = CSSValueList::createCommaSeparated(); 3667 CSSValueList* values = CSSValueList::createCommaSeparated();
3638 3668
3639 do { 3669 do {
3640 const CSSParserToken& token = range.consumeIncludingWhitespace(); 3670 const CSSParserToken& token = range.consumeIncludingWhitespace();
3641 if (token.type() != UnicodeRangeToken) 3671 if (token.type() != UnicodeRangeToken)
3642 return nullptr; 3672 return nullptr;
3643 3673
3644 UChar32 start = token.unicodeRangeStart(); 3674 UChar32 start = token.unicodeRangeStart();
3645 UChar32 end = token.unicodeRangeEnd(); 3675 UChar32 end = token.unicodeRangeEnd();
3646 if (start > end) 3676 if (start > end)
3647 return nullptr; 3677 return nullptr;
3648 values->append(CSSUnicodeRangeValue::create(start, end)); 3678 values->append(CSSUnicodeRangeValue::create(start, end));
3649 } while (consumeCommaIncludingWhitespace(range)); 3679 } while (consumeCommaIncludingWhitespace(range));
3650 3680
3651 return values.release(); 3681 return values;
3652 } 3682 }
3653 3683
3654 static RawPtr<CSSValue> consumeFontFaceSrcURI(CSSParserTokenRange& range, const CSSParserContext& context) 3684 static CSSValue* consumeFontFaceSrcURI(CSSParserTokenRange& range, const CSSPars erContext& context)
3655 { 3685 {
3656 String url = consumeUrl(range); 3686 String url = consumeUrl(range);
3657 if (url.isNull()) 3687 if (url.isNull())
3658 return nullptr; 3688 return nullptr;
3659 RawPtr<CSSFontFaceSrcValue> uriValue(CSSFontFaceSrcValue::create(url, contex t.completeURL(url), context.shouldCheckContentSecurityPolicy())); 3689 CSSFontFaceSrcValue* uriValue(CSSFontFaceSrcValue::create(url, context.compl eteURL(url), context.shouldCheckContentSecurityPolicy()));
3660 uriValue->setReferrer(context.referrer()); 3690 uriValue->setReferrer(context.referrer());
3661 3691
3662 if (range.peek().functionId() != CSSValueFormat) 3692 if (range.peek().functionId() != CSSValueFormat)
3663 return uriValue.release(); 3693 return uriValue;
3664 3694
3665 // FIXME: https://drafts.csswg.org/css-fonts says that format() contains a c omma-separated list of strings, 3695 // FIXME: https://drafts.csswg.org/css-fonts says that format() contains a c omma-separated list of strings,
3666 // but CSSFontFaceSrcValue stores only one format. Allowing one format for n ow. 3696 // but CSSFontFaceSrcValue stores only one format. Allowing one format for n ow.
3667 // FIXME: IdentToken should not be supported here. 3697 // FIXME: IdentToken should not be supported here.
3668 CSSParserTokenRange args = consumeFunction(range); 3698 CSSParserTokenRange args = consumeFunction(range);
3669 const CSSParserToken& arg = args.consumeIncludingWhitespace(); 3699 const CSSParserToken& arg = args.consumeIncludingWhitespace();
3670 if ((arg.type() != StringToken && arg.type() != IdentToken) || !args.atEnd() ) 3700 if ((arg.type() != StringToken && arg.type() != IdentToken) || !args.atEnd() )
3671 return nullptr; 3701 return nullptr;
3672 uriValue->setFormat(arg.value()); 3702 uriValue->setFormat(arg.value());
3673 return uriValue.release(); 3703 return uriValue;
3674 } 3704 }
3675 3705
3676 static RawPtr<CSSValue> consumeFontFaceSrcLocal(CSSParserTokenRange& range, cons t CSSParserContext& context) 3706 static CSSValue* consumeFontFaceSrcLocal(CSSParserTokenRange& range, const CSSPa rserContext& context)
3677 { 3707 {
3678 CSSParserTokenRange args = consumeFunction(range); 3708 CSSParserTokenRange args = consumeFunction(range);
3679 ContentSecurityPolicyDisposition shouldCheckContentSecurityPolicy = context. shouldCheckContentSecurityPolicy(); 3709 ContentSecurityPolicyDisposition shouldCheckContentSecurityPolicy = context. shouldCheckContentSecurityPolicy();
3680 if (args.peek().type() == StringToken) { 3710 if (args.peek().type() == StringToken) {
3681 const CSSParserToken& arg = args.consumeIncludingWhitespace(); 3711 const CSSParserToken& arg = args.consumeIncludingWhitespace();
3682 if (!args.atEnd()) 3712 if (!args.atEnd())
3683 return nullptr; 3713 return nullptr;
3684 return CSSFontFaceSrcValue::createLocal(arg.value(), shouldCheckContentS ecurityPolicy); 3714 return CSSFontFaceSrcValue::createLocal(arg.value(), shouldCheckContentS ecurityPolicy);
3685 } 3715 }
3686 if (args.peek().type() == IdentToken) { 3716 if (args.peek().type() == IdentToken) {
3687 String familyName = concatenateFamilyName(args); 3717 String familyName = concatenateFamilyName(args);
3688 if (!args.atEnd()) 3718 if (!args.atEnd())
3689 return nullptr; 3719 return nullptr;
3690 return CSSFontFaceSrcValue::createLocal(familyName, shouldCheckContentSe curityPolicy); 3720 return CSSFontFaceSrcValue::createLocal(familyName, shouldCheckContentSe curityPolicy);
3691 } 3721 }
3692 return nullptr; 3722 return nullptr;
3693 } 3723 }
3694 3724
3695 static RawPtr<CSSValueList> consumeFontFaceSrc(CSSParserTokenRange& range, const CSSParserContext& context) 3725 static CSSValueList* consumeFontFaceSrc(CSSParserTokenRange& range, const CSSPar serContext& context)
3696 { 3726 {
3697 RawPtr<CSSValueList> values(CSSValueList::createCommaSeparated()); 3727 CSSValueList* values = CSSValueList::createCommaSeparated();
3698 3728
3699 do { 3729 do {
3700 const CSSParserToken& token = range.peek(); 3730 const CSSParserToken& token = range.peek();
3701 RawPtr<CSSValue> parsedValue = nullptr; 3731 CSSValue* parsedValue = nullptr;
3702 if (token.functionId() == CSSValueLocal) 3732 if (token.functionId() == CSSValueLocal)
3703 parsedValue = consumeFontFaceSrcLocal(range, context); 3733 parsedValue = consumeFontFaceSrcLocal(range, context);
3704 else 3734 else
3705 parsedValue = consumeFontFaceSrcURI(range, context); 3735 parsedValue = consumeFontFaceSrcURI(range, context);
3706 if (!parsedValue) 3736 if (!parsedValue)
3707 return nullptr; 3737 return nullptr;
3708 values->append(parsedValue); 3738 values->append(parsedValue);
3709 } while (consumeCommaIncludingWhitespace(range)); 3739 } while (consumeCommaIncludingWhitespace(range));
3710 return values.release(); 3740 return values;
3711 } 3741 }
3712 3742
3713 bool CSSPropertyParser::parseFontFaceDescriptor(CSSPropertyID propId) 3743 bool CSSPropertyParser::parseFontFaceDescriptor(CSSPropertyID propId)
3714 { 3744 {
3715 RawPtr<CSSValue> parsedValue = nullptr; 3745 CSSValue* parsedValue = nullptr;
3716 switch (propId) { 3746 switch (propId) {
3717 case CSSPropertyFontFamily: 3747 case CSSPropertyFontFamily:
3718 if (consumeGenericFamily(m_range)) 3748 if (consumeGenericFamily(m_range))
3719 return false; 3749 return false;
3720 parsedValue = consumeFamilyName(m_range); 3750 parsedValue = consumeFamilyName(m_range);
3721 break; 3751 break;
3722 case CSSPropertySrc: // This is a list of urls or local references. 3752 case CSSPropertySrc: // This is a list of urls or local references.
3723 parsedValue = consumeFontFaceSrc(m_range, m_context); 3753 parsedValue = consumeFontFaceSrc(m_range, m_context);
3724 break; 3754 break;
3725 case CSSPropertyUnicodeRange: 3755 case CSSPropertyUnicodeRange:
(...skipping 17 matching lines...) Expand all
3743 case CSSPropertyFontFeatureSettings: 3773 case CSSPropertyFontFeatureSettings:
3744 parsedValue = consumeFontFeatureSettings(m_range); 3774 parsedValue = consumeFontFeatureSettings(m_range);
3745 break; 3775 break;
3746 default: 3776 default:
3747 break; 3777 break;
3748 } 3778 }
3749 3779
3750 if (!parsedValue || !m_range.atEnd()) 3780 if (!parsedValue || !m_range.atEnd())
3751 return false; 3781 return false;
3752 3782
3753 addProperty(propId, parsedValue.release(), false); 3783 addProperty(propId, parsedValue, false);
3754 return true; 3784 return true;
3755 } 3785 }
3756 3786
3757 bool CSSPropertyParser::consumeSystemFont(bool important) 3787 bool CSSPropertyParser::consumeSystemFont(bool important)
3758 { 3788 {
3759 CSSValueID systemFontID = m_range.consumeIncludingWhitespace().id(); 3789 CSSValueID systemFontID = m_range.consumeIncludingWhitespace().id();
3760 ASSERT(systemFontID >= CSSValueCaption && systemFontID <= CSSValueStatusBar) ; 3790 ASSERT(systemFontID >= CSSValueCaption && systemFontID <= CSSValueStatusBar) ;
3761 if (!m_range.atEnd()) 3791 if (!m_range.atEnd())
3762 return false; 3792 return false;
3763 3793
3764 FontStyle fontStyle = FontStyleNormal; 3794 FontStyle fontStyle = FontStyleNormal;
3765 FontWeight fontWeight = FontWeightNormal; 3795 FontWeight fontWeight = FontWeightNormal;
3766 float fontSize = 0; 3796 float fontSize = 0;
3767 AtomicString fontFamily; 3797 AtomicString fontFamily;
3768 LayoutTheme::theme().systemFont(systemFontID, fontStyle, fontWeight, fontSiz e, fontFamily); 3798 LayoutTheme::theme().systemFont(systemFontID, fontStyle, fontWeight, fontSiz e, fontFamily);
3769 3799
3770 addProperty(CSSPropertyFontStyle, cssValuePool().createIdentifierValue(fontS tyle == FontStyleItalic ? CSSValueItalic : CSSValueNormal), important); 3800 addProperty(CSSPropertyFontStyle, cssValuePool().createIdentifierValue(fontS tyle == FontStyleItalic ? CSSValueItalic : CSSValueNormal), important);
3771 addProperty(CSSPropertyFontWeight, cssValuePool().createValue(fontWeight), i mportant); 3801 addProperty(CSSPropertyFontWeight, cssValuePool().createValue(fontWeight), i mportant);
3772 addProperty(CSSPropertyFontSize, cssValuePool().createValue(fontSize, CSSPri mitiveValue::UnitType::Pixels), important); 3802 addProperty(CSSPropertyFontSize, cssValuePool().createValue(fontSize, CSSPri mitiveValue::UnitType::Pixels), important);
3773 RawPtr<CSSValueList> fontFamilyList = CSSValueList::createCommaSeparated(); 3803 CSSValueList* fontFamilyList = CSSValueList::createCommaSeparated();
3774 fontFamilyList->append(cssValuePool().createFontFamilyValue(fontFamily)); 3804 fontFamilyList->append(cssValuePool().createFontFamilyValue(fontFamily));
3775 addProperty(CSSPropertyFontFamily, fontFamilyList.release(), important); 3805 addProperty(CSSPropertyFontFamily, fontFamilyList, important);
3776 3806
3777 addProperty(CSSPropertyFontStretch, cssValuePool().createIdentifierValue(CSS ValueNormal), important); 3807 addProperty(CSSPropertyFontStretch, cssValuePool().createIdentifierValue(CSS ValueNormal), important);
3778 addProperty(CSSPropertyFontVariant, cssValuePool().createIdentifierValue(CSS ValueNormal), important); 3808 addProperty(CSSPropertyFontVariant, cssValuePool().createIdentifierValue(CSS ValueNormal), important);
3779 addProperty(CSSPropertyLineHeight, cssValuePool().createIdentifierValue(CSSV alueNormal), important); 3809 addProperty(CSSPropertyLineHeight, cssValuePool().createIdentifierValue(CSSV alueNormal), important);
3780 return true; 3810 return true;
3781 } 3811 }
3782 3812
3783 bool CSSPropertyParser::consumeFont(bool important) 3813 bool CSSPropertyParser::consumeFont(bool important)
3784 { 3814 {
3785 // Let's check if there is an inherit or initial somewhere in the shorthand. 3815 // Let's check if there is an inherit or initial somewhere in the shorthand.
3786 CSSParserTokenRange range = m_range; 3816 CSSParserTokenRange range = m_range;
3787 while (!range.atEnd()) { 3817 while (!range.atEnd()) {
3788 CSSValueID id = range.consumeIncludingWhitespace().id(); 3818 CSSValueID id = range.consumeIncludingWhitespace().id();
3789 if (id == CSSValueInherit || id == CSSValueInitial) 3819 if (id == CSSValueInherit || id == CSSValueInitial)
3790 return false; 3820 return false;
3791 } 3821 }
3792 // Optional font-style, font-variant, font-stretch and font-weight. 3822 // Optional font-style, font-variant, font-stretch and font-weight.
3793 RawPtr<CSSPrimitiveValue> fontStyle = nullptr; 3823 CSSPrimitiveValue* fontStyle = nullptr;
3794 RawPtr<CSSPrimitiveValue> fontVariant = nullptr; 3824 CSSPrimitiveValue* fontVariant = nullptr;
3795 RawPtr<CSSPrimitiveValue> fontWeight = nullptr; 3825 CSSPrimitiveValue* fontWeight = nullptr;
3796 RawPtr<CSSPrimitiveValue> fontStretch = nullptr; 3826 CSSPrimitiveValue* fontStretch = nullptr;
3797 while (!m_range.atEnd()) { 3827 while (!m_range.atEnd()) {
3798 CSSValueID id = m_range.peek().id(); 3828 CSSValueID id = m_range.peek().id();
3799 if (!fontStyle && CSSParserFastPaths::isValidKeywordPropertyAndValue(CSS PropertyFontStyle, id)) { 3829 if (!fontStyle && CSSParserFastPaths::isValidKeywordPropertyAndValue(CSS PropertyFontStyle, id)) {
3800 fontStyle = consumeIdent(m_range); 3830 fontStyle = consumeIdent(m_range);
3801 continue; 3831 continue;
3802 } 3832 }
3803 if (!fontVariant) { 3833 if (!fontVariant) {
3804 // Font variant in the shorthand is particular, it only accepts norm al or small-caps. 3834 // Font variant in the shorthand is particular, it only accepts norm al or small-caps.
3805 fontVariant = consumeFontVariant(m_range); 3835 fontVariant = consumeFontVariant(m_range);
3806 if (fontVariant) 3836 if (fontVariant)
3807 continue; 3837 continue;
3808 } 3838 }
3809 if (!fontWeight) { 3839 if (!fontWeight) {
3810 fontWeight = consumeFontWeight(m_range); 3840 fontWeight = consumeFontWeight(m_range);
3811 if (fontWeight) 3841 if (fontWeight)
3812 continue; 3842 continue;
3813 } 3843 }
3814 if (!fontStretch && CSSParserFastPaths::isValidKeywordPropertyAndValue(C SSPropertyFontStretch, id)) 3844 if (!fontStretch && CSSParserFastPaths::isValidKeywordPropertyAndValue(C SSPropertyFontStretch, id))
3815 fontStretch = consumeIdent(m_range); 3845 fontStretch = consumeIdent(m_range);
3816 else 3846 else
3817 break; 3847 break;
3818 } 3848 }
3819 3849
3820 if (m_range.atEnd()) 3850 if (m_range.atEnd())
3821 return false; 3851 return false;
3822 3852
3823 addProperty(CSSPropertyFontStyle, fontStyle ? fontStyle.release() : cssValue Pool().createIdentifierValue(CSSValueNormal), important); 3853 addProperty(CSSPropertyFontStyle, fontStyle ? fontStyle : cssValuePool().cre ateIdentifierValue(CSSValueNormal), important);
3824 addProperty(CSSPropertyFontVariant, fontVariant ? fontVariant.release() : cs sValuePool().createIdentifierValue(CSSValueNormal), important); 3854 addProperty(CSSPropertyFontVariant, fontVariant ? fontVariant : cssValuePool ().createIdentifierValue(CSSValueNormal), important);
3825 addProperty(CSSPropertyFontWeight, fontWeight ? fontWeight.release() : cssVa luePool().createIdentifierValue(CSSValueNormal), important); 3855 addProperty(CSSPropertyFontWeight, fontWeight ? fontWeight : cssValuePool(). createIdentifierValue(CSSValueNormal), important);
3826 addProperty(CSSPropertyFontStretch, fontStretch ? fontStretch.release() : cs sValuePool().createIdentifierValue(CSSValueNormal), important); 3856 addProperty(CSSPropertyFontStretch, fontStretch ? fontStretch : cssValuePool ().createIdentifierValue(CSSValueNormal), important);
3827 3857
3828 // Now a font size _must_ come. 3858 // Now a font size _must_ come.
3829 RawPtr<CSSValue> fontSize = consumeFontSize(m_range, m_context.mode()); 3859 CSSValue* fontSize = consumeFontSize(m_range, m_context.mode());
3830 if (!fontSize || m_range.atEnd()) 3860 if (!fontSize || m_range.atEnd())
3831 return false; 3861 return false;
3832 3862
3833 addProperty(CSSPropertyFontSize, fontSize.release(), important); 3863 addProperty(CSSPropertyFontSize, fontSize, important);
3834 3864
3835 if (consumeSlashIncludingWhitespace(m_range)) { 3865 if (consumeSlashIncludingWhitespace(m_range)) {
3836 RawPtr<CSSPrimitiveValue> lineHeight = consumeLineHeight(m_range, m_cont ext.mode()); 3866 CSSPrimitiveValue* lineHeight = consumeLineHeight(m_range, m_context.mod e());
3837 if (!lineHeight) 3867 if (!lineHeight)
3838 return false; 3868 return false;
3839 addProperty(CSSPropertyLineHeight, lineHeight.release(), important); 3869 addProperty(CSSPropertyLineHeight, lineHeight, important);
3840 } else { 3870 } else {
3841 addProperty(CSSPropertyLineHeight, cssValuePool().createIdentifierValue( CSSValueNormal), important); 3871 addProperty(CSSPropertyLineHeight, cssValuePool().createIdentifierValue( CSSValueNormal), important);
3842 } 3872 }
3843 3873
3844 // Font family must come now. 3874 // Font family must come now.
3845 RawPtr<CSSValue> parsedFamilyValue = consumeFontFamily(m_range); 3875 CSSValue* parsedFamilyValue = consumeFontFamily(m_range);
3846 if (!parsedFamilyValue) 3876 if (!parsedFamilyValue)
3847 return false; 3877 return false;
3848 3878
3849 addProperty(CSSPropertyFontFamily, parsedFamilyValue.release(), important); 3879 addProperty(CSSPropertyFontFamily, parsedFamilyValue, important);
3850 3880
3851 // FIXME: http://www.w3.org/TR/2011/WD-css3-fonts-20110324/#font-prop requir es that 3881 // FIXME: http://www.w3.org/TR/2011/WD-css3-fonts-20110324/#font-prop requir es that
3852 // "font-stretch", "font-size-adjust", and "font-kerning" be reset to their initial values 3882 // "font-stretch", "font-size-adjust", and "font-kerning" be reset to their initial values
3853 // but we don't seem to support them at the moment. They should also be adde d here once implemented. 3883 // but we don't seem to support them at the moment. They should also be adde d here once implemented.
3854 return m_range.atEnd(); 3884 return m_range.atEnd();
3855 } 3885 }
3856 3886
3857 bool CSSPropertyParser::consumeBorderSpacing(bool important) 3887 bool CSSPropertyParser::consumeBorderSpacing(bool important)
3858 { 3888 {
3859 RawPtr<CSSValue> horizontalSpacing = consumeLength(m_range, m_context.mode() , ValueRangeNonNegative, UnitlessQuirk::Allow); 3889 CSSValue* horizontalSpacing = consumeLength(m_range, m_context.mode(), Value RangeNonNegative, UnitlessQuirk::Allow);
3860 if (!horizontalSpacing) 3890 if (!horizontalSpacing)
3861 return false; 3891 return false;
3862 RawPtr<CSSValue> verticalSpacing = horizontalSpacing; 3892 CSSValue* verticalSpacing = horizontalSpacing;
3863 if (!m_range.atEnd()) 3893 if (!m_range.atEnd())
3864 verticalSpacing = consumeLength(m_range, m_context.mode(), ValueRangeNon Negative, UnitlessQuirk::Allow); 3894 verticalSpacing = consumeLength(m_range, m_context.mode(), ValueRangeNon Negative, UnitlessQuirk::Allow);
3865 if (!verticalSpacing || !m_range.atEnd()) 3895 if (!verticalSpacing || !m_range.atEnd())
3866 return false; 3896 return false;
3867 addProperty(CSSPropertyWebkitBorderHorizontalSpacing, horizontalSpacing.rele ase(), important); 3897 addProperty(CSSPropertyWebkitBorderHorizontalSpacing, horizontalSpacing, imp ortant);
3868 addProperty(CSSPropertyWebkitBorderVerticalSpacing, verticalSpacing.release( ), important); 3898 addProperty(CSSPropertyWebkitBorderVerticalSpacing, verticalSpacing, importa nt);
3869 return true; 3899 return true;
3870 } 3900 }
3871 3901
3872 static RawPtr<CSSValue> consumeSingleViewportDescriptor(CSSParserTokenRange& ran ge, CSSPropertyID propId, CSSParserMode cssParserMode) 3902 static CSSValue* consumeSingleViewportDescriptor(CSSParserTokenRange& range, CSS PropertyID propId, CSSParserMode cssParserMode)
3873 { 3903 {
3874 CSSValueID id = range.peek().id(); 3904 CSSValueID id = range.peek().id();
3875 switch (propId) { 3905 switch (propId) {
3876 case CSSPropertyMinWidth: 3906 case CSSPropertyMinWidth:
3877 case CSSPropertyMaxWidth: 3907 case CSSPropertyMaxWidth:
3878 case CSSPropertyMinHeight: 3908 case CSSPropertyMinHeight:
3879 case CSSPropertyMaxHeight: 3909 case CSSPropertyMaxHeight:
3880 if (id == CSSValueAuto || id == CSSValueInternalExtendToZoom) 3910 if (id == CSSValueAuto || id == CSSValueInternalExtendToZoom)
3881 return consumeIdent(range); 3911 return consumeIdent(range);
3882 return consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegativ e); 3912 return consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegativ e);
3883 case CSSPropertyMinZoom: 3913 case CSSPropertyMinZoom:
3884 case CSSPropertyMaxZoom: 3914 case CSSPropertyMaxZoom:
3885 case CSSPropertyZoom: { 3915 case CSSPropertyZoom: {
3886 if (id == CSSValueAuto) 3916 if (id == CSSValueAuto)
3887 return consumeIdent(range); 3917 return consumeIdent(range);
3888 RawPtr<CSSValue> parsedValue = consumeNumber(range, ValueRangeNonNegativ e); 3918 CSSValue* parsedValue = consumeNumber(range, ValueRangeNonNegative);
3889 if (parsedValue) 3919 if (parsedValue)
3890 return parsedValue.release(); 3920 return parsedValue;
3891 return consumePercent(range, ValueRangeNonNegative); 3921 return consumePercent(range, ValueRangeNonNegative);
3892 } 3922 }
3893 case CSSPropertyUserZoom: 3923 case CSSPropertyUserZoom:
3894 return consumeIdent<CSSValueZoom, CSSValueFixed>(range); 3924 return consumeIdent<CSSValueZoom, CSSValueFixed>(range);
3895 case CSSPropertyOrientation: 3925 case CSSPropertyOrientation:
3896 return consumeIdent<CSSValueAuto, CSSValuePortrait, CSSValueLandscape>(r ange); 3926 return consumeIdent<CSSValueAuto, CSSValuePortrait, CSSValueLandscape>(r ange);
3897 default: 3927 default:
3898 ASSERT_NOT_REACHED(); 3928 ASSERT_NOT_REACHED();
3899 break; 3929 break;
3900 } 3930 }
3901 3931
3902 ASSERT_NOT_REACHED(); 3932 ASSERT_NOT_REACHED();
3903 return nullptr; 3933 return nullptr;
3904 } 3934 }
3905 3935
3906 bool CSSPropertyParser::parseViewportDescriptor(CSSPropertyID propId, bool impor tant) 3936 bool CSSPropertyParser::parseViewportDescriptor(CSSPropertyID propId, bool impor tant)
3907 { 3937 {
3908 ASSERT(RuntimeEnabledFeatures::cssViewportEnabled() || isUASheetBehavior(m_c ontext.mode())); 3938 ASSERT(RuntimeEnabledFeatures::cssViewportEnabled() || isUASheetBehavior(m_c ontext.mode()));
3909 3939
3910 switch (propId) { 3940 switch (propId) {
3911 case CSSPropertyWidth: { 3941 case CSSPropertyWidth: {
3912 RawPtr<CSSValue> minWidth = consumeSingleViewportDescriptor(m_range, CSS PropertyMinWidth, m_context.mode()); 3942 CSSValue* minWidth = consumeSingleViewportDescriptor(m_range, CSSPropert yMinWidth, m_context.mode());
3913 if (!minWidth) 3943 if (!minWidth)
3914 return false; 3944 return false;
3915 RawPtr<CSSValue> maxWidth = minWidth; 3945 CSSValue* maxWidth = minWidth;
3916 if (!m_range.atEnd()) 3946 if (!m_range.atEnd())
3917 maxWidth = consumeSingleViewportDescriptor(m_range, CSSPropertyMaxWi dth, m_context.mode()); 3947 maxWidth = consumeSingleViewportDescriptor(m_range, CSSPropertyMaxWi dth, m_context.mode());
3918 if (!maxWidth || !m_range.atEnd()) 3948 if (!maxWidth || !m_range.atEnd())
3919 return false; 3949 return false;
3920 addProperty(CSSPropertyMinWidth, minWidth.release(), important); 3950 addProperty(CSSPropertyMinWidth, minWidth, important);
3921 addProperty(CSSPropertyMaxWidth, maxWidth.release(), important); 3951 addProperty(CSSPropertyMaxWidth, maxWidth, important);
3922 return true; 3952 return true;
3923 } 3953 }
3924 case CSSPropertyHeight: { 3954 case CSSPropertyHeight: {
3925 RawPtr<CSSValue> minHeight = consumeSingleViewportDescriptor(m_range, CS SPropertyMinHeight, m_context.mode()); 3955 CSSValue* minHeight = consumeSingleViewportDescriptor(m_range, CSSProper tyMinHeight, m_context.mode());
3926 if (!minHeight) 3956 if (!minHeight)
3927 return false; 3957 return false;
3928 RawPtr<CSSValue> maxHeight = minHeight; 3958 CSSValue* maxHeight = minHeight;
3929 if (!m_range.atEnd()) 3959 if (!m_range.atEnd())
3930 maxHeight = consumeSingleViewportDescriptor(m_range, CSSPropertyMaxH eight, m_context.mode()); 3960 maxHeight = consumeSingleViewportDescriptor(m_range, CSSPropertyMaxH eight, m_context.mode());
3931 if (!maxHeight || !m_range.atEnd()) 3961 if (!maxHeight || !m_range.atEnd())
3932 return false; 3962 return false;
3933 addProperty(CSSPropertyMinHeight, minHeight.release(), important); 3963 addProperty(CSSPropertyMinHeight, minHeight, important);
3934 addProperty(CSSPropertyMaxHeight, maxHeight.release(), important); 3964 addProperty(CSSPropertyMaxHeight, maxHeight, important);
3935 return true; 3965 return true;
3936 } 3966 }
3937 case CSSPropertyMinWidth: 3967 case CSSPropertyMinWidth:
3938 case CSSPropertyMaxWidth: 3968 case CSSPropertyMaxWidth:
3939 case CSSPropertyMinHeight: 3969 case CSSPropertyMinHeight:
3940 case CSSPropertyMaxHeight: 3970 case CSSPropertyMaxHeight:
3941 case CSSPropertyMinZoom: 3971 case CSSPropertyMinZoom:
3942 case CSSPropertyMaxZoom: 3972 case CSSPropertyMaxZoom:
3943 case CSSPropertyZoom: 3973 case CSSPropertyZoom:
3944 case CSSPropertyUserZoom: 3974 case CSSPropertyUserZoom:
3945 case CSSPropertyOrientation: { 3975 case CSSPropertyOrientation: {
3946 RawPtr<CSSValue> parsedValue = consumeSingleViewportDescriptor(m_range, propId, m_context.mode()); 3976 CSSValue* parsedValue = consumeSingleViewportDescriptor(m_range, propId, m_context.mode());
3947 if (!parsedValue || !m_range.atEnd()) 3977 if (!parsedValue || !m_range.atEnd())
3948 return false; 3978 return false;
3949 addProperty(propId, parsedValue.release(), important); 3979 addProperty(propId, parsedValue, important);
3950 return true; 3980 return true;
3951 } 3981 }
3952 default: 3982 default:
3953 return false; 3983 return false;
3954 } 3984 }
3955 } 3985 }
3956 3986
3957 static bool consumeColumnWidthOrCount(CSSParserTokenRange& range, CSSParserMode cssParserMode, RawPtr<CSSValue>& columnWidth, RawPtr<CSSValue>& columnCount) 3987 static bool consumeColumnWidthOrCount(CSSParserTokenRange& range, CSSParserMode cssParserMode, CSSValue*& columnWidth, CSSValue*& columnCount)
3958 { 3988 {
3959 if (range.peek().id() == CSSValueAuto) { 3989 if (range.peek().id() == CSSValueAuto) {
3960 consumeIdent(range); 3990 consumeIdent(range);
3961 return true; 3991 return true;
3962 } 3992 }
3963 if (!columnWidth) { 3993 if (!columnWidth) {
3964 if ((columnWidth = consumeColumnWidth(range))) 3994 columnWidth = consumeColumnWidth(range);
3995 if (columnWidth)
3965 return true; 3996 return true;
3966 } 3997 }
3967 if (!columnCount) 3998 if (!columnCount)
3968 columnCount = consumeColumnCount(range); 3999 columnCount = consumeColumnCount(range);
3969 return columnCount; 4000 return columnCount;
3970 } 4001 }
3971 4002
3972 bool CSSPropertyParser::consumeColumns(bool important) 4003 bool CSSPropertyParser::consumeColumns(bool important)
3973 { 4004 {
3974 RawPtr<CSSValue> columnWidth = nullptr; 4005 CSSValue* columnWidth = nullptr;
3975 RawPtr<CSSValue> columnCount = nullptr; 4006 CSSValue* columnCount = nullptr;
3976 if (!consumeColumnWidthOrCount(m_range, m_context.mode(), columnWidth, colum nCount)) 4007 if (!consumeColumnWidthOrCount(m_range, m_context.mode(), columnWidth, colum nCount))
3977 return false; 4008 return false;
3978 consumeColumnWidthOrCount(m_range, m_context.mode(), columnWidth, columnCoun t); 4009 consumeColumnWidthOrCount(m_range, m_context.mode(), columnWidth, columnCoun t);
3979 if (!m_range.atEnd()) 4010 if (!m_range.atEnd())
3980 return false; 4011 return false;
3981 if (!columnWidth) 4012 if (!columnWidth)
3982 columnWidth = cssValuePool().createIdentifierValue(CSSValueAuto); 4013 columnWidth = cssValuePool().createIdentifierValue(CSSValueAuto);
3983 if (!columnCount) 4014 if (!columnCount)
3984 columnCount = cssValuePool().createIdentifierValue(CSSValueAuto); 4015 columnCount = cssValuePool().createIdentifierValue(CSSValueAuto);
3985 addProperty(CSSPropertyColumnWidth, columnWidth.release(), important); 4016 addProperty(CSSPropertyColumnWidth, columnWidth, important);
3986 addProperty(CSSPropertyColumnCount, columnCount.release(), important); 4017 addProperty(CSSPropertyColumnCount, columnCount, important);
3987 return true; 4018 return true;
3988 } 4019 }
3989 4020
3990 bool CSSPropertyParser::consumeShorthandGreedily(const StylePropertyShorthand& s horthand, bool important) 4021 bool CSSPropertyParser::consumeShorthandGreedily(const StylePropertyShorthand& s horthand, bool important)
3991 { 4022 {
3992 ASSERT(shorthand.length() <= 6); // Existing shorthands have at most 6 longh ands. 4023 ASSERT(shorthand.length() <= 6); // Existing shorthands have at most 6 longh ands.
3993 RawPtr<CSSValue> longhands[6] = { nullptr, nullptr, nullptr, nullptr, nullpt r, nullptr }; 4024 CSSValue* longhands[6] = { nullptr, nullptr, nullptr, nullptr, nullptr, null ptr };
3994 const CSSPropertyID* shorthandProperties = shorthand.properties(); 4025 const CSSPropertyID* shorthandProperties = shorthand.properties();
3995 do { 4026 do {
3996 bool foundLonghand = false; 4027 bool foundLonghand = false;
3997 for (size_t i = 0; !foundLonghand && i < shorthand.length(); ++i) { 4028 for (size_t i = 0; !foundLonghand && i < shorthand.length(); ++i) {
3998 if (longhands[i]) 4029 if (longhands[i])
3999 continue; 4030 continue;
4000 longhands[i] = parseSingleValue(shorthandProperties[i]); 4031 longhands[i] = parseSingleValue(shorthandProperties[i]);
4001 if (longhands[i]) 4032 if (longhands[i])
4002 foundLonghand = true; 4033 foundLonghand = true;
4003 } 4034 }
4004 if (!foundLonghand) 4035 if (!foundLonghand)
4005 return false; 4036 return false;
4006 } while (!m_range.atEnd()); 4037 } while (!m_range.atEnd());
4007 4038
4008 for (size_t i = 0; i < shorthand.length(); ++i) { 4039 for (size_t i = 0; i < shorthand.length(); ++i) {
4009 if (longhands[i]) 4040 if (longhands[i])
4010 addProperty(shorthandProperties[i], longhands[i].release(), importan t); 4041 addProperty(shorthandProperties[i], longhands[i], important);
4011 else 4042 else
4012 addProperty(shorthandProperties[i], cssValuePool().createImplicitIni tialValue(), important); 4043 addProperty(shorthandProperties[i], cssValuePool().createImplicitIni tialValue(), important);
4013 } 4044 }
4014 return true; 4045 return true;
4015 } 4046 }
4016 4047
4017 bool CSSPropertyParser::consumeFlex(bool important) 4048 bool CSSPropertyParser::consumeFlex(bool important)
4018 { 4049 {
4019 static const double unsetValue = -1; 4050 static const double unsetValue = -1;
4020 double flexGrow = unsetValue; 4051 double flexGrow = unsetValue;
4021 double flexShrink = unsetValue; 4052 double flexShrink = unsetValue;
4022 RawPtr<CSSPrimitiveValue> flexBasis = nullptr; 4053 CSSPrimitiveValue* flexBasis = nullptr;
4023 4054
4024 if (m_range.peek().id() == CSSValueNone) { 4055 if (m_range.peek().id() == CSSValueNone) {
4025 flexGrow = 0; 4056 flexGrow = 0;
4026 flexShrink = 0; 4057 flexShrink = 0;
4027 flexBasis = cssValuePool().createIdentifierValue(CSSValueAuto); 4058 flexBasis = cssValuePool().createIdentifierValue(CSSValueAuto);
4028 m_range.consumeIncludingWhitespace(); 4059 m_range.consumeIncludingWhitespace();
4029 } else { 4060 } else {
4030 unsigned index = 0; 4061 unsigned index = 0;
4031 while (!m_range.atEnd() && index++ < 3) { 4062 while (!m_range.atEnd() && index++ < 3) {
4032 double num; 4063 double num;
(...skipping 30 matching lines...) Expand all
4063 if (!m_range.atEnd()) 4094 if (!m_range.atEnd())
4064 return false; 4095 return false;
4065 addProperty(CSSPropertyFlexGrow, cssValuePool().createValue(clampTo<float>(f lexGrow), CSSPrimitiveValue::UnitType::Number), important); 4096 addProperty(CSSPropertyFlexGrow, cssValuePool().createValue(clampTo<float>(f lexGrow), CSSPrimitiveValue::UnitType::Number), important);
4066 addProperty(CSSPropertyFlexShrink, cssValuePool().createValue(clampTo<float> (flexShrink), CSSPrimitiveValue::UnitType::Number), important); 4097 addProperty(CSSPropertyFlexShrink, cssValuePool().createValue(clampTo<float> (flexShrink), CSSPrimitiveValue::UnitType::Number), important);
4067 addProperty(CSSPropertyFlexBasis, flexBasis, important); 4098 addProperty(CSSPropertyFlexBasis, flexBasis, important);
4068 return true; 4099 return true;
4069 } 4100 }
4070 4101
4071 bool CSSPropertyParser::consumeBorder(bool important) 4102 bool CSSPropertyParser::consumeBorder(bool important)
4072 { 4103 {
4073 RawPtr<CSSValue> width = nullptr; 4104 CSSValue* width = nullptr;
4074 RawPtr<CSSValue> style = nullptr; 4105 CSSValue* style = nullptr;
4075 RawPtr<CSSValue> color = nullptr; 4106 CSSValue* color = nullptr;
4076 4107
4077 while (!width || !style || !color) { 4108 while (!width || !style || !color) {
4078 if (!width && (width = consumeLineWidth(m_range, m_context.mode(), Unitl essQuirk::Forbid))) 4109 if (!width) {
4079 continue; 4110 width = consumeLineWidth(m_range, m_context.mode(), UnitlessQuirk::F orbid);
4080 if (!style && (style = parseSingleValue(CSSPropertyBorderLeftStyle))) 4111 if (width)
4081 continue; 4112 continue;
4082 if (!color && (color = consumeColor(m_range, m_context.mode()))) 4113 }
4083 continue; 4114 if (!style) {
4115 style = parseSingleValue(CSSPropertyBorderLeftStyle);
4116 if (style)
4117 continue;
4118 }
4119 if (!color) {
4120 color = consumeColor(m_range, m_context.mode());
4121 if (color)
4122 continue;
4123 }
4084 break; 4124 break;
4085 } 4125 }
4086 4126
4087 if (!width && !style && !color) 4127 if (!width && !style && !color)
4088 return false; 4128 return false;
4089 4129
4090 if (!width) 4130 if (!width)
4091 width = cssValuePool().createImplicitInitialValue(); 4131 width = cssValuePool().createImplicitInitialValue();
4092 if (!style) 4132 if (!style)
4093 style = cssValuePool().createImplicitInitialValue(); 4133 style = cssValuePool().createImplicitInitialValue();
4094 if (!color) 4134 if (!color)
4095 color = cssValuePool().createImplicitInitialValue(); 4135 color = cssValuePool().createImplicitInitialValue();
4096 4136
4097 addExpandedPropertyForValue(CSSPropertyBorderWidth, width.release(), importa nt); 4137 addExpandedPropertyForValue(CSSPropertyBorderWidth, width, important);
4098 addExpandedPropertyForValue(CSSPropertyBorderStyle, style.release(), importa nt); 4138 addExpandedPropertyForValue(CSSPropertyBorderStyle, style, important);
4099 addExpandedPropertyForValue(CSSPropertyBorderColor, color.release(), importa nt); 4139 addExpandedPropertyForValue(CSSPropertyBorderColor, color, important);
4100 addExpandedPropertyForValue(CSSPropertyBorderImage, cssValuePool().createImp licitInitialValue(), important); 4140 addExpandedPropertyForValue(CSSPropertyBorderImage, cssValuePool().createImp licitInitialValue(), important);
4101 4141
4102 return m_range.atEnd(); 4142 return m_range.atEnd();
4103 } 4143 }
4104 4144
4105 bool CSSPropertyParser::consume4Values(const StylePropertyShorthand& shorthand, bool important) 4145 bool CSSPropertyParser::consume4Values(const StylePropertyShorthand& shorthand, bool important)
4106 { 4146 {
4107 ASSERT(shorthand.length() == 4); 4147 ASSERT(shorthand.length() == 4);
4108 const CSSPropertyID* longhands = shorthand.properties(); 4148 const CSSPropertyID* longhands = shorthand.properties();
4109 RawPtr<CSSValue> top = parseSingleValue(longhands[0]); 4149 CSSValue* top = parseSingleValue(longhands[0]);
4110 if (!top) 4150 if (!top)
4111 return false; 4151 return false;
4112 4152
4113 RawPtr<CSSValue> right = nullptr; 4153 CSSValue* right = parseSingleValue(longhands[1]);
4114 RawPtr<CSSValue> bottom = nullptr; 4154 CSSValue* bottom = nullptr;
4115 RawPtr<CSSValue> left = nullptr; 4155 CSSValue* left = nullptr;
4116 if ((right = parseSingleValue(longhands[1]))) { 4156 if (right) {
4117 if ((bottom = parseSingleValue(longhands[2]))) 4157 bottom = parseSingleValue(longhands[2]);
4158 if (bottom)
4118 left = parseSingleValue(longhands[3]); 4159 left = parseSingleValue(longhands[3]);
4119 } 4160 }
4120 4161
4121 if (!right) 4162 if (!right)
4122 right = top; 4163 right = top;
4123 if (!bottom) 4164 if (!bottom)
4124 bottom = top; 4165 bottom = top;
4125 if (!left) 4166 if (!left)
4126 left = right; 4167 left = right;
4127 4168
4128 addProperty(longhands[0], top.release(), important); 4169 addProperty(longhands[0], top, important);
4129 addProperty(longhands[1], right.release(), important); 4170 addProperty(longhands[1], right, important);
4130 addProperty(longhands[2], bottom.release(), important); 4171 addProperty(longhands[2], bottom, important);
4131 addProperty(longhands[3], left.release(), important); 4172 addProperty(longhands[3], left, important);
4132 4173
4133 return m_range.atEnd(); 4174 return m_range.atEnd();
4134 } 4175 }
4135 4176
4136 bool CSSPropertyParser::consumeBorderImage(CSSPropertyID property, bool importan t) 4177 bool CSSPropertyParser::consumeBorderImage(CSSPropertyID property, bool importan t)
4137 { 4178 {
4138 RawPtr<CSSValue> source = nullptr; 4179 CSSValue* source = nullptr;
4139 RawPtr<CSSValue> slice = nullptr; 4180 CSSValue* slice = nullptr;
4140 RawPtr<CSSValue> width = nullptr; 4181 CSSValue* width = nullptr;
4141 RawPtr<CSSValue> outset = nullptr; 4182 CSSValue* outset = nullptr;
4142 RawPtr<CSSValue> repeat = nullptr; 4183 CSSValue* repeat = nullptr;
4143 if (consumeBorderImageComponents(property, m_range, m_context, source, slice , width, outset, repeat)) { 4184 if (consumeBorderImageComponents(property, m_range, m_context, source, slice , width, outset, repeat)) {
4144 switch (property) { 4185 switch (property) {
4145 case CSSPropertyWebkitMaskBoxImage: 4186 case CSSPropertyWebkitMaskBoxImage:
4146 addProperty(CSSPropertyWebkitMaskBoxImageSource, source ? source : c ssValuePool().createImplicitInitialValue(), important); 4187 addProperty(CSSPropertyWebkitMaskBoxImageSource, source ? source : c ssValuePool().createImplicitInitialValue(), important);
4147 addProperty(CSSPropertyWebkitMaskBoxImageSlice, slice ? slice : cssV aluePool().createImplicitInitialValue(), important); 4188 addProperty(CSSPropertyWebkitMaskBoxImageSlice, slice ? slice : cssV aluePool().createImplicitInitialValue(), important);
4148 addProperty(CSSPropertyWebkitMaskBoxImageWidth, width ? width : cssV aluePool().createImplicitInitialValue(), important); 4189 addProperty(CSSPropertyWebkitMaskBoxImageWidth, width ? width : cssV aluePool().createImplicitInitialValue(), important);
4149 addProperty(CSSPropertyWebkitMaskBoxImageOutset, outset ? outset : c ssValuePool().createImplicitInitialValue(), important); 4190 addProperty(CSSPropertyWebkitMaskBoxImageOutset, outset ? outset : c ssValuePool().createImplicitInitialValue(), important);
4150 addProperty(CSSPropertyWebkitMaskBoxImageRepeat, repeat ? repeat : c ssValuePool().createImplicitInitialValue(), important); 4191 addProperty(CSSPropertyWebkitMaskBoxImageRepeat, repeat ? repeat : c ssValuePool().createImplicitInitialValue(), important);
4151 return true; 4192 return true;
4152 case CSSPropertyBorderImage: 4193 case CSSPropertyBorderImage:
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
4197 return CSSPropertyBreakBefore; 4238 return CSSPropertyBreakBefore;
4198 ASSERT(property == CSSPropertyPageBreakInside || property == CSSPropertyWebk itColumnBreakInside); 4239 ASSERT(property == CSSPropertyPageBreakInside || property == CSSPropertyWebk itColumnBreakInside);
4199 return CSSPropertyBreakInside; 4240 return CSSPropertyBreakInside;
4200 } 4241 }
4201 4242
4202 bool CSSPropertyParser::consumeLegacyBreakProperty(CSSPropertyID property, bool important) 4243 bool CSSPropertyParser::consumeLegacyBreakProperty(CSSPropertyID property, bool important)
4203 { 4244 {
4204 // The fragmentation spec says that page-break-(after|before|inside) are to be treated as 4245 // The fragmentation spec says that page-break-(after|before|inside) are to be treated as
4205 // shorthands for their break-(after|before|inside) counterparts. We'll do t he same for the 4246 // shorthands for their break-(after|before|inside) counterparts. We'll do t he same for the
4206 // non-standard properties -webkit-column-break-(after|before|inside). 4247 // non-standard properties -webkit-column-break-(after|before|inside).
4207 RawPtr<CSSPrimitiveValue> keyword = consumeIdent(m_range); 4248 CSSPrimitiveValue* keyword = consumeIdent(m_range);
4208 if (!keyword) 4249 if (!keyword)
4209 return false; 4250 return false;
4210 if (!m_range.atEnd()) 4251 if (!m_range.atEnd())
4211 return false; 4252 return false;
4212 CSSValueID value = keyword->getValueID(); 4253 CSSValueID value = keyword->getValueID();
4213 switch (property) { 4254 switch (property) {
4214 case CSSPropertyPageBreakAfter: 4255 case CSSPropertyPageBreakAfter:
4215 case CSSPropertyPageBreakBefore: 4256 case CSSPropertyPageBreakBefore:
4216 value = mapFromPageBreakBetween(value); 4257 value = mapFromPageBreakBetween(value);
4217 break; 4258 break;
4218 case CSSPropertyWebkitColumnBreakAfter: 4259 case CSSPropertyWebkitColumnBreakAfter:
4219 case CSSPropertyWebkitColumnBreakBefore: 4260 case CSSPropertyWebkitColumnBreakBefore:
4220 value = mapFromColumnBreakBetween(value); 4261 value = mapFromColumnBreakBetween(value);
4221 break; 4262 break;
4222 case CSSPropertyPageBreakInside: 4263 case CSSPropertyPageBreakInside:
4223 case CSSPropertyWebkitColumnBreakInside: 4264 case CSSPropertyWebkitColumnBreakInside:
4224 value = mapFromColumnOrPageBreakInside(value); 4265 value = mapFromColumnOrPageBreakInside(value);
4225 break; 4266 break;
4226 default: 4267 default:
4227 ASSERT_NOT_REACHED(); 4268 ASSERT_NOT_REACHED();
4228 } 4269 }
4229 if (value == CSSValueInvalid) 4270 if (value == CSSValueInvalid)
4230 return false; 4271 return false;
4231 4272
4232 CSSPropertyID genericBreakProperty = mapFromLegacyBreakProperty(property); 4273 CSSPropertyID genericBreakProperty = mapFromLegacyBreakProperty(property);
4233 addProperty(genericBreakProperty, cssValuePool().createIdentifierValue(value ), important); 4274 addProperty(genericBreakProperty, cssValuePool().createIdentifierValue(value ), important);
4234 return true; 4275 return true;
4235 } 4276 }
4236 4277
4237 static bool consumeBackgroundPosition(CSSParserTokenRange& range, const CSSParse rContext& context, UnitlessQuirk unitless, RawPtr<CSSValue>& resultX, RawPtr<CSS Value>& resultY) 4278 static bool consumeBackgroundPosition(CSSParserTokenRange& range, const CSSParse rContext& context, UnitlessQuirk unitless, CSSValue*& resultX, CSSValue*& result Y)
4238 { 4279 {
4239 do { 4280 do {
4240 RawPtr<CSSValue> positionX = nullptr; 4281 CSSValue* positionX = nullptr;
4241 RawPtr<CSSValue> positionY = nullptr; 4282 CSSValue* positionY = nullptr;
4242 if (!consumePosition(range, context.mode(), unitless, positionX, positio nY)) 4283 if (!consumePosition(range, context.mode(), unitless, positionX, positio nY))
4243 return false; 4284 return false;
4244 addBackgroundValue(resultX, positionX); 4285 addBackgroundValue(resultX, positionX);
4245 addBackgroundValue(resultY, positionY); 4286 addBackgroundValue(resultY, positionY);
4246 } while (consumeCommaIncludingWhitespace(range)); 4287 } while (consumeCommaIncludingWhitespace(range));
4247 return true; 4288 return true;
4248 } 4289 }
4249 4290
4250 static bool consumeRepeatStyleComponent(CSSParserTokenRange& range, RawPtr<CSSVa lue>& value1, RawPtr<CSSValue>& value2, bool& implicit) 4291 static bool consumeRepeatStyleComponent(CSSParserTokenRange& range, CSSValue*& v alue1, CSSValue*& value2, bool& implicit)
4251 { 4292 {
4252 if (consumeIdent<CSSValueRepeatX>(range)) { 4293 if (consumeIdent<CSSValueRepeatX>(range)) {
4253 value1 = cssValuePool().createIdentifierValue(CSSValueRepeat); 4294 value1 = cssValuePool().createIdentifierValue(CSSValueRepeat);
4254 value2 = cssValuePool().createIdentifierValue(CSSValueNoRepeat); 4295 value2 = cssValuePool().createIdentifierValue(CSSValueNoRepeat);
4255 implicit = true; 4296 implicit = true;
4256 return true; 4297 return true;
4257 } 4298 }
4258 if (consumeIdent<CSSValueRepeatY>(range)) { 4299 if (consumeIdent<CSSValueRepeatY>(range)) {
4259 value1 = cssValuePool().createIdentifierValue(CSSValueNoRepeat); 4300 value1 = cssValuePool().createIdentifierValue(CSSValueNoRepeat);
4260 value2 = cssValuePool().createIdentifierValue(CSSValueRepeat); 4301 value2 = cssValuePool().createIdentifierValue(CSSValueRepeat);
4261 implicit = true; 4302 implicit = true;
4262 return true; 4303 return true;
4263 } 4304 }
4264 value1 = consumeIdent<CSSValueRepeat, CSSValueNoRepeat, CSSValueRound, CSSVa lueSpace>(range); 4305 value1 = consumeIdent<CSSValueRepeat, CSSValueNoRepeat, CSSValueRound, CSSVa lueSpace>(range);
4265 if (!value1) 4306 if (!value1)
4266 return false; 4307 return false;
4267 4308
4268 value2 = consumeIdent<CSSValueRepeat, CSSValueNoRepeat, CSSValueRound, CSSVa lueSpace>(range); 4309 value2 = consumeIdent<CSSValueRepeat, CSSValueNoRepeat, CSSValueRound, CSSVa lueSpace>(range);
4269 if (!value2) { 4310 if (!value2) {
4270 value2 = value1; 4311 value2 = value1;
4271 implicit = true; 4312 implicit = true;
4272 } 4313 }
4273 return true; 4314 return true;
4274 } 4315 }
4275 4316
4276 static bool consumeRepeatStyle(CSSParserTokenRange& range, RawPtr<CSSValue>& res ultX, RawPtr<CSSValue>& resultY, bool& implicit) 4317 static bool consumeRepeatStyle(CSSParserTokenRange& range, CSSValue*& resultX, C SSValue*& resultY, bool& implicit)
4277 { 4318 {
4278 do { 4319 do {
4279 RawPtr<CSSValue> repeatX = nullptr; 4320 CSSValue* repeatX = nullptr;
4280 RawPtr<CSSValue> repeatY = nullptr; 4321 CSSValue* repeatY = nullptr;
4281 if (!consumeRepeatStyleComponent(range, repeatX, repeatY, implicit)) 4322 if (!consumeRepeatStyleComponent(range, repeatX, repeatY, implicit))
4282 return false; 4323 return false;
4283 addBackgroundValue(resultX, repeatX); 4324 addBackgroundValue(resultX, repeatX);
4284 addBackgroundValue(resultY, repeatY); 4325 addBackgroundValue(resultY, repeatY);
4285 } while (consumeCommaIncludingWhitespace(range)); 4326 } while (consumeCommaIncludingWhitespace(range));
4286 return true; 4327 return true;
4287 } 4328 }
4288 4329
4289 // Note: consumeBackgroundShorthand assumes y properties (for example background -position-y) follow 4330 // Note: consumeBackgroundShorthand assumes y properties (for example background -position-y) follow
4290 // the x properties in the shorthand array. 4331 // the x properties in the shorthand array.
4291 bool CSSPropertyParser::consumeBackgroundShorthand(const StylePropertyShorthand& shorthand, bool important) 4332 bool CSSPropertyParser::consumeBackgroundShorthand(const StylePropertyShorthand& shorthand, bool important)
4292 { 4333 {
4293 const unsigned longhandCount = shorthand.length(); 4334 const unsigned longhandCount = shorthand.length();
4294 RawPtr<CSSValue> longhands[10]; 4335 CSSValue* longhands[10];
4295 ASSERT(longhandCount <= 10); 4336 ASSERT(longhandCount <= 10);
4296 #if ENABLE(OILPAN) 4337 #if ENABLE(OILPAN)
4297 // Zero initialize the array of raw pointers. 4338 // Zero initialize the array of raw pointers.
4298 memset(&longhands, 0, sizeof(longhands)); 4339 memset(&longhands, 0, sizeof(longhands));
4299 #endif 4340 #endif
4300 bool implicit = false; 4341 bool implicit = false;
4301 do { 4342 do {
4302 bool parsedLonghand[10] = { false }; 4343 bool parsedLonghand[10] = { false };
4303 RawPtr<CSSValue> originValue = nullptr; 4344 CSSValue* originValue = nullptr;
4304 do { 4345 do {
4305 bool foundProperty = false; 4346 bool foundProperty = false;
4306 for (size_t i = 0; i < longhandCount; ++i) { 4347 for (size_t i = 0; i < longhandCount; ++i) {
4307 if (parsedLonghand[i]) 4348 if (parsedLonghand[i])
4308 continue; 4349 continue;
4309 4350
4310 RawPtr<CSSValue> value = nullptr; 4351 CSSValue* value = nullptr;
4311 RawPtr<CSSValue> valueY = nullptr; 4352 CSSValue* valueY = nullptr;
4312 CSSPropertyID property = shorthand.properties()[i]; 4353 CSSPropertyID property = shorthand.properties()[i];
4313 if (property == CSSPropertyBackgroundRepeatX || property == CSSP ropertyWebkitMaskRepeatX) { 4354 if (property == CSSPropertyBackgroundRepeatX || property == CSSP ropertyWebkitMaskRepeatX) {
4314 consumeRepeatStyleComponent(m_range, value, valueY, implicit ); 4355 consumeRepeatStyleComponent(m_range, value, valueY, implicit );
4315 } else if (property == CSSPropertyBackgroundPositionX || propert y == CSSPropertyWebkitMaskPositionX) { 4356 } else if (property == CSSPropertyBackgroundPositionX || propert y == CSSPropertyWebkitMaskPositionX) {
4316 CSSParserTokenRange rangeCopy = m_range; 4357 CSSParserTokenRange rangeCopy = m_range;
4317 if (!consumePosition(rangeCopy, m_context.mode(), UnitlessQu irk::Forbid, value, valueY)) 4358 if (!consumePosition(rangeCopy, m_context.mode(), UnitlessQu irk::Forbid, value, valueY))
4318 continue; 4359 continue;
4319 m_range = rangeCopy; 4360 m_range = rangeCopy;
4320 } else if (property == CSSPropertyBackgroundSize || property == CSSPropertyWebkitMaskSize) { 4361 } else if (property == CSSPropertyBackgroundSize || property == CSSPropertyWebkitMaskSize) {
4321 if (!consumeSlashIncludingWhitespace(m_range)) 4362 if (!consumeSlashIncludingWhitespace(m_range))
4322 continue; 4363 continue;
4323 value = consumeBackgroundSize(property, m_range, m_context.m ode()); 4364 value = consumeBackgroundSize(property, m_range, m_context.m ode());
4324 if (!value || !parsedLonghand[i - 1]) // Position must have been parsed in the current layer. 4365 if (!value || !parsedLonghand[i - 1]) // Position must have been parsed in the current layer.
4325 return false; 4366 return false;
4326 } else if (property == CSSPropertyBackgroundPositionY || propert y == CSSPropertyBackgroundRepeatY 4367 } else if (property == CSSPropertyBackgroundPositionY || propert y == CSSPropertyBackgroundRepeatY
4327 || property == CSSPropertyWebkitMaskPositionY || property == CSSPropertyWebkitMaskRepeatY) { 4368 || property == CSSPropertyWebkitMaskPositionY || property == CSSPropertyWebkitMaskRepeatY) {
4328 continue; 4369 continue;
4329 } else { 4370 } else {
4330 value = consumeBackgroundComponent(property, m_range, m_cont ext); 4371 value = consumeBackgroundComponent(property, m_range, m_cont ext);
4331 } 4372 }
4332 if (value) { 4373 if (value) {
4333 if (property == CSSPropertyBackgroundOrigin || property == C SSPropertyWebkitMaskOrigin) 4374 if (property == CSSPropertyBackgroundOrigin || property == C SSPropertyWebkitMaskOrigin)
4334 originValue = value; 4375 originValue = value;
4335 parsedLonghand[i] = true; 4376 parsedLonghand[i] = true;
4336 foundProperty = true; 4377 foundProperty = true;
4337 addBackgroundValue(longhands[i], value.release()); 4378 addBackgroundValue(longhands[i], value);
4338 if (valueY) { 4379 if (valueY) {
4339 parsedLonghand[i + 1] = true; 4380 parsedLonghand[i + 1] = true;
4340 addBackgroundValue(longhands[i + 1], valueY.release()); 4381 addBackgroundValue(longhands[i + 1], valueY);
4341 } 4382 }
4342 } 4383 }
4343 } 4384 }
4344 if (!foundProperty) 4385 if (!foundProperty)
4345 return false; 4386 return false;
4346 } while (!m_range.atEnd() && m_range.peek().type() != CommaToken); 4387 } while (!m_range.atEnd() && m_range.peek().type() != CommaToken);
4347 4388
4348 // TODO(timloh): This will make invalid longhands, see crbug.com/386459 4389 // TODO(timloh): This will make invalid longhands, see crbug.com/386459
4349 for (size_t i = 0; i < longhandCount; ++i) { 4390 for (size_t i = 0; i < longhandCount; ++i) {
4350 CSSPropertyID property = shorthand.properties()[i]; 4391 CSSPropertyID property = shorthand.properties()[i];
4351 if (property == CSSPropertyBackgroundColor && !m_range.atEnd()) { 4392 if (property == CSSPropertyBackgroundColor && !m_range.atEnd()) {
4352 if (parsedLonghand[i]) 4393 if (parsedLonghand[i])
4353 return false; // Colors are only allowed in the last layer. 4394 return false; // Colors are only allowed in the last layer.
4354 continue; 4395 continue;
4355 } 4396 }
4356 if ((property == CSSPropertyBackgroundClip || property == CSSPropert yWebkitMaskClip) && !parsedLonghand[i] && originValue) { 4397 if ((property == CSSPropertyBackgroundClip || property == CSSPropert yWebkitMaskClip) && !parsedLonghand[i] && originValue) {
4357 addBackgroundValue(longhands[i], originValue.release()); 4398 addBackgroundValue(longhands[i], originValue);
4358 continue; 4399 continue;
4359 } 4400 }
4360 if (!parsedLonghand[i]) 4401 if (!parsedLonghand[i])
4361 addBackgroundValue(longhands[i], cssValuePool().createImplicitIn itialValue()); 4402 addBackgroundValue(longhands[i], cssValuePool().createImplicitIn itialValue());
4362 } 4403 }
4363 } while (consumeCommaIncludingWhitespace(m_range)); 4404 } while (consumeCommaIncludingWhitespace(m_range));
4364 if (!m_range.atEnd()) 4405 if (!m_range.atEnd())
4365 return false; 4406 return false;
4366 4407
4367 for (size_t i = 0; i < longhandCount; ++i) { 4408 for (size_t i = 0; i < longhandCount; ++i) {
4368 CSSPropertyID property = shorthand.properties()[i]; 4409 CSSPropertyID property = shorthand.properties()[i];
4369 if (property == CSSPropertyBackgroundSize && longhands[i] && m_context.u seLegacyBackgroundSizeShorthandBehavior()) 4410 if (property == CSSPropertyBackgroundSize && longhands[i] && m_context.u seLegacyBackgroundSizeShorthandBehavior())
4370 continue; 4411 continue;
4371 addProperty(property, longhands[i].release(), important, implicit); 4412 addProperty(property, longhands[i], important, implicit);
4372 } 4413 }
4373 return true; 4414 return true;
4374 } 4415 }
4375 4416
4376 bool CSSPropertyParser::consumeGridItemPositionShorthand(CSSPropertyID shorthand Id, bool important) 4417 bool CSSPropertyParser::consumeGridItemPositionShorthand(CSSPropertyID shorthand Id, bool important)
4377 { 4418 {
4378 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); 4419 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled());
4379 const StylePropertyShorthand& shorthand = shorthandForProperty(shorthandId); 4420 const StylePropertyShorthand& shorthand = shorthandForProperty(shorthandId);
4380 ASSERT(shorthand.length() == 2); 4421 ASSERT(shorthand.length() == 2);
4381 RawPtr<CSSValue> startValue = consumeGridLine(m_range); 4422 CSSValue* startValue = consumeGridLine(m_range);
4382 if (!startValue) 4423 if (!startValue)
4383 return false; 4424 return false;
4384 4425
4385 RawPtr<CSSValue> endValue = nullptr; 4426 CSSValue* endValue = nullptr;
4386 if (consumeSlashIncludingWhitespace(m_range)) { 4427 if (consumeSlashIncludingWhitespace(m_range)) {
4387 endValue = consumeGridLine(m_range); 4428 endValue = consumeGridLine(m_range);
4388 if (!endValue) 4429 if (!endValue)
4389 return false; 4430 return false;
4390 } else { 4431 } else {
4391 endValue = startValue->isCustomIdentValue() ? startValue : cssValuePool( ).createIdentifierValue(CSSValueAuto); 4432 endValue = startValue->isCustomIdentValue() ? startValue : cssValuePool( ).createIdentifierValue(CSSValueAuto);
4392 } 4433 }
4393 if (!m_range.atEnd()) 4434 if (!m_range.atEnd())
4394 return false; 4435 return false;
4395 addProperty(shorthand.properties()[0], startValue, important); 4436 addProperty(shorthand.properties()[0], startValue, important);
4396 addProperty(shorthand.properties()[1], endValue, important); 4437 addProperty(shorthand.properties()[1], endValue, important);
4397 return true; 4438 return true;
4398 } 4439 }
4399 4440
4400 bool CSSPropertyParser::consumeGridAreaShorthand(bool important) 4441 bool CSSPropertyParser::consumeGridAreaShorthand(bool important)
4401 { 4442 {
4402 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); 4443 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled());
4403 ASSERT(gridAreaShorthand().length() == 4); 4444 ASSERT(gridAreaShorthand().length() == 4);
4404 RawPtr<CSSValue> rowStartValue = consumeGridLine(m_range); 4445 CSSValue* rowStartValue = consumeGridLine(m_range);
4405 if (!rowStartValue) 4446 if (!rowStartValue)
4406 return false; 4447 return false;
4407 RawPtr<CSSValue> columnStartValue = nullptr; 4448 CSSValue* columnStartValue = nullptr;
4408 RawPtr<CSSValue> rowEndValue = nullptr; 4449 CSSValue* rowEndValue = nullptr;
4409 RawPtr<CSSValue> columnEndValue = nullptr; 4450 CSSValue* columnEndValue = nullptr;
4410 if (consumeSlashIncludingWhitespace(m_range)) { 4451 if (consumeSlashIncludingWhitespace(m_range)) {
4411 columnStartValue = consumeGridLine(m_range); 4452 columnStartValue = consumeGridLine(m_range);
4412 if (!columnStartValue) 4453 if (!columnStartValue)
4413 return false; 4454 return false;
4414 if (consumeSlashIncludingWhitespace(m_range)) { 4455 if (consumeSlashIncludingWhitespace(m_range)) {
4415 rowEndValue = consumeGridLine(m_range); 4456 rowEndValue = consumeGridLine(m_range);
4416 if (!rowEndValue) 4457 if (!rowEndValue)
4417 return false; 4458 return false;
4418 if (consumeSlashIncludingWhitespace(m_range)) { 4459 if (consumeSlashIncludingWhitespace(m_range)) {
4419 columnEndValue = consumeGridLine(m_range); 4460 columnEndValue = consumeGridLine(m_range);
(...skipping 23 matching lines...) Expand all
4443 CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty); 4484 CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty);
4444 4485
4445 CSSPropertyID oldShorthand = m_currentShorthand; 4486 CSSPropertyID oldShorthand = m_currentShorthand;
4446 // TODO(rob.buis): Remove this when the legacy property parser is gone 4487 // TODO(rob.buis): Remove this when the legacy property parser is gone
4447 m_currentShorthand = property; 4488 m_currentShorthand = property;
4448 switch (property) { 4489 switch (property) {
4449 case CSSPropertyWebkitMarginCollapse: { 4490 case CSSPropertyWebkitMarginCollapse: {
4450 CSSValueID id = m_range.consumeIncludingWhitespace().id(); 4491 CSSValueID id = m_range.consumeIncludingWhitespace().id();
4451 if (!CSSParserFastPaths::isValidKeywordPropertyAndValue(CSSPropertyWebki tMarginBeforeCollapse, id)) 4492 if (!CSSParserFastPaths::isValidKeywordPropertyAndValue(CSSPropertyWebki tMarginBeforeCollapse, id))
4452 return false; 4493 return false;
4453 RawPtr<CSSValue> beforeCollapse = cssValuePool().createIdentifierValue(i d); 4494 CSSValue* beforeCollapse = cssValuePool().createIdentifierValue(id);
4454 addProperty(CSSPropertyWebkitMarginBeforeCollapse, beforeCollapse, impor tant); 4495 addProperty(CSSPropertyWebkitMarginBeforeCollapse, beforeCollapse, impor tant);
4455 if (m_range.atEnd()) { 4496 if (m_range.atEnd()) {
4456 addProperty(CSSPropertyWebkitMarginAfterCollapse, beforeCollapse, im portant); 4497 addProperty(CSSPropertyWebkitMarginAfterCollapse, beforeCollapse, im portant);
4457 return true; 4498 return true;
4458 } 4499 }
4459 id = m_range.consumeIncludingWhitespace().id(); 4500 id = m_range.consumeIncludingWhitespace().id();
4460 if (!CSSParserFastPaths::isValidKeywordPropertyAndValue(CSSPropertyWebki tMarginAfterCollapse, id)) 4501 if (!CSSParserFastPaths::isValidKeywordPropertyAndValue(CSSPropertyWebki tMarginAfterCollapse, id))
4461 return false; 4502 return false;
4462 addProperty(CSSPropertyWebkitMarginAfterCollapse, cssValuePool().createI dentifierValue(id), important); 4503 addProperty(CSSPropertyWebkitMarginAfterCollapse, cssValuePool().createI dentifierValue(id), important);
4463 return true; 4504 return true;
4464 } 4505 }
4465 case CSSPropertyOverflow: { 4506 case CSSPropertyOverflow: {
4466 CSSValueID id = m_range.consumeIncludingWhitespace().id(); 4507 CSSValueID id = m_range.consumeIncludingWhitespace().id();
4467 if (!CSSParserFastPaths::isValidKeywordPropertyAndValue(CSSPropertyOverf lowY, id)) 4508 if (!CSSParserFastPaths::isValidKeywordPropertyAndValue(CSSPropertyOverf lowY, id))
4468 return false; 4509 return false;
4469 if (!m_range.atEnd()) 4510 if (!m_range.atEnd())
4470 return false; 4511 return false;
4471 RawPtr<CSSValue> overflowYValue = cssValuePool().createIdentifierValue(i d); 4512 CSSValue* overflowYValue = cssValuePool().createIdentifierValue(id);
4472 4513
4473 RawPtr<CSSValue> overflowXValue = nullptr; 4514 CSSValue* overflowXValue = nullptr;
4474 4515
4475 // FIXME: -webkit-paged-x or -webkit-paged-y only apply to overflow-y. I f this value has been 4516 // FIXME: -webkit-paged-x or -webkit-paged-y only apply to overflow-y. I f this value has been
4476 // set using the shorthand, then for now overflow-x will default to auto , but once we implement 4517 // set using the shorthand, then for now overflow-x will default to auto , but once we implement
4477 // pagination controls, it should default to hidden. If the overflow-y v alue is anything but 4518 // pagination controls, it should default to hidden. If the overflow-y v alue is anything but
4478 // paged-x or paged-y, then overflow-x and overflow-y should have the sa me value. 4519 // paged-x or paged-y, then overflow-x and overflow-y should have the sa me value.
4479 if (id == CSSValueWebkitPagedX || id == CSSValueWebkitPagedY) 4520 if (id == CSSValueWebkitPagedX || id == CSSValueWebkitPagedY)
4480 overflowXValue = cssValuePool().createIdentifierValue(CSSValueAuto); 4521 overflowXValue = cssValuePool().createIdentifierValue(CSSValueAuto);
4481 else 4522 else
4482 overflowXValue = overflowYValue; 4523 overflowXValue = overflowYValue;
4483 addProperty(CSSPropertyOverflowX, overflowXValue.release(), important); 4524 addProperty(CSSPropertyOverflowX, overflowXValue, important);
4484 addProperty(CSSPropertyOverflowY, overflowYValue.release(), important); 4525 addProperty(CSSPropertyOverflowY, overflowYValue, important);
4485 return true; 4526 return true;
4486 } 4527 }
4487 case CSSPropertyFont: { 4528 case CSSPropertyFont: {
4488 const CSSParserToken& token = m_range.peek(); 4529 const CSSParserToken& token = m_range.peek();
4489 if (token.id() >= CSSValueCaption && token.id() <= CSSValueStatusBar) 4530 if (token.id() >= CSSValueCaption && token.id() <= CSSValueStatusBar)
4490 return consumeSystemFont(important); 4531 return consumeSystemFont(important);
4491 return consumeFont(important); 4532 return consumeFont(important);
4492 } 4533 }
4493 case CSSPropertyBorderSpacing: 4534 case CSSPropertyBorderSpacing:
4494 return consumeBorderSpacing(important); 4535 return consumeBorderSpacing(important);
(...skipping 23 matching lines...) Expand all
4518 return consumeShorthandGreedily(webkitBorderStartShorthand(), important) ; 4559 return consumeShorthandGreedily(webkitBorderStartShorthand(), important) ;
4519 case CSSPropertyWebkitBorderEnd: 4560 case CSSPropertyWebkitBorderEnd:
4520 return consumeShorthandGreedily(webkitBorderEndShorthand(), important); 4561 return consumeShorthandGreedily(webkitBorderEndShorthand(), important);
4521 case CSSPropertyWebkitBorderBefore: 4562 case CSSPropertyWebkitBorderBefore:
4522 return consumeShorthandGreedily(webkitBorderBeforeShorthand(), important ); 4563 return consumeShorthandGreedily(webkitBorderBeforeShorthand(), important );
4523 case CSSPropertyWebkitBorderAfter: 4564 case CSSPropertyWebkitBorderAfter:
4524 return consumeShorthandGreedily(webkitBorderAfterShorthand(), important) ; 4565 return consumeShorthandGreedily(webkitBorderAfterShorthand(), important) ;
4525 case CSSPropertyWebkitTextStroke: 4566 case CSSPropertyWebkitTextStroke:
4526 return consumeShorthandGreedily(webkitTextStrokeShorthand(), important); 4567 return consumeShorthandGreedily(webkitTextStrokeShorthand(), important);
4527 case CSSPropertyMarker: { 4568 case CSSPropertyMarker: {
4528 RawPtr<CSSValue> marker = parseSingleValue(CSSPropertyMarkerStart); 4569 CSSValue* marker = parseSingleValue(CSSPropertyMarkerStart);
4529 if (!marker || !m_range.atEnd()) 4570 if (!marker || !m_range.atEnd())
4530 return false; 4571 return false;
4531 addProperty(CSSPropertyMarkerStart, marker, important); 4572 addProperty(CSSPropertyMarkerStart, marker, important);
4532 addProperty(CSSPropertyMarkerMid, marker, important); 4573 addProperty(CSSPropertyMarkerMid, marker, important);
4533 addProperty(CSSPropertyMarkerEnd, marker.release(), important); 4574 addProperty(CSSPropertyMarkerEnd, marker, important);
4534 return true; 4575 return true;
4535 } 4576 }
4536 case CSSPropertyFlex: 4577 case CSSPropertyFlex:
4537 return consumeFlex(important); 4578 return consumeFlex(important);
4538 case CSSPropertyFlexFlow: 4579 case CSSPropertyFlexFlow:
4539 return consumeShorthandGreedily(flexFlowShorthand(), important); 4580 return consumeShorthandGreedily(flexFlowShorthand(), important);
4540 case CSSPropertyColumnRule: 4581 case CSSPropertyColumnRule:
4541 return consumeShorthandGreedily(columnRuleShorthand(), important); 4582 return consumeShorthandGreedily(columnRuleShorthand(), important);
4542 case CSSPropertyListStyle: 4583 case CSSPropertyListStyle:
4543 return consumeShorthandGreedily(listStyleShorthand(), important); 4584 return consumeShorthandGreedily(listStyleShorthand(), important);
4544 case CSSPropertyBorderRadius: { 4585 case CSSPropertyBorderRadius: {
4545 RawPtr<CSSPrimitiveValue> horizontalRadii[4]; 4586 CSSPrimitiveValue* horizontalRadii[4];
4546 RawPtr<CSSPrimitiveValue> verticalRadii[4]; 4587 CSSPrimitiveValue* verticalRadii[4];
4547 if (!consumeRadii(horizontalRadii, verticalRadii, m_range, m_context.mod e(), unresolvedProperty == CSSPropertyAliasWebkitBorderRadius)) 4588 if (!consumeRadii(horizontalRadii, verticalRadii, m_range, m_context.mod e(), unresolvedProperty == CSSPropertyAliasWebkitBorderRadius))
4548 return false; 4589 return false;
4549 addProperty(CSSPropertyBorderTopLeftRadius, CSSValuePair::create(horizon talRadii[0].release(), verticalRadii[0].release(), CSSValuePair::DropIdenticalVa lues), important); 4590 addProperty(CSSPropertyBorderTopLeftRadius, CSSValuePair::create(horizon talRadii[0], verticalRadii[0], CSSValuePair::DropIdenticalValues), important);
4550 addProperty(CSSPropertyBorderTopRightRadius, CSSValuePair::create(horizo ntalRadii[1].release(), verticalRadii[1].release(), CSSValuePair::DropIdenticalV alues), important); 4591 addProperty(CSSPropertyBorderTopRightRadius, CSSValuePair::create(horizo ntalRadii[1], verticalRadii[1], CSSValuePair::DropIdenticalValues), important);
4551 addProperty(CSSPropertyBorderBottomRightRadius, CSSValuePair::create(hor izontalRadii[2].release(), verticalRadii[2].release(), CSSValuePair::DropIdentic alValues), important); 4592 addProperty(CSSPropertyBorderBottomRightRadius, CSSValuePair::create(hor izontalRadii[2], verticalRadii[2], CSSValuePair::DropIdenticalValues), important );
4552 addProperty(CSSPropertyBorderBottomLeftRadius, CSSValuePair::create(hori zontalRadii[3].release(), verticalRadii[3].release(), CSSValuePair::DropIdentica lValues), important); 4593 addProperty(CSSPropertyBorderBottomLeftRadius, CSSValuePair::create(hori zontalRadii[3], verticalRadii[3], CSSValuePair::DropIdenticalValues), important) ;
4553 return true; 4594 return true;
4554 } 4595 }
4555 case CSSPropertyBorderColor: 4596 case CSSPropertyBorderColor:
4556 return consume4Values(borderColorShorthand(), important); 4597 return consume4Values(borderColorShorthand(), important);
4557 case CSSPropertyBorderStyle: 4598 case CSSPropertyBorderStyle:
4558 return consume4Values(borderStyleShorthand(), important); 4599 return consume4Values(borderStyleShorthand(), important);
4559 case CSSPropertyBorderWidth: 4600 case CSSPropertyBorderWidth:
4560 return consume4Values(borderWidthShorthand(), important); 4601 return consume4Values(borderWidthShorthand(), important);
4561 case CSSPropertyBorderTop: 4602 case CSSPropertyBorderTop:
4562 return consumeShorthandGreedily(borderTopShorthand(), important); 4603 return consumeShorthandGreedily(borderTopShorthand(), important);
(...skipping 10 matching lines...) Expand all
4573 return consumeBorderImage(property, important); 4614 return consumeBorderImage(property, important);
4574 case CSSPropertyPageBreakAfter: 4615 case CSSPropertyPageBreakAfter:
4575 case CSSPropertyPageBreakBefore: 4616 case CSSPropertyPageBreakBefore:
4576 case CSSPropertyPageBreakInside: 4617 case CSSPropertyPageBreakInside:
4577 case CSSPropertyWebkitColumnBreakAfter: 4618 case CSSPropertyWebkitColumnBreakAfter:
4578 case CSSPropertyWebkitColumnBreakBefore: 4619 case CSSPropertyWebkitColumnBreakBefore:
4579 case CSSPropertyWebkitColumnBreakInside: 4620 case CSSPropertyWebkitColumnBreakInside:
4580 return consumeLegacyBreakProperty(property, important); 4621 return consumeLegacyBreakProperty(property, important);
4581 case CSSPropertyWebkitMaskPosition: 4622 case CSSPropertyWebkitMaskPosition:
4582 case CSSPropertyBackgroundPosition: { 4623 case CSSPropertyBackgroundPosition: {
4583 RawPtr<CSSValue> resultX = nullptr; 4624 CSSValue* resultX = nullptr;
4584 RawPtr<CSSValue> resultY = nullptr; 4625 CSSValue* resultY = nullptr;
4585 if (!consumeBackgroundPosition(m_range, m_context, UnitlessQuirk::Allow, resultX, resultY) || !m_range.atEnd()) 4626 if (!consumeBackgroundPosition(m_range, m_context, UnitlessQuirk::Allow, resultX, resultY) || !m_range.atEnd())
4586 return false; 4627 return false;
4587 addProperty(property == CSSPropertyBackgroundPosition ? CSSPropertyBackg roundPositionX : CSSPropertyWebkitMaskPositionX, resultX.release(), important); 4628 addProperty(property == CSSPropertyBackgroundPosition ? CSSPropertyBackg roundPositionX : CSSPropertyWebkitMaskPositionX, resultX, important);
4588 addProperty(property == CSSPropertyBackgroundPosition ? CSSPropertyBackg roundPositionY : CSSPropertyWebkitMaskPositionY, resultY.release(), important); 4629 addProperty(property == CSSPropertyBackgroundPosition ? CSSPropertyBackg roundPositionY : CSSPropertyWebkitMaskPositionY, resultY, important);
4589 return true; 4630 return true;
4590 } 4631 }
4591 case CSSPropertyBackgroundRepeat: 4632 case CSSPropertyBackgroundRepeat:
4592 case CSSPropertyWebkitMaskRepeat: { 4633 case CSSPropertyWebkitMaskRepeat: {
4593 RawPtr<CSSValue> resultX = nullptr; 4634 CSSValue* resultX = nullptr;
4594 RawPtr<CSSValue> resultY = nullptr; 4635 CSSValue* resultY = nullptr;
4595 bool implicit = false; 4636 bool implicit = false;
4596 if (!consumeRepeatStyle(m_range, resultX, resultY, implicit) || !m_range .atEnd()) 4637 if (!consumeRepeatStyle(m_range, resultX, resultY, implicit) || !m_range .atEnd())
4597 return false; 4638 return false;
4598 addProperty(property == CSSPropertyBackgroundRepeat ? CSSPropertyBackgro undRepeatX : CSSPropertyWebkitMaskRepeatX, resultX.release(), important, implici t); 4639 addProperty(property == CSSPropertyBackgroundRepeat ? CSSPropertyBackgro undRepeatX : CSSPropertyWebkitMaskRepeatX, resultX, important, implicit);
4599 addProperty(property == CSSPropertyBackgroundRepeat ? CSSPropertyBackgro undRepeatY : CSSPropertyWebkitMaskRepeatY, resultY.release(), important, implici t); 4640 addProperty(property == CSSPropertyBackgroundRepeat ? CSSPropertyBackgro undRepeatY : CSSPropertyWebkitMaskRepeatY, resultY, important, implicit);
4600 return true; 4641 return true;
4601 } 4642 }
4602 case CSSPropertyBackground: 4643 case CSSPropertyBackground:
4603 return consumeBackgroundShorthand(backgroundShorthand(), important); 4644 return consumeBackgroundShorthand(backgroundShorthand(), important);
4604 case CSSPropertyWebkitMask: 4645 case CSSPropertyWebkitMask:
4605 return consumeBackgroundShorthand(webkitMaskShorthand(), important); 4646 return consumeBackgroundShorthand(webkitMaskShorthand(), important);
4606 case CSSPropertyGridGap: { 4647 case CSSPropertyGridGap: {
4607 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled() && shorthandForPro perty(CSSPropertyGridGap).length() == 2); 4648 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled() && shorthandForPro perty(CSSPropertyGridGap).length() == 2);
4608 RawPtr<CSSValue> rowGap = consumeLength(m_range, m_context.mode(), Value RangeNonNegative); 4649 CSSValue* rowGap = consumeLength(m_range, m_context.mode(), ValueRangeNo nNegative);
4609 RawPtr<CSSValue> columnGap = consumeLength(m_range, m_context.mode(), Va lueRangeNonNegative); 4650 CSSValue* columnGap = consumeLength(m_range, m_context.mode(), ValueRang eNonNegative);
4610 if (!rowGap || !m_range.atEnd()) 4651 if (!rowGap || !m_range.atEnd())
4611 return false; 4652 return false;
4612 if (!columnGap) 4653 if (!columnGap)
4613 columnGap = rowGap; 4654 columnGap = rowGap;
4614 addProperty(CSSPropertyGridRowGap, rowGap.release(), important); 4655 addProperty(CSSPropertyGridRowGap, rowGap, important);
4615 addProperty(CSSPropertyGridColumnGap, columnGap.release(), important); 4656 addProperty(CSSPropertyGridColumnGap, columnGap, important);
4616 return true; 4657 return true;
4617 } 4658 }
4618 case CSSPropertyGridColumn: 4659 case CSSPropertyGridColumn:
4619 case CSSPropertyGridRow: 4660 case CSSPropertyGridRow:
4620 return consumeGridItemPositionShorthand(property, important); 4661 return consumeGridItemPositionShorthand(property, important);
4621 case CSSPropertyGridArea: 4662 case CSSPropertyGridArea:
4622 return consumeGridAreaShorthand(important); 4663 return consumeGridAreaShorthand(important);
4623 default: 4664 default:
4624 m_currentShorthand = oldShorthand; 4665 m_currentShorthand = oldShorthand;
4625 CSSParserValueList valueList(m_range); 4666 CSSParserValueList valueList(m_range);
4626 if (!valueList.size()) 4667 if (!valueList.size())
4627 return false; 4668 return false;
4628 m_valueList = &valueList; 4669 m_valueList = &valueList;
4629 return legacyParseShorthand(unresolvedProperty, important); 4670 return legacyParseShorthand(unresolvedProperty, important);
4630 } 4671 }
4631 } 4672 }
4632 4673
4633 } // namespace blink 4674 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698