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

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

Issue 764703002: Support unit-less lengths for white-list of properties only. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: min-width/height still accepts unitless lengths Created 5 years, 11 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
« no previous file with comments | « Source/core/css/parser/CSSPropertyParser.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2003 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 2003 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) 3 * Copyright (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com)
4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. 4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
5 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com> 5 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com>
6 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> 6 * Copyright (C) 2008 Eric Seidel <eric@webkit.org>
7 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) 7 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/)
8 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. 8 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved.
9 * Copyright (C) 2012 Intel Corporation. All rights reserved. 9 * Copyright (C) 2012 Intel Corporation. All rights reserved.
10 * 10 *
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 case CalcOther: 250 case CalcOther:
251 break; 251 break;
252 } 252 }
253 if (!b || releaseCalc == ReleaseParsedCalcValue) 253 if (!b || releaseCalc == ReleaseParsedCalcValue)
254 m_parsedCalculation.release(); 254 m_parsedCalculation.release();
255 return b; 255 return b;
256 } 256 }
257 257
258 inline bool CSSPropertyParser::shouldAcceptUnitLessValues(CSSParserValue* value, Units unitflags, CSSParserMode cssParserMode) 258 inline bool CSSPropertyParser::shouldAcceptUnitLessValues(CSSParserValue* value, Units unitflags, CSSParserMode cssParserMode)
259 { 259 {
260 // Quirks mode and presentation attributes accept unit less values. 260 // Quirks mode for certain properties and presentation attributes accept uni t-less values for certain units.
261 return (unitflags & (FLength | FAngle | FTime)) && (!value->fValue || isUnit LessLengthParsingEnabledForMode(cssParserMode)); 261 return (unitflags & (FLength | FAngle | FTime))
262 && (!value->fValue // 0 can always be unitless.
263 || isUnitLessLengthParsingEnabledForMode(cssParserMode) // HTML and SVG attribute values can always be unitless.
264 || (cssParserMode == HTMLQuirksMode && (unitflags & FUnitlessQuirk)) );
262 } 265 }
263 266
264 bool CSSPropertyParser::validUnit(CSSParserValue* value, Units unitflags, CSSPar serMode cssParserMode, ReleaseParsedCalcValueCondition releaseCalc) 267 bool CSSPropertyParser::validUnit(CSSParserValue* value, Units unitflags, CSSPar serMode cssParserMode, ReleaseParsedCalcValueCondition releaseCalc)
265 { 268 {
266 if (isCalculation(value)) 269 if (isCalculation(value))
267 return validCalculationUnit(value, unitflags, releaseCalc); 270 return validCalculationUnit(value, unitflags, releaseCalc);
268 271
269 bool b = false; 272 bool b = false;
270 switch (value->unit) { 273 switch (value->unit) {
271 case CSSPrimitiveValue::CSS_NUMBER: 274 case CSSPrimitiveValue::CSS_NUMBER:
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 || id == CSSValueRepeatingRadialGradient 387 || id == CSSValueRepeatingRadialGradient
385 || id == CSSValueWebkitLinearGradient 388 || id == CSSValueWebkitLinearGradient
386 || id == CSSValueWebkitRadialGradient 389 || id == CSSValueWebkitRadialGradient
387 || id == CSSValueWebkitRepeatingLinearGradient 390 || id == CSSValueWebkitRepeatingLinearGradient
388 || id == CSSValueWebkitRepeatingRadialGradient 391 || id == CSSValueWebkitRepeatingRadialGradient
389 || id == CSSValueWebkitGradient 392 || id == CSSValueWebkitGradient
390 || id == CSSValueWebkitCanvas 393 || id == CSSValueWebkitCanvas
391 || id == CSSValueWebkitCrossFade; 394 || id == CSSValueWebkitCrossFade;
392 } 395 }
393 396
394 bool CSSPropertyParser::validWidthOrHeight(CSSParserValue* value) 397 bool CSSPropertyParser::validWidthOrHeight(CSSParserValue* value, Units unitless )
395 { 398 {
396 int id = value->id; 399 int id = value->id;
397 if (id == CSSValueIntrinsic || id == CSSValueMinIntrinsic || id == CSSValueW ebkitMinContent || id == CSSValueWebkitMaxContent || id == CSSValueWebkitFillAva ilable || id == CSSValueWebkitFitContent) 400 if (id == CSSValueIntrinsic || id == CSSValueMinIntrinsic || id == CSSValueW ebkitMinContent || id == CSSValueWebkitMaxContent || id == CSSValueWebkitFillAva ilable || id == CSSValueWebkitFitContent)
398 return true; 401 return true;
399 return !id && validUnit(value, FLength | FPercent | FNonNeg); 402 return !id && validUnit(value, FLength | FPercent | FNonNeg | unitless);
400 } 403 }
401 404
402 inline PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parseValidPr imitive(CSSValueID identifier, CSSParserValue* value) 405 inline PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parseValidPr imitive(CSSValueID identifier, CSSParserValue* value)
403 { 406 {
404 if (identifier) 407 if (identifier)
405 return cssValuePool().createIdentifierValue(identifier); 408 return cssValuePool().createIdentifierValue(identifier);
406 if (value->unit == CSSPrimitiveValue::CSS_STRING) 409 if (value->unit == CSSPrimitiveValue::CSS_STRING)
407 return createPrimitiveStringValue(value); 410 return createPrimitiveStringValue(value);
408 if (value->unit >= CSSPrimitiveValue::CSS_NUMBER && value->unit <= CSSPrimit iveValue::CSS_KHZ) 411 if (value->unit >= CSSPrimitiveValue::CSS_NUMBER && value->unit <= CSSPrimit iveValue::CSS_KHZ)
409 return createPrimitiveNumericValue(value); 412 return createPrimitiveNumericValue(value);
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 if (CSSParserFastPaths::isKeywordPropertyID(propId)) { 489 if (CSSParserFastPaths::isKeywordPropertyID(propId)) {
487 if (!CSSParserFastPaths::isValidKeywordPropertyAndValue(propId, id)) 490 if (!CSSParserFastPaths::isValidKeywordPropertyAndValue(propId, id))
488 return false; 491 return false;
489 if (m_valueList->next() && !inShorthand()) 492 if (m_valueList->next() && !inShorthand())
490 return false; 493 return false;
491 addProperty(propId, cssValuePool().createIdentifierValue(id), important) ; 494 addProperty(propId, cssValuePool().createIdentifierValue(id), important) ;
492 return true; 495 return true;
493 } 496 }
494 497
495 bool validPrimitive = false; 498 bool validPrimitive = false;
499 Units unitless = FUnknown;
496 RefPtrWillBeRawPtr<CSSValue> parsedValue = nullptr; 500 RefPtrWillBeRawPtr<CSSValue> parsedValue = nullptr;
497 501
498 switch (propId) { 502 switch (propId) {
499 case CSSPropertySize: // <length>{1,2} | auto | [ <page-size > || [ portrait | landscape] ] 503 case CSSPropertySize: // <length>{1,2} | auto | [ <page-size > || [ portrait | landscape] ]
500 return parseSize(propId, important); 504 return parseSize(propId, important);
501 505
502 case CSSPropertyQuotes: // [<string> <string>]+ | none 506 case CSSPropertyQuotes: // [<string> <string>]+ | none
503 if (id == CSSValueNone) 507 if (id == CSSValueNone)
504 validPrimitive = true; 508 validPrimitive = true;
505 else 509 else
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
565 else if (num == 2) { 569 else if (num == 2) {
566 ShorthandScope scope(this, CSSPropertyBorderSpacing); 570 ShorthandScope scope(this, CSSPropertyBorderSpacing);
567 if (!parseValue(CSSPropertyWebkitBorderHorizontalSpacing, important) || !parseValue(CSSPropertyWebkitBorderVerticalSpacing, important)) 571 if (!parseValue(CSSPropertyWebkitBorderHorizontalSpacing, important) || !parseValue(CSSPropertyWebkitBorderVerticalSpacing, important))
568 return false; 572 return false;
569 return true; 573 return true;
570 } 574 }
571 return false; 575 return false;
572 } 576 }
573 case CSSPropertyWebkitBorderHorizontalSpacing: 577 case CSSPropertyWebkitBorderHorizontalSpacing:
574 case CSSPropertyWebkitBorderVerticalSpacing: 578 case CSSPropertyWebkitBorderVerticalSpacing:
575 validPrimitive = validUnit(value, FLength | FNonNeg); 579 unitless = FLength | FNonNeg;
580 if (inShorthand() && m_currentShorthand == CSSPropertyBorderSpacing)
581 unitless = unitless | FUnitlessQuirk;
582 validPrimitive = validUnit(value, unitless);
576 break; 583 break;
577 case CSSPropertyOutlineColor: // <color> | invert | inherit 584 case CSSPropertyOutlineColor: // <color> | invert | inherit
578 // Outline color has "invert" as additional keyword. 585 // Outline color has "invert" as additional keyword.
579 // Also, we want to allow the special focus color even in HTML Standard parsing mode. 586 // Also, we want to allow the special focus color even in HTML Standard parsing mode.
580 if (id == CSSValueInvert || id == CSSValueWebkitFocusRingColor) { 587 if (id == CSSValueInvert || id == CSSValueWebkitFocusRingColor) {
581 validPrimitive = true; 588 validPrimitive = true;
582 break; 589 break;
583 } 590 }
584 /* nobreak */ 591 /* nobreak */
585 case CSSPropertyBackgroundColor: // <color> | inherit 592 case CSSPropertyBackgroundColor: // <color> | inherit
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
777 else 784 else
778 return false; 785 return false;
779 } else if (value->unit == CSSParserValue::Function && value->function->i d == CSSValueWebkitImageSet) { 786 } else if (value->unit == CSSParserValue::Function && value->function->i d == CSSValueWebkitImageSet) {
780 parsedValue = parseImageSet(m_valueList); 787 parsedValue = parseImageSet(m_valueList);
781 if (!parsedValue) 788 if (!parsedValue)
782 return false; 789 return false;
783 m_valueList->next(); 790 m_valueList->next();
784 } 791 }
785 break; 792 break;
786 793
787 case CSSPropertyWebkitTextStrokeWidth:
788 case CSSPropertyOutlineWidth: // <border-width> | inherit
789 case CSSPropertyBorderTopWidth: //// <border-width> | inherit 794 case CSSPropertyBorderTopWidth: //// <border-width> | inherit
790 case CSSPropertyBorderRightWidth: // Which is defined as 795 case CSSPropertyBorderRightWidth: // Which is defined as
791 case CSSPropertyBorderBottomWidth: // thin | medium | thick | <length> 796 case CSSPropertyBorderBottomWidth: // thin | medium | thick | <length>
792 case CSSPropertyBorderLeftWidth: 797 case CSSPropertyBorderLeftWidth:
798 if (!inShorthand() || m_currentShorthand == CSSPropertyBorderWidth)
799 unitless = FUnitlessQuirk;
800 // fall through
801 case CSSPropertyWebkitTextStrokeWidth:
802 case CSSPropertyOutlineWidth: // <border-width> | inherit
793 case CSSPropertyWebkitBorderStartWidth: 803 case CSSPropertyWebkitBorderStartWidth:
794 case CSSPropertyWebkitBorderEndWidth: 804 case CSSPropertyWebkitBorderEndWidth:
795 case CSSPropertyWebkitBorderBeforeWidth: 805 case CSSPropertyWebkitBorderBeforeWidth:
796 case CSSPropertyWebkitBorderAfterWidth: 806 case CSSPropertyWebkitBorderAfterWidth:
797 case CSSPropertyWebkitColumnRuleWidth: 807 case CSSPropertyWebkitColumnRuleWidth:
798 if (id == CSSValueThin || id == CSSValueMedium || id == CSSValueThick) 808 if (id == CSSValueThin || id == CSSValueMedium || id == CSSValueThick)
799 validPrimitive = true; 809 validPrimitive = true;
800 else 810 else
801 validPrimitive = validUnit(value, FLength | FNonNeg); 811 validPrimitive = validUnit(value, FLength | FNonNeg | unitless);
802 break; 812 break;
803 813
804 case CSSPropertyLetterSpacing: // normal | <length> | inherit 814 case CSSPropertyLetterSpacing: // normal | <length> | inherit
805 case CSSPropertyWordSpacing: // normal | <length> | inherit 815 case CSSPropertyWordSpacing: // normal | <length> | inherit
806 if (id == CSSValueNormal) 816 if (id == CSSValueNormal)
807 validPrimitive = true; 817 validPrimitive = true;
808 else 818 else
809 validPrimitive = validUnit(value, FLength); 819 validPrimitive = validUnit(value, FLength | FUnitlessQuirk);
810 break; 820 break;
811 821
812 case CSSPropertyTextIndent: 822 case CSSPropertyTextIndent:
813 parsedValue = parseTextIndent(); 823 parsedValue = parseTextIndent();
814 break; 824 break;
815 825
816 case CSSPropertyPaddingTop: //// <padding-width> | inherit 826 case CSSPropertyPaddingTop: //// <padding-width> | inherit
817 case CSSPropertyPaddingRight: // Which is defined as 827 case CSSPropertyPaddingRight: // Which is defined as
818 case CSSPropertyPaddingBottom: // <length> | <percentage> 828 case CSSPropertyPaddingBottom: // <length> | <percentage>
819 case CSSPropertyPaddingLeft: //// 829 case CSSPropertyPaddingLeft: ////
830 unitless = FUnitlessQuirk;
831 // fall through
820 case CSSPropertyWebkitPaddingStart: 832 case CSSPropertyWebkitPaddingStart:
821 case CSSPropertyWebkitPaddingEnd: 833 case CSSPropertyWebkitPaddingEnd:
822 case CSSPropertyWebkitPaddingBefore: 834 case CSSPropertyWebkitPaddingBefore:
823 case CSSPropertyWebkitPaddingAfter: 835 case CSSPropertyWebkitPaddingAfter:
824 validPrimitive = (!id && validUnit(value, FLength | FPercent | FNonNeg)) ; 836 validPrimitive = (!id && validUnit(value, FLength | FPercent | FNonNeg | unitless));
825 break; 837 break;
826 838
827 case CSSPropertyMaxWidth: 839 case CSSPropertyMaxWidth:
840 case CSSPropertyMaxHeight:
841 unitless = FUnitlessQuirk;
842 // fall through
828 case CSSPropertyWebkitMaxLogicalWidth: 843 case CSSPropertyWebkitMaxLogicalWidth:
829 case CSSPropertyMaxHeight:
830 case CSSPropertyWebkitMaxLogicalHeight: 844 case CSSPropertyWebkitMaxLogicalHeight:
831 validPrimitive = (id == CSSValueNone || validWidthOrHeight(value)); 845 validPrimitive = (id == CSSValueNone || validWidthOrHeight(value, unitle ss));
832 break; 846 break;
833 847
834 case CSSPropertyMinWidth: 848 case CSSPropertyMinWidth:
849 case CSSPropertyMinHeight:
850 unitless = FUnitlessQuirk;
851 // fall through
835 case CSSPropertyWebkitMinLogicalWidth: 852 case CSSPropertyWebkitMinLogicalWidth:
836 case CSSPropertyMinHeight:
837 case CSSPropertyWebkitMinLogicalHeight: 853 case CSSPropertyWebkitMinLogicalHeight:
838 validPrimitive = validWidthOrHeight(value); 854 validPrimitive = validWidthOrHeight(value, unitless);
839 break; 855 break;
840 856
841 case CSSPropertyWidth: 857 case CSSPropertyWidth:
858 case CSSPropertyHeight:
859 unitless = FUnitlessQuirk;
860 // fall through
842 case CSSPropertyWebkitLogicalWidth: 861 case CSSPropertyWebkitLogicalWidth:
843 case CSSPropertyHeight:
844 case CSSPropertyWebkitLogicalHeight: 862 case CSSPropertyWebkitLogicalHeight:
845 validPrimitive = (id == CSSValueAuto || validWidthOrHeight(value)); 863 validPrimitive = (id == CSSValueAuto || validWidthOrHeight(value, unitle ss));
846 break; 864 break;
847 865
848 case CSSPropertyFontSize: 866 case CSSPropertyFontSize:
849 return parseFontSize(important); 867 return parseFontSize(important);
850 868
851 case CSSPropertyFontVariant: // normal | small-caps | inherit 869 case CSSPropertyFontVariant: // normal | small-caps | inherit
852 return parseFontVariant(important); 870 return parseFontVariant(important);
853 871
854 case CSSPropertyVerticalAlign: 872 case CSSPropertyVerticalAlign:
855 // baseline | sub | super | top | text-top | middle | bottom | text-bott om | 873 // baseline | sub | super | top | text-top | middle | bottom | text-bott om |
856 // <percentage> | <length> | inherit 874 // <percentage> | <length> | inherit
857 875
858 if (id >= CSSValueBaseline && id <= CSSValueWebkitBaselineMiddle) 876 if (id >= CSSValueBaseline && id <= CSSValueWebkitBaselineMiddle)
859 validPrimitive = true; 877 validPrimitive = true;
860 else 878 else
861 validPrimitive = (!id && validUnit(value, FLength | FPercent)); 879 validPrimitive = (!id && validUnit(value, FLength | FPercent | FUnit lessQuirk));
862 break; 880 break;
863 881
864 case CSSPropertyBottom: // <length> | <percentage> | auto | in herit 882 case CSSPropertyBottom: // <length> | <percentage> | auto | in herit
865 case CSSPropertyLeft: // <length> | <percentage> | auto | in herit 883 case CSSPropertyLeft: // <length> | <percentage> | auto | in herit
866 case CSSPropertyRight: // <length> | <percentage> | auto | in herit 884 case CSSPropertyRight: // <length> | <percentage> | auto | in herit
867 case CSSPropertyTop: // <length> | <percentage> | auto | in herit 885 case CSSPropertyTop: // <length> | <percentage> | auto | in herit
868 case CSSPropertyMarginTop: //// <margin-width> | inherit 886 case CSSPropertyMarginTop: //// <margin-width> | inherit
869 case CSSPropertyMarginRight: // Which is defined as 887 case CSSPropertyMarginRight: // Which is defined as
870 case CSSPropertyMarginBottom: // <length> | <percentage> | auto | i nherit 888 case CSSPropertyMarginBottom: // <length> | <percentage> | auto | i nherit
871 case CSSPropertyMarginLeft: //// 889 case CSSPropertyMarginLeft: ////
890 unitless = FUnitlessQuirk;
891 // fall through
872 case CSSPropertyWebkitMarginStart: 892 case CSSPropertyWebkitMarginStart:
873 case CSSPropertyWebkitMarginEnd: 893 case CSSPropertyWebkitMarginEnd:
874 case CSSPropertyWebkitMarginBefore: 894 case CSSPropertyWebkitMarginBefore:
875 case CSSPropertyWebkitMarginAfter: 895 case CSSPropertyWebkitMarginAfter:
876 if (id == CSSValueAuto) 896 if (id == CSSValueAuto)
877 validPrimitive = true; 897 validPrimitive = true;
878 else 898 else
879 validPrimitive = (!id && validUnit(value, FLength | FPercent)); 899 validPrimitive = (!id && validUnit(value, FLength | FPercent | unitl ess));
880 break; 900 break;
881 901
882 case CSSPropertyOrphans: // <integer> | inherit | auto (We've added support for auto for backwards compatibility) 902 case CSSPropertyOrphans: // <integer> | inherit | auto (We've added support for auto for backwards compatibility)
883 case CSSPropertyWidows: // <integer> | inherit | auto (Ditto) 903 case CSSPropertyWidows: // <integer> | inherit | auto (Ditto)
884 if (id == CSSValueAuto) 904 if (id == CSSValueAuto)
885 validPrimitive = true; 905 validPrimitive = true;
886 else 906 else
887 validPrimitive = (!id && validUnit(value, FPositiveInteger)); 907 validPrimitive = (!id && validUnit(value, FPositiveInteger));
888 break; 908 break;
889 909
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after
1314 // End of CSS3 properties 1334 // End of CSS3 properties
1315 1335
1316 // Apple specific properties. These will never be standardized and are pure ly to 1336 // Apple specific properties. These will never be standardized and are pure ly to
1317 // support custom WebKit-based Apple applications. 1337 // support custom WebKit-based Apple applications.
1318 case CSSPropertyWebkitLineClamp: 1338 case CSSPropertyWebkitLineClamp:
1319 // When specifying number of lines, don't allow 0 as a valid value 1339 // When specifying number of lines, don't allow 0 as a valid value
1320 // When specifying either type of unit, require non-negative integers 1340 // When specifying either type of unit, require non-negative integers
1321 validPrimitive = (!id && (value->unit == CSSPrimitiveValue::CSS_PERCENTA GE || value->fValue) && validUnit(value, FInteger | FPercent | FNonNeg)); 1341 validPrimitive = (!id && (value->unit == CSSPrimitiveValue::CSS_PERCENTA GE || value->fValue) && validUnit(value, FInteger | FPercent | FNonNeg));
1322 break; 1342 break;
1323 1343
1324 case CSSPropertyWebkitFontSizeDelta: // <length> 1344 case CSSPropertyWebkitFontSizeDelta: // <length>
1325 validPrimitive = validUnit(value, FLength); 1345 validPrimitive = validUnit(value, FLength | FUnitlessQuirk);
1326 break; 1346 break;
1327 1347
1328 case CSSPropertyWebkitHighlight: 1348 case CSSPropertyWebkitHighlight:
1329 if (id == CSSValueNone || value->unit == CSSPrimitiveValue::CSS_STRING) 1349 if (id == CSSValueNone || value->unit == CSSPrimitiveValue::CSS_STRING)
1330 validPrimitive = true; 1350 validPrimitive = true;
1331 break; 1351 break;
1332 1352
1333 case CSSPropertyWebkitHyphenateCharacter: 1353 case CSSPropertyWebkitHyphenateCharacter:
1334 if (id == CSSValueAuto || value->unit == CSSPrimitiveValue::CSS_STRING) 1354 if (id == CSSValueAuto || value->unit == CSSPrimitiveValue::CSS_STRING)
1335 validPrimitive = true; 1355 validPrimitive = true;
(...skipping 970 matching lines...) Expand 10 before | Expand all | Expand 10 after
2306 percent = 100; 2326 percent = 100;
2307 else if (id == CSSValueCenter) 2327 else if (id == CSSValueCenter)
2308 percent = 50; 2328 percent = 50;
2309 return cssValuePool().createValue(percent, CSSPrimitiveValue::CSS_PERCEN TAGE); 2329 return cssValuePool().createValue(percent, CSSPrimitiveValue::CSS_PERCEN TAGE);
2310 } 2330 }
2311 if (validUnit(valueList->current(), FPercent | FLength)) 2331 if (validUnit(valueList->current(), FPercent | FLength))
2312 return createPrimitiveNumericValue(valueList->current()); 2332 return createPrimitiveNumericValue(valueList->current());
2313 return nullptr; 2333 return nullptr;
2314 } 2334 }
2315 2335
2316 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parseFillPositionCo mponent(CSSParserValueList* valueList, unsigned& cumulativeFlags, FillPositionFl ag& individualFlag, FillPositionParsingMode parsingMode) 2336 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parseFillPositionCo mponent(CSSParserValueList* valueList, unsigned& cumulativeFlags, FillPositionFl ag& individualFlag, FillPositionParsingMode parsingMode, Units unitless)
2317 { 2337 {
2318 CSSValueID id = valueList->current()->id; 2338 CSSValueID id = valueList->current()->id;
2319 if (id == CSSValueLeft || id == CSSValueTop || id == CSSValueRight || id == CSSValueBottom || id == CSSValueCenter) { 2339 if (id == CSSValueLeft || id == CSSValueTop || id == CSSValueRight || id == CSSValueBottom || id == CSSValueCenter) {
2320 int percent = 0; 2340 int percent = 0;
2321 if (id == CSSValueLeft || id == CSSValueRight) { 2341 if (id == CSSValueLeft || id == CSSValueRight) {
2322 if (cumulativeFlags & XFillPosition) 2342 if (cumulativeFlags & XFillPosition)
2323 return nullptr; 2343 return nullptr;
2324 cumulativeFlags |= XFillPosition; 2344 cumulativeFlags |= XFillPosition;
2325 individualFlag = XFillPosition; 2345 individualFlag = XFillPosition;
2326 if (id == CSSValueRight) 2346 if (id == CSSValueRight)
(...skipping 11 matching lines...) Expand all
2338 percent = 50; 2358 percent = 50;
2339 cumulativeFlags |= AmbiguousFillPosition; 2359 cumulativeFlags |= AmbiguousFillPosition;
2340 individualFlag = AmbiguousFillPosition; 2360 individualFlag = AmbiguousFillPosition;
2341 } 2361 }
2342 2362
2343 if (parsingMode == ResolveValuesAsKeyword) 2363 if (parsingMode == ResolveValuesAsKeyword)
2344 return cssValuePool().createIdentifierValue(id); 2364 return cssValuePool().createIdentifierValue(id);
2345 2365
2346 return cssValuePool().createValue(percent, CSSPrimitiveValue::CSS_PERCEN TAGE); 2366 return cssValuePool().createValue(percent, CSSPrimitiveValue::CSS_PERCEN TAGE);
2347 } 2367 }
2348 if (validUnit(valueList->current(), FPercent | FLength)) { 2368 if (validUnit(valueList->current(), FPercent | FLength | unitless)) {
2349 if (!cumulativeFlags) { 2369 if (!cumulativeFlags) {
2350 cumulativeFlags |= XFillPosition; 2370 cumulativeFlags |= XFillPosition;
2351 individualFlag = XFillPosition; 2371 individualFlag = XFillPosition;
2352 } else if (cumulativeFlags & (XFillPosition | AmbiguousFillPosition)) { 2372 } else if (cumulativeFlags & (XFillPosition | AmbiguousFillPosition)) {
2353 cumulativeFlags |= YFillPosition; 2373 cumulativeFlags |= YFillPosition;
2354 individualFlag = YFillPosition; 2374 individualFlag = YFillPosition;
2355 } else { 2375 } else {
2356 if (m_parsedCalculation) 2376 if (m_parsedCalculation)
2357 m_parsedCalculation.release(); 2377 m_parsedCalculation.release();
2358 return nullptr; 2378 return nullptr;
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
2515 ASSERT(ident1 == CSSValueLeft || ident1 == CSSValueRight); 2535 ASSERT(ident1 == CSSValueLeft || ident1 == CSSValueRight);
2516 ASSERT(ident2 == CSSValueBottom || ident2 == CSSValueTop); 2536 ASSERT(ident2 == CSSValueBottom || ident2 == CSSValueTop);
2517 #endif 2537 #endif
2518 } 2538 }
2519 2539
2520 inline bool CSSPropertyParser::isPotentialPositionValue(CSSParserValue* value) 2540 inline bool CSSPropertyParser::isPotentialPositionValue(CSSParserValue* value)
2521 { 2541 {
2522 return isFillPositionKeyword(value->id) || validUnit(value, FPercent | FLeng th, ReleaseParsedCalcValue); 2542 return isFillPositionKeyword(value->id) || validUnit(value, FPercent | FLeng th, ReleaseParsedCalcValue);
2523 } 2543 }
2524 2544
2525 void CSSPropertyParser::parseFillPosition(CSSParserValueList* valueList, RefPtrW illBeRawPtr<CSSValue>& value1, RefPtrWillBeRawPtr<CSSValue>& value2) 2545 void CSSPropertyParser::parseFillPosition(CSSParserValueList* valueList, RefPtrW illBeRawPtr<CSSValue>& value1, RefPtrWillBeRawPtr<CSSValue>& value2, Units unitl ess)
2526 { 2546 {
2527 unsigned numberOfValues = 0; 2547 unsigned numberOfValues = 0;
2528 for (unsigned i = valueList->currentIndex(); i < valueList->size(); ++i, ++n umberOfValues) { 2548 for (unsigned i = valueList->currentIndex(); i < valueList->size(); ++i, ++n umberOfValues) {
2529 CSSParserValue* current = valueList->valueAt(i); 2549 CSSParserValue* current = valueList->valueAt(i);
2530 if (isComma(current) || !current || isForwardSlashOperator(current) || ! isPotentialPositionValue(current)) 2550 if (isComma(current) || !current || isForwardSlashOperator(current) || ! isPotentialPositionValue(current))
2531 break; 2551 break;
2532 } 2552 }
2533 2553
2534 if (numberOfValues > 4) 2554 if (numberOfValues > 4)
2535 return; 2555 return;
2536 2556
2537 // If we are parsing two values, we can safely call the CSS 2.1 parsing func tion and return. 2557 // If we are parsing two values, we can safely call the CSS 2.1 parsing func tion and return.
2538 if (numberOfValues <= 2) { 2558 if (numberOfValues <= 2) {
2539 parse2ValuesFillPosition(valueList, value1, value2); 2559 parse2ValuesFillPosition(valueList, value1, value2, unitless);
2540 return; 2560 return;
2541 } 2561 }
2542 2562
2543 ASSERT(numberOfValues > 2 && numberOfValues <= 4); 2563 ASSERT(numberOfValues > 2 && numberOfValues <= 4);
2544 2564
2545 CSSParserValue* value = valueList->current(); 2565 CSSParserValue* value = valueList->current();
2546 2566
2547 // <position> requires the first value to be a background keyword. 2567 // <position> requires the first value to be a background keyword.
2548 if (!isFillPositionKeyword(value->id)) 2568 if (!isFillPositionKeyword(value->id))
2549 return; 2569 return;
(...skipping 28 matching lines...) Expand all
2578 // Per CSS3 syntax, <position> can't have 'center' as its second keyword as we have more arguments to follow. 2598 // Per CSS3 syntax, <position> can't have 'center' as its second keyword as we have more arguments to follow.
2579 if (parsedValue2->getValueID() == CSSValueCenter) 2599 if (parsedValue2->getValueID() == CSSValueCenter)
2580 return; 2600 return;
2581 2601
2582 if (numberOfValues == 3) 2602 if (numberOfValues == 3)
2583 parse3ValuesFillPosition(valueList, value1, value2, parsedValue1.release (), parsedValue2.release()); 2603 parse3ValuesFillPosition(valueList, value1, value2, parsedValue1.release (), parsedValue2.release());
2584 else 2604 else
2585 parse4ValuesFillPosition(valueList, value1, value2, parsedValue1.release (), parsedValue2.release()); 2605 parse4ValuesFillPosition(valueList, value1, value2, parsedValue1.release (), parsedValue2.release());
2586 } 2606 }
2587 2607
2588 void CSSPropertyParser::parse2ValuesFillPosition(CSSParserValueList* valueList, RefPtrWillBeRawPtr<CSSValue>& value1, RefPtrWillBeRawPtr<CSSValue>& value2) 2608 void CSSPropertyParser::parse2ValuesFillPosition(CSSParserValueList* valueList, RefPtrWillBeRawPtr<CSSValue>& value1, RefPtrWillBeRawPtr<CSSValue>& value2, Unit s unitless)
2589 { 2609 {
2590 // Parse the first value. We're just making sure that it is one of the vali d keywords or a percentage/length. 2610 // Parse the first value. We're just making sure that it is one of the vali d keywords or a percentage/length.
2591 unsigned cumulativeFlags = 0; 2611 unsigned cumulativeFlags = 0;
2592 FillPositionFlag value1Flag = InvalidFillPosition; 2612 FillPositionFlag value1Flag = InvalidFillPosition;
2593 FillPositionFlag value2Flag = InvalidFillPosition; 2613 FillPositionFlag value2Flag = InvalidFillPosition;
2594 value1 = parseFillPositionComponent(valueList, cumulativeFlags, value1Flag); 2614 value1 = parseFillPositionComponent(valueList, cumulativeFlags, value1Flag, ResolveValuesAsPercent, unitless);
2595 if (!value1) 2615 if (!value1)
2596 return; 2616 return;
2597 2617
2598 // It only takes one value for background-position to be correctly parsed if it was specified in a shorthand (since we 2618 // It only takes one value for background-position to be correctly parsed if it was specified in a shorthand (since we
2599 // can assume that any other values belong to the rest of the shorthand). I f we're not parsing a shorthand, though, the 2619 // can assume that any other values belong to the rest of the shorthand). I f we're not parsing a shorthand, though, the
2600 // value was explicitly specified for our property. 2620 // value was explicitly specified for our property.
2601 CSSParserValue* value = valueList->next(); 2621 CSSParserValue* value = valueList->next();
2602 2622
2603 // First check for the comma. If so, we are finished parsing this value or value pair. 2623 // First check for the comma. If so, we are finished parsing this value or value pair.
2604 if (isComma(value)) 2624 if (isComma(value))
2605 value = 0; 2625 value = 0;
2606 2626
2607 if (value) { 2627 if (value) {
2608 value2 = parseFillPositionComponent(valueList, cumulativeFlags, value2Fl ag); 2628 value2 = parseFillPositionComponent(valueList, cumulativeFlags, value2Fl ag, ResolveValuesAsPercent, unitless);
2609 if (value2) 2629 if (value2)
2610 valueList->next(); 2630 valueList->next();
2611 else { 2631 else {
2612 if (!inShorthand()) { 2632 if (!inShorthand()) {
2613 value1.clear(); 2633 value1.clear();
2614 return; 2634 return;
2615 } 2635 }
2616 } 2636 }
2617 } 2637 }
2618 2638
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
2739 propId1 = CSSPropertyBackgroundRepeatX; 2759 propId1 = CSSPropertyBackgroundRepeatX;
2740 propId2 = CSSPropertyBackgroundRepeatY; 2760 propId2 = CSSPropertyBackgroundRepeatY;
2741 } else if (propId == CSSPropertyWebkitMaskRepeat) { 2761 } else if (propId == CSSPropertyWebkitMaskRepeat) {
2742 propId1 = CSSPropertyWebkitMaskRepeatX; 2762 propId1 = CSSPropertyWebkitMaskRepeatX;
2743 propId2 = CSSPropertyWebkitMaskRepeatY; 2763 propId2 = CSSPropertyWebkitMaskRepeatY;
2744 } 2764 }
2745 2765
2746 for (CSSParserValue* val = m_valueList->current(); val; val = m_valueList->c urrent()) { 2766 for (CSSParserValue* val = m_valueList->current(); val; val = m_valueList->c urrent()) {
2747 RefPtrWillBeRawPtr<CSSValue> currValue = nullptr; 2767 RefPtrWillBeRawPtr<CSSValue> currValue = nullptr;
2748 RefPtrWillBeRawPtr<CSSValue> currValue2 = nullptr; 2768 RefPtrWillBeRawPtr<CSSValue> currValue2 = nullptr;
2749 2769 Units unitless = FUnknown;
2750 if (allowComma) { 2770 if (allowComma) {
2751 if (!isComma(val)) 2771 if (!isComma(val))
2752 return false; 2772 return false;
2753 m_valueList->next(); 2773 m_valueList->next();
2754 allowComma = false; 2774 allowComma = false;
2755 } else { 2775 } else {
2756 allowComma = true; 2776 allowComma = true;
2757 switch (propId) { 2777 switch (propId) {
2758 case CSSPropertyBackgroundColor: 2778 case CSSPropertyBackgroundColor:
2759 currValue = parseBackgroundColor(); 2779 currValue = parseBackgroundColor();
(...skipping 29 matching lines...) Expand all
2789 if (parseBackgroundClip(val, currValue)) 2809 if (parseBackgroundClip(val, currValue))
2790 m_valueList->next(); 2810 m_valueList->next();
2791 break; 2811 break;
2792 case CSSPropertyBackgroundOrigin: 2812 case CSSPropertyBackgroundOrigin:
2793 if (val->id == CSSValueBorderBox || val->id == CSSValuePaddi ngBox || val->id == CSSValueContentBox) { 2813 if (val->id == CSSValueBorderBox || val->id == CSSValuePaddi ngBox || val->id == CSSValueContentBox) {
2794 currValue = cssValuePool().createIdentifierValue(val->id ); 2814 currValue = cssValuePool().createIdentifierValue(val->id );
2795 m_valueList->next(); 2815 m_valueList->next();
2796 } 2816 }
2797 break; 2817 break;
2798 case CSSPropertyBackgroundPosition: 2818 case CSSPropertyBackgroundPosition:
2819 if (!inShorthand())
2820 unitless = FUnitlessQuirk;
2821 // fall-through
2799 case CSSPropertyWebkitMaskPosition: 2822 case CSSPropertyWebkitMaskPosition:
2800 parseFillPosition(m_valueList, currValue, currValue2); 2823 parseFillPosition(m_valueList, currValue, currValue2, unitle ss);
2801 // parseFillPosition advances the m_valueList pointer. 2824 // parseFillPosition advances the m_valueList pointer.
2802 break; 2825 break;
2803 case CSSPropertyBackgroundPositionX: 2826 case CSSPropertyBackgroundPositionX:
2804 case CSSPropertyWebkitMaskPositionX: { 2827 case CSSPropertyWebkitMaskPositionX: {
2805 currValue = parseFillPositionX(m_valueList); 2828 currValue = parseFillPositionX(m_valueList);
2806 if (currValue) 2829 if (currValue)
2807 m_valueList->next(); 2830 m_valueList->next();
2808 break; 2831 break;
2809 } 2832 }
2810 case CSSPropertyBackgroundPositionY: 2833 case CSSPropertyBackgroundPositionY:
(...skipping 1084 matching lines...) Expand 10 before | Expand all | Expand 10 after
3895 if (value->function->id != CSSValueRect || !args) 3918 if (value->function->id != CSSValueRect || !args)
3896 return false; 3919 return false;
3897 3920
3898 // rect(t, r, b, l) || rect(t r b l) 3921 // rect(t, r, b, l) || rect(t r b l)
3899 if (args->size() != 4 && args->size() != 7) 3922 if (args->size() != 4 && args->size() != 7)
3900 return false; 3923 return false;
3901 RefPtrWillBeRawPtr<Rect> rect = Rect::create(); 3924 RefPtrWillBeRawPtr<Rect> rect = Rect::create();
3902 int i = 0; 3925 int i = 0;
3903 CSSParserValue* a = args->current(); 3926 CSSParserValue* a = args->current();
3904 while (a) { 3927 while (a) {
3905 if (a->id != CSSValueAuto && !validUnit(a, FLength)) 3928 if (a->id != CSSValueAuto && !validUnit(a, FLength | FUnitlessQuirk))
3906 return false; 3929 return false;
3907 RefPtrWillBeRawPtr<CSSPrimitiveValue> length = a->id == CSSValueAuto ? 3930 RefPtrWillBeRawPtr<CSSPrimitiveValue> length = a->id == CSSValueAuto ?
3908 cssValuePool().createIdentifierValue(CSSValueAuto) : 3931 cssValuePool().createIdentifierValue(CSSValueAuto) :
3909 createPrimitiveNumericValue(a); 3932 createPrimitiveNumericValue(a);
3910 if (i == 0) 3933 if (i == 0)
3911 rect->setTop(length); 3934 rect->setTop(length);
3912 else if (i == 1) 3935 else if (i == 1)
3913 rect->setRight(length); 3936 rect->setRight(length);
3914 else if (i == 2) 3937 else if (i == 2)
3915 rect->setBottom(length); 3938 rect->setBottom(length);
(...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after
4691 4714
4692 bool CSSPropertyParser::parseFontSize(bool important) 4715 bool CSSPropertyParser::parseFontSize(bool important)
4693 { 4716 {
4694 CSSParserValue* value = m_valueList->current(); 4717 CSSParserValue* value = m_valueList->current();
4695 CSSValueID id = value->id; 4718 CSSValueID id = value->id;
4696 bool validPrimitive = false; 4719 bool validPrimitive = false;
4697 // <absolute-size> | <relative-size> | <length> | <percentage> | inherit 4720 // <absolute-size> | <relative-size> | <length> | <percentage> | inherit
4698 if (id >= CSSValueXxSmall && id <= CSSValueLarger) 4721 if (id >= CSSValueXxSmall && id <= CSSValueLarger)
4699 validPrimitive = true; 4722 validPrimitive = true;
4700 else 4723 else
4701 validPrimitive = validUnit(value, FLength | FPercent | FNonNeg); 4724 validPrimitive = validUnit(value, FLength | FPercent | FNonNeg | (inShor thand() ? FUnknown : FUnitlessQuirk));
4702 if (validPrimitive && (!m_valueList->next() || inShorthand())) 4725 if (validPrimitive && (!m_valueList->next() || inShorthand()))
4703 addProperty(CSSPropertyFontSize, parseValidPrimitive(id, value), importa nt); 4726 addProperty(CSSPropertyFontSize, parseValidPrimitive(id, value), importa nt);
4704 return validPrimitive; 4727 return validPrimitive;
4705 } 4728 }
4706 4729
4707 bool CSSPropertyParser::parseFontVariant(bool important) 4730 bool CSSPropertyParser::parseFontVariant(bool important)
4708 { 4731 {
4709 RefPtrWillBeRawPtr<CSSValueList> values = nullptr; 4732 RefPtrWillBeRawPtr<CSSValueList> values = nullptr;
4710 if (m_valueList->size() > 1) 4733 if (m_valueList->size() > 1)
4711 values = CSSValueList::createCommaSeparated(); 4734 values = CSSValueList::createCommaSeparated();
(...skipping 2890 matching lines...) Expand 10 before | Expand all | Expand 10 after
7602 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseTextIndent() 7625 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseTextIndent()
7603 { 7626 {
7604 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated() ; 7627 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated() ;
7605 7628
7606 bool hasLengthOrPercentage = false; 7629 bool hasLengthOrPercentage = false;
7607 bool hasEachLine = false; 7630 bool hasEachLine = false;
7608 bool hasHanging = false; 7631 bool hasHanging = false;
7609 7632
7610 for (CSSParserValue* value = m_valueList->current(); value; value = m_valueL ist->next()) { 7633 for (CSSParserValue* value = m_valueList->current(); value; value = m_valueL ist->next()) {
7611 // <length> | <percentage> | inherit when RuntimeEnabledFeatures::css3Te xtEnabled() returns false 7634 // <length> | <percentage> | inherit when RuntimeEnabledFeatures::css3Te xtEnabled() returns false
7612 if (!hasLengthOrPercentage && validUnit(value, FLength | FPercent)) { 7635 if (!hasLengthOrPercentage && validUnit(value, FLength | FPercent | FUni tlessQuirk)) {
7613 list->append(createPrimitiveNumericValue(value)); 7636 list->append(createPrimitiveNumericValue(value));
7614 hasLengthOrPercentage = true; 7637 hasLengthOrPercentage = true;
7615 continue; 7638 continue;
7616 } 7639 }
7617 7640
7618 // [ <length> | <percentage> ] && hanging? && each-line? | inherit 7641 // [ <length> | <percentage> ] && hanging? && each-line? | inherit
7619 // when RuntimeEnabledFeatures::css3TextEnabled() returns true 7642 // when RuntimeEnabledFeatures::css3TextEnabled() returns true
7620 if (RuntimeEnabledFeatures::css3TextEnabled()) { 7643 if (RuntimeEnabledFeatures::css3TextEnabled()) {
7621 if (!hasEachLine && value->id == CSSValueEachLine) { 7644 if (!hasEachLine && value->id == CSSValueEachLine) {
7622 list->append(cssValuePool().createIdentifierValue(CSSValueEachLi ne)); 7645 list->append(cssValuePool().createIdentifierValue(CSSValueEachLi ne));
(...skipping 947 matching lines...) Expand 10 before | Expand all | Expand 10 after
8570 } 8593 }
8571 } 8594 }
8572 8595
8573 if (!list->length()) 8596 if (!list->length())
8574 return nullptr; 8597 return nullptr;
8575 8598
8576 return list.release(); 8599 return list.release();
8577 } 8600 }
8578 8601
8579 } // namespace blink 8602 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/css/parser/CSSPropertyParser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698