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

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

Issue 1311413004: Merge parseBorderRadius and parseInsetRoundedCorners (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Address review comments Created 4 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 | « third_party/WebKit/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 488 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 return false; 499 return false;
500 parsedValue2 = createPrimitiveNumericValue(value); 500 parsedValue2 = createPrimitiveNumericValue(value);
501 } else 501 } else
502 parsedValue2 = parsedValue1; 502 parsedValue2 = parsedValue1;
503 503
504 if (m_valueList->next()) 504 if (m_valueList->next())
505 return false; 505 return false;
506 addProperty(propId, CSSValuePair::create(parsedValue1.release(), parsedV alue2.release(), CSSValuePair::DropIdenticalValues), important); 506 addProperty(propId, CSSValuePair::create(parsedValue1.release(), parsedV alue2.release(), CSSValuePair::DropIdenticalValues), important);
507 return true; 507 return true;
508 } 508 }
509 case CSSPropertyBorderRadius: 509 case CSSPropertyBorderRadius: {
510 case CSSPropertyAliasWebkitBorderRadius: 510 ShorthandScope scope(this, unresolvedProperty);
511 return parseBorderRadius(unresolvedProperty, important); 511 RefPtrWillBeRawPtr<CSSPrimitiveValue> radii[4];
512 RefPtrWillBeRawPtr<CSSPrimitiveValue> radii2[4];
513 if (!parseRadii(radii, radii2, m_valueList, unresolvedProperty))
514 return false;
515 ImplicitScope implicitScope(this);
516 addProperty(CSSPropertyBorderTopLeftRadius, CSSValuePair::create(radii[0 ].release(), radii2[0].release(), CSSValuePair::DropIdenticalValues), important) ;
517 addProperty(CSSPropertyBorderTopRightRadius, CSSValuePair::create(radii[ 1].release(), radii2[1].release(), CSSValuePair::DropIdenticalValues), important );
518 addProperty(CSSPropertyBorderBottomRightRadius, CSSValuePair::create(rad ii[2].release(), radii2[2].release(), CSSValuePair::DropIdenticalValues), import ant);
519 addProperty(CSSPropertyBorderBottomLeftRadius, CSSValuePair::create(radi i[3].release(), radii2[3].release(), CSSValuePair::DropIdenticalValues), importa nt);
520 return true;
521 }
512 case CSSPropertyWebkitBoxReflect: 522 case CSSPropertyWebkitBoxReflect:
513 if (id == CSSValueNone) 523 if (id == CSSValueNone)
514 validPrimitive = true; 524 validPrimitive = true;
515 else 525 else
516 parsedValue = parseReflect(); 526 parsedValue = parseReflect();
517 break; 527 break;
518 case CSSPropertyFontSizeAdjust: // none | <number> 528 case CSSPropertyFontSizeAdjust: // none | <number>
519 ASSERT(RuntimeEnabledFeatures::cssFontSizeAdjustEnabled()); 529 ASSERT(RuntimeEnabledFeatures::cssFontSizeAdjustEnabled());
520 validPrimitive = (id == CSSValueNone) ? true : validUnit(value, FNumber | FNonNeg); 530 validPrimitive = (id == CSSValueNone) ? true : validUnit(value, FNumber | FNonNeg);
521 break; 531 break;
(...skipping 2107 matching lines...) Expand 10 before | Expand all | Expand 10 after
2629 if (radii[3]) 2639 if (radii[3])
2630 return; 2640 return;
2631 if (!radii[2]) { 2641 if (!radii[2]) {
2632 if (!radii[1]) 2642 if (!radii[1])
2633 radii[1] = radii[0]; 2643 radii[1] = radii[0];
2634 radii[2] = radii[0]; 2644 radii[2] = radii[0];
2635 } 2645 }
2636 radii[3] = radii[1]; 2646 radii[3] = radii[1];
2637 } 2647 }
2638 2648
2639 // FIXME: This should be refactored with parseBorderRadius.
2640 // parseBorderRadius contains support for some legacy radius construction.
2641 PassRefPtrWillBeRawPtr<CSSBasicShapeInsetValue> CSSPropertyParser::parseInsetRou ndedCorners(PassRefPtrWillBeRawPtr<CSSBasicShapeInsetValue> shape, CSSParserValu eList* args)
2642 {
2643 CSSParserValue* argument = args->next();
2644
2645 if (!argument)
2646 return nullptr;
2647
2648 Vector<CSSParserValue*> radiusArguments;
2649 while (argument) {
2650 radiusArguments.append(argument);
2651 argument = args->next();
2652 }
2653
2654 unsigned num = radiusArguments.size();
2655 if (!num || num > 9)
2656 return nullptr;
2657
2658 // FIXME: Refactor completeBorderRadii and the array
2659 RefPtrWillBeRawPtr<CSSPrimitiveValue> radii[2][4];
2660 #if ENABLE(OILPAN)
2661 // Zero initialize the array of raw pointers.
2662 memset(&radii, 0, sizeof(radii));
2663 #endif
2664
2665 unsigned indexAfterSlash = 0;
2666 for (unsigned i = 0; i < num; ++i) {
2667 CSSParserValue* value = radiusArguments.at(i);
2668 if (value->m_unit == CSSParserValue::Operator) {
2669 if (value->iValue != '/')
2670 return nullptr;
2671
2672 if (!i || indexAfterSlash || i + 1 == num)
2673 return nullptr;
2674
2675 indexAfterSlash = i + 1;
2676 completeBorderRadii(radii[0]);
2677 continue;
2678 }
2679
2680 if (i - indexAfterSlash >= 4)
2681 return nullptr;
2682
2683 if (!validUnit(value, FLength | FPercent | FNonNeg))
2684 return nullptr;
2685
2686 RefPtrWillBeRawPtr<CSSPrimitiveValue> radius = createPrimitiveNumericVal ue(value);
2687
2688 if (!indexAfterSlash)
2689 radii[0][i] = radius;
2690 else
2691 radii[1][i - indexAfterSlash] = radius.release();
2692 }
2693
2694 if (!indexAfterSlash) {
2695 completeBorderRadii(radii[0]);
2696 for (unsigned i = 0; i < 4; ++i)
2697 radii[1][i] = radii[0][i];
2698 } else {
2699 completeBorderRadii(radii[1]);
2700 }
2701 shape->setTopLeftRadius(CSSValuePair::create(radii[0][0].release(), radii[1] [0].release(), CSSValuePair::DropIdenticalValues));
2702 shape->setTopRightRadius(CSSValuePair::create(radii[0][1].release(), radii[1 ][1].release(), CSSValuePair::DropIdenticalValues));
2703 shape->setBottomRightRadius(CSSValuePair::create(radii[0][2].release(), radi i[1][2].release(), CSSValuePair::DropIdenticalValues));
2704 shape->setBottomLeftRadius(CSSValuePair::create(radii[0][3].release(), radii [1][3].release(), CSSValuePair::DropIdenticalValues));
2705
2706 return shape;
2707 }
2708
2709 PassRefPtrWillBeRawPtr<CSSBasicShapeInsetValue> CSSPropertyParser::parseBasicSha peInset(CSSParserValueList* args) 2649 PassRefPtrWillBeRawPtr<CSSBasicShapeInsetValue> CSSPropertyParser::parseBasicSha peInset(CSSParserValueList* args)
2710 { 2650 {
2711 ASSERT(args); 2651 ASSERT(args);
2712 2652
2713 RefPtrWillBeRawPtr<CSSBasicShapeInsetValue> shape = CSSBasicShapeInsetValue: :create(); 2653 RefPtrWillBeRawPtr<CSSBasicShapeInsetValue> shape = CSSBasicShapeInsetValue: :create();
2714 2654
2715 CSSParserValue* argument = args->current(); 2655 CSSParserValue* argument = args->current();
2716 WillBeHeapVector<RefPtrWillBeMember<CSSPrimitiveValue>> widthArguments; 2656 WillBeHeapVector<RefPtrWillBeMember<CSSPrimitiveValue>> widthArguments;
2717 bool hasRoundedInset = false; 2657 bool hasRoundedInset = false;
2718 2658
2719 while (argument) { 2659 while (argument) {
2720 if (argument->m_unit == CSSParserValue::Identifier && argument->id == CS SValueRound) { 2660 if (argument->m_unit == CSSParserValue::Identifier && argument->id == CS SValueRound) {
2661 if (!args->next())
2662 return nullptr;
2721 hasRoundedInset = true; 2663 hasRoundedInset = true;
2722 break; 2664 break;
2723 } 2665 }
2724 2666
2725 Units unitFlags = FLength | FPercent; 2667 Units unitFlags = FLength | FPercent;
2726 if (!validUnit(argument, unitFlags) || widthArguments.size() > 4) 2668 if (!validUnit(argument, unitFlags) || widthArguments.size() > 4)
2727 return nullptr; 2669 return nullptr;
2728 2670
2729 widthArguments.append(createPrimitiveNumericValue(argument)); 2671 widthArguments.append(createPrimitiveNumericValue(argument));
2730 argument = args->next(); 2672 argument = args->next();
(...skipping 13 matching lines...) Expand all
2744 break; 2686 break;
2745 } 2687 }
2746 case 4: { 2688 case 4: {
2747 shape->updateShapeSize4Values(widthArguments[0].get(), widthArguments[1] .get(), widthArguments[2].get(), widthArguments[3].get()); 2689 shape->updateShapeSize4Values(widthArguments[0].get(), widthArguments[1] .get(), widthArguments[2].get(), widthArguments[3].get());
2748 break; 2690 break;
2749 } 2691 }
2750 default: 2692 default:
2751 return nullptr; 2693 return nullptr;
2752 } 2694 }
2753 2695
2754 if (hasRoundedInset) 2696 if (hasRoundedInset) {
2755 return parseInsetRoundedCorners(shape.release(), args); 2697 // FIXME: Refactor completeBorderRadii and the array
2698 RefPtrWillBeRawPtr<CSSPrimitiveValue> radii[4];
2699 RefPtrWillBeRawPtr<CSSPrimitiveValue> radii2[4];
2700 if (!parseRadii(radii, radii2, args))
2701 return nullptr;
2702 shape->setTopLeftRadius(CSSValuePair::create(radii[0].release(), radii2[ 0].release(), CSSValuePair::DropIdenticalValues));
2703 shape->setTopRightRadius(CSSValuePair::create(radii[1].release(), radii2 [1].release(), CSSValuePair::DropIdenticalValues));
2704 shape->setBottomRightRadius(CSSValuePair::create(radii[2].release(), rad ii2[2].release(), CSSValuePair::DropIdenticalValues));
2705 shape->setBottomLeftRadius(CSSValuePair::create(radii[3].release(), radi i2[3].release(), CSSValuePair::DropIdenticalValues));
2706 }
2707
2756 return shape.release(); 2708 return shape.release();
2757 } 2709 }
2758 2710
2759 static bool isContentDistributionKeyword(CSSValueID id) 2711 static bool isContentDistributionKeyword(CSSValueID id)
2760 { 2712 {
2761 return id == CSSValueSpaceBetween || id == CSSValueSpaceAround 2713 return id == CSSValueSpaceBetween || id == CSSValueSpaceAround
2762 || id == CSSValueSpaceEvenly || id == CSSValueStretch; 2714 || id == CSSValueSpaceEvenly || id == CSSValueStretch;
2763 } 2715 }
2764 2716
2765 static bool isContentPositionKeyword(CSSValueID id) 2717 static bool isContentPositionKeyword(CSSValueID id)
(...skipping 1094 matching lines...) Expand 10 before | Expand all | Expand 10 after
3860 bool CSSPropertyParser::parseBorderImageWidth(RefPtrWillBeRawPtr<CSSQuadValue>& result) 3812 bool CSSPropertyParser::parseBorderImageWidth(RefPtrWillBeRawPtr<CSSQuadValue>& result)
3861 { 3813 {
3862 return parseBorderImageQuad(FLength | FNumber | FNonNeg | FPercent, result); 3814 return parseBorderImageQuad(FLength | FNumber | FNonNeg | FPercent, result);
3863 } 3815 }
3864 3816
3865 bool CSSPropertyParser::parseBorderImageOutset(RefPtrWillBeRawPtr<CSSQuadValue>& result) 3817 bool CSSPropertyParser::parseBorderImageOutset(RefPtrWillBeRawPtr<CSSQuadValue>& result)
3866 { 3818 {
3867 return parseBorderImageQuad(FLength | FNumber | FNonNeg, result); 3819 return parseBorderImageQuad(FLength | FNumber | FNonNeg, result);
3868 } 3820 }
3869 3821
3870 bool CSSPropertyParser::parseBorderRadius(CSSPropertyID unresolvedProperty, bool important) 3822 bool CSSPropertyParser::parseRadii(RefPtrWillBeRawPtr<CSSPrimitiveValue> radii[4 ], RefPtrWillBeRawPtr<CSSPrimitiveValue> radii2[4], CSSParserValueList* args, CS SPropertyID unresolvedProperty)
3871 { 3823 {
3872 unsigned num = m_valueList->size(); 3824 CSSParserValue* value = args->current();
3873 if (num > 9) 3825 int i;
3874 return false; 3826 for (i = 0; i < 4 && value && value->m_unit != CSSParserValue::Operator;++i, value = args->next()) {
3875
3876 ShorthandScope scope(this, unresolvedProperty);
3877 RefPtrWillBeRawPtr<CSSPrimitiveValue> radii[2][4];
3878 #if ENABLE(OILPAN)
3879 // Zero initialize the array of raw pointers.
3880 memset(&radii, 0, sizeof(radii));
3881 #endif
3882
3883 unsigned indexAfterSlash = 0;
3884 for (unsigned i = 0; i < num; ++i) {
3885 CSSParserValue* value = m_valueList->valueAt(i);
3886 if (value->m_unit == CSSParserValue::Operator) {
3887 if (value->iValue != '/')
3888 return false;
3889
3890 if (!i || indexAfterSlash || i + 1 == num || num > i + 5)
3891 return false;
3892
3893 indexAfterSlash = i + 1;
3894 completeBorderRadii(radii[0]);
3895 continue;
3896 }
3897
3898 if (i - indexAfterSlash >= 4)
3899 return false;
3900
3901 if (!validUnit(value, FLength | FPercent | FNonNeg)) 3827 if (!validUnit(value, FLength | FPercent | FNonNeg))
3902 return false; 3828 return false;
3903 3829
3904 RefPtrWillBeRawPtr<CSSPrimitiveValue> radius = createPrimitiveNumericVal ue(value); 3830 radii[i] = createPrimitiveNumericValue(value);
3905
3906 if (!indexAfterSlash) {
3907 radii[0][i] = radius;
3908
3909 // Legacy syntax: -webkit-border-radius: l1 l2; is equivalent to bor der-radius: l1 / l2;
3910 if (num == 2 && unresolvedProperty == CSSPropertyAliasWebkitBorderRa dius) {
3911 indexAfterSlash = 1;
3912 completeBorderRadii(radii[0]);
3913 }
3914 } else
3915 radii[1][i - indexAfterSlash] = radius.release();
3916 } 3831 }
3917 3832
3918 if (!indexAfterSlash) { 3833 if (!i || (value && value->m_unit == CSSParserValue::Operator && value->iVal ue != '/'))
3919 completeBorderRadii(radii[0]); 3834 return false;
3835 // Legacy syntax: -webkit-border-radius: l1 l2; is equivalent to border-radi us: l1 / l2;
3836 if (!value && i == 2 && unresolvedProperty == CSSPropertyAliasWebkitBorderRa dius) {
3837 radii2[0] = radii[1];
3838 radii[1] = nullptr;
3839 completeBorderRadii(radii);
3840 completeBorderRadii(radii2);
3841 return true;
3842 }
3843 completeBorderRadii(radii);
3844 if (value) {
3845 value = args->next();
3846 for (i = 0; i < 4 && value && validUnit(value, FLength | FPercent | FNon Neg); ++i, value = args->next())
3847 radii2[i] = createPrimitiveNumericValue(value);
3848 if (!i || value)
3849 return false;
3850 completeBorderRadii(radii2);
3851 } else {
3920 for (unsigned i = 0; i < 4; ++i) 3852 for (unsigned i = 0; i < 4; ++i)
3921 radii[1][i] = radii[0][i]; 3853 radii2[i] = radii[i];
3922 } else 3854 }
3923 completeBorderRadii(radii[1]);
3924 3855
3925 ImplicitScope implicitScope(this);
3926 addProperty(CSSPropertyBorderTopLeftRadius, CSSValuePair::create(radii[0][0] .release(), radii[1][0].release(), CSSValuePair::DropIdenticalValues), important );
3927 addProperty(CSSPropertyBorderTopRightRadius, CSSValuePair::create(radii[0][1 ].release(), radii[1][1].release(), CSSValuePair::DropIdenticalValues), importan t);
3928 addProperty(CSSPropertyBorderBottomRightRadius, CSSValuePair::create(radii[0 ][2].release(), radii[1][2].release(), CSSValuePair::DropIdenticalValues), impor tant);
3929 addProperty(CSSPropertyBorderBottomLeftRadius, CSSValuePair::create(radii[0] [3].release(), radii[1][3].release(), CSSValuePair::DropIdenticalValues), import ant);
3930 return true; 3856 return true;
3931 } 3857 }
3932 3858
3933 // This should go away once we drop support for -webkit-gradient 3859 // This should go away once we drop support for -webkit-gradient
3934 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseDeprecatedGradientPoint(CS SParserValue* a, bool horizontal) 3860 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseDeprecatedGradientPoint(CS SParserValue* a, bool horizontal)
3935 { 3861 {
3936 RefPtrWillBeRawPtr<CSSPrimitiveValue> result = nullptr; 3862 RefPtrWillBeRawPtr<CSSPrimitiveValue> result = nullptr;
3937 if (a->m_unit == CSSParserValue::Identifier) { 3863 if (a->m_unit == CSSParserValue::Identifier) {
3938 if ((a->id == CSSValueLeft && horizontal) 3864 if ((a->id == CSSValueLeft && horizontal)
3939 || (a->id == CSSValueTop && !horizontal)) 3865 || (a->id == CSSValueTop && !horizontal))
(...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after
4761 ASSERT(!m_parsedCalculation); 4687 ASSERT(!m_parsedCalculation);
4762 m_parsedCalculation = CSSCalcValue::create(args, range); 4688 m_parsedCalculation = CSSCalcValue::create(args, range);
4763 4689
4764 if (!m_parsedCalculation) 4690 if (!m_parsedCalculation)
4765 return false; 4691 return false;
4766 4692
4767 return true; 4693 return true;
4768 } 4694 }
4769 4695
4770 } // namespace blink 4696 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698