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

Side by Side Diff: Source/core/css/CSSParser-in.cpp

Issue 18532004: Implement 'grid-template' parsing (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Same change, forgot to update css-properties-as-js-properties.html result Created 7 years, 5 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 | Annotate | Revision Log
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 20 matching lines...) Expand all
31 #include "RuntimeEnabledFeatures.h" 31 #include "RuntimeEnabledFeatures.h"
32 #include "core/css/CSSArrayFunctionValue.h" 32 #include "core/css/CSSArrayFunctionValue.h"
33 #include "core/css/CSSAspectRatioValue.h" 33 #include "core/css/CSSAspectRatioValue.h"
34 #include "core/css/CSSBasicShapes.h" 34 #include "core/css/CSSBasicShapes.h"
35 #include "core/css/CSSBorderImage.h" 35 #include "core/css/CSSBorderImage.h"
36 #include "core/css/CSSCanvasValue.h" 36 #include "core/css/CSSCanvasValue.h"
37 #include "core/css/CSSCrossfadeValue.h" 37 #include "core/css/CSSCrossfadeValue.h"
38 #include "core/css/CSSCursorImageValue.h" 38 #include "core/css/CSSCursorImageValue.h"
39 #include "core/css/CSSFontFaceSrcValue.h" 39 #include "core/css/CSSFontFaceSrcValue.h"
40 #include "core/css/CSSGradientValue.h" 40 #include "core/css/CSSGradientValue.h"
41 #include "core/css/CSSGridTemplateValue.h"
41 #include "core/css/CSSImageSetValue.h" 42 #include "core/css/CSSImageSetValue.h"
42 #include "core/css/CSSImageValue.h" 43 #include "core/css/CSSImageValue.h"
43 #include "core/css/CSSInheritedValue.h" 44 #include "core/css/CSSInheritedValue.h"
44 #include "core/css/CSSInitialValue.h" 45 #include "core/css/CSSInitialValue.h"
45 #include "core/css/CSSKeyframeRule.h" 46 #include "core/css/CSSKeyframeRule.h"
46 #include "core/css/CSSKeyframesRule.h" 47 #include "core/css/CSSKeyframesRule.h"
47 #include "core/css/CSSLineBoxContainValue.h" 48 #include "core/css/CSSLineBoxContainValue.h"
48 #include "core/css/CSSMixFunctionValue.h" 49 #include "core/css/CSSMixFunctionValue.h"
49 #include "core/css/CSSPrimitiveValue.h" 50 #include "core/css/CSSPrimitiveValue.h"
50 #include "core/css/CSSPropertySourceData.h" 51 #include "core/css/CSSPropertySourceData.h"
(...skipping 2399 matching lines...) Expand 10 before | Expand all | Expand 10 after
2450 parsedValue = parseGridPosition(); 2451 parsedValue = parseGridPosition();
2451 break; 2452 break;
2452 2453
2453 case CSSPropertyGridColumn: 2454 case CSSPropertyGridColumn:
2454 case CSSPropertyGridRow: 2455 case CSSPropertyGridRow:
2455 case CSSPropertyGridArea: 2456 case CSSPropertyGridArea:
2456 if (!RuntimeEnabledFeatures::cssGridLayoutEnabled()) 2457 if (!RuntimeEnabledFeatures::cssGridLayoutEnabled())
2457 return false; 2458 return false;
2458 return parseGridItemPositionShorthand(propId, important); 2459 return parseGridItemPositionShorthand(propId, important);
2459 2460
2461 case CSSPropertyGridTemplate:
2462 if (!RuntimeEnabledFeatures::cssGridLayoutEnabled())
2463 return false;
2464 parsedValue = parseGridTemplate();
2465 break;
2466
2460 case CSSPropertyWebkitMarginCollapse: { 2467 case CSSPropertyWebkitMarginCollapse: {
2461 if (num == 1) { 2468 if (num == 1) {
2462 ShorthandScope scope(this, CSSPropertyWebkitMarginCollapse); 2469 ShorthandScope scope(this, CSSPropertyWebkitMarginCollapse);
2463 if (!parseValue(webkitMarginCollapseShorthand().properties()[0], imp ortant)) 2470 if (!parseValue(webkitMarginCollapseShorthand().properties()[0], imp ortant))
2464 return false; 2471 return false;
2465 CSSValue* value = m_parsedProperties.last().value(); 2472 CSSValue* value = m_parsedProperties.last().value();
2466 addProperty(webkitMarginCollapseShorthand().properties()[1], value, important); 2473 addProperty(webkitMarginCollapseShorthand().properties()[1], value, important);
2467 return true; 2474 return true;
2468 } 2475 }
2469 else if (num == 2) { 2476 else if (num == 2) {
(...skipping 2250 matching lines...) Expand 10 before | Expand all | Expand 10 after
4720 4727
4721 return cssValuePool().createValue(flexValue, CSSPrimitiveValue::CSS_FR); 4728 return cssValuePool().createValue(flexValue, CSSPrimitiveValue::CSS_FR);
4722 } 4729 }
4723 4730
4724 if (!validUnit(currentValue, FLength | FPercent)) 4731 if (!validUnit(currentValue, FLength | FPercent))
4725 return 0; 4732 return 0;
4726 4733
4727 return createPrimitiveNumericValue(currentValue); 4734 return createPrimitiveNumericValue(currentValue);
4728 } 4735 }
4729 4736
4737 PassRefPtr<CSSValue> CSSParser::parseGridTemplate()
4738 {
4739 NamedGridAreaMap gridAreaMap;
4740 size_t rowCount = 0;
4741 size_t columnCount = 0;
4742
4743 while (CSSParserValue* currentValue = m_valueList->current()) {
4744 if (currentValue->unit != CSSPrimitiveValue::CSS_STRING)
4745 return 0;
4746
4747 String gridRowNames = currentValue->string;
4748 if (!gridRowNames.length())
4749 return 0;
4750
4751 Vector<String> columnNames;
4752 gridRowNames.split(' ', columnNames);
ojan 2013/07/29 23:03:28 Does the spec say what to do if there are multiple
Julien - ping for review 2013/07/30 18:43:33 Not explicitly (the grammar is <string>+). It woul
ojan 2013/07/30 18:53:48 Makes sense to me. We should make the spec explici
4753
4754 if (!columnCount) {
4755 columnCount = columnNames.size();
4756 ASSERT(columnCount);
4757 } else if (columnCount != columnNames.size()) {
4758 // The declaration is invalid is all the rows don't have the number of columns.
4759 return 0;
4760 }
4761
4762 for (size_t currentCol = 0; currentCol < columnCount; ++currentCol) {
4763 const String& gridAreaName = columnNames[currentCol];
4764
4765 // Unamed areas are always valid (we consider them to be 1x1).
4766 DEFINE_STATIC_LOCAL(String, unamedAreaPlaceholder, (ASCIILiteral("." )));
4767 if (gridAreaName == unamedAreaPlaceholder)
esprehn 2013/07/29 23:27:36 This is overly complex, just check if gridAreaName
Julien - ping for review 2013/07/30 18:43:33 I thought it would be more readable but apparently
4768 continue;
4769
4770 // We handle several grid areas with the same name at once to simpli fy the validation code.
4771 size_t lookAheadCol;
4772 for (lookAheadCol = currentCol; lookAheadCol < (columnCount - 1); ++ lookAheadCol) {
4773 if (columnNames[lookAheadCol + 1] != gridAreaName)
4774 break;
4775 }
4776
4777 NamedGridAreaMap::iterator gridAreaIt = gridAreaMap.find(gridAreaNam e);
4778 if (gridAreaIt == gridAreaMap.end()) {
4779 gridAreaMap.add(gridAreaName, GridCoordinate(GridSpan(rowCount, rowCount), GridSpan(currentCol, lookAheadCol)));
4780 } else {
4781 GridCoordinate& gridCoordinate = gridAreaIt->value;
4782
4783 // The following checks test that the grid area is a single fill ed-in rectangle.
4784 // 1. The new row is adjacent to the previously parsed row.
4785 if (rowCount != gridCoordinate.rows.initialPositionIndex + 1)
4786 return 0;
4787
4788 // 2. The new area starts at the same position as the previously parsed area.
4789 if (currentCol != gridCoordinate.columns.initialPositionIndex)
4790 return 0;
4791
4792 // 3. The new area ends at the same position as the previously p arsed area.
4793 if (lookAheadCol != gridCoordinate.columns.finalPositionIndex)
4794 return 0;
4795
4796 ++gridCoordinate.rows.finalPositionIndex;
4797 }
4798 currentCol = lookAheadCol;
4799 }
4800
4801 ++rowCount;
4802 m_valueList->next();
4803 }
4804
4805 if (!rowCount || !columnCount)
4806 return 0;
4807
4808 return CSSGridTemplateValue::create(gridAreaMap, rowCount, columnCount);
4809 }
4810
4730 PassRefPtr<CSSValue> CSSParser::parseCounterContent(CSSParserValueList* args, bo ol counters) 4811 PassRefPtr<CSSValue> CSSParser::parseCounterContent(CSSParserValueList* args, bo ol counters)
4731 { 4812 {
4732 unsigned numArgs = args->size(); 4813 unsigned numArgs = args->size();
4733 if (counters && numArgs != 3 && numArgs != 5) 4814 if (counters && numArgs != 3 && numArgs != 5)
4734 return 0; 4815 return 0;
4735 if (!counters && numArgs != 1 && numArgs != 3) 4816 if (!counters && numArgs != 1 && numArgs != 3)
4736 return 0; 4817 return 0;
4737 4818
4738 CSSParserValue* i = args->current(); 4819 CSSParserValue* i = args->current();
4739 if (i->unit != CSSPrimitiveValue::CSS_IDENT) 4820 if (i->unit != CSSPrimitiveValue::CSS_IDENT)
(...skipping 6981 matching lines...) Expand 10 before | Expand all | Expand 10 after
11721 { 11802 {
11722 // The tokenizer checks for the construct of an+b. 11803 // The tokenizer checks for the construct of an+b.
11723 // However, since the {ident} rule precedes the {nth} rule, some of those 11804 // However, since the {ident} rule precedes the {nth} rule, some of those
11724 // tokens are identified as string literal. Furthermore we need to accept 11805 // tokens are identified as string literal. Furthermore we need to accept
11725 // "odd" and "even" which does not match to an+b. 11806 // "odd" and "even" which does not match to an+b.
11726 return equalIgnoringCase(token, "odd") || equalIgnoringCase(token, "even") 11807 return equalIgnoringCase(token, "odd") || equalIgnoringCase(token, "even")
11727 || equalIgnoringCase(token, "n") || equalIgnoringCase(token, "-n"); 11808 || equalIgnoringCase(token, "n") || equalIgnoringCase(token, "-n");
11728 } 11809 }
11729 11810
11730 } 11811 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698