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

Side by Side Diff: Source/core/layout/style/GridResolvedPosition.cpp

Issue 1033943002: Rename LayoutStyle to papayawhip (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: ensureComputedStyle Created 5 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "config.h" 5 #include "config.h"
6 #include "core/layout/style/GridResolvedPosition.h" 6 #include "core/layout/style/GridResolvedPosition.h"
7 7
8 #include "core/layout/LayoutBox.h" 8 #include "core/layout/LayoutBox.h"
9 #include "core/layout/style/GridCoordinate.h" 9 #include "core/layout/style/GridCoordinate.h"
10 10
11 namespace blink { 11 namespace blink {
12 12
13 static const NamedGridLinesMap& gridLinesForSide(const LayoutStyle& style, GridP ositionSide side) 13 static const NamedGridLinesMap& gridLinesForSide(const ComputedStyle& style, Gri dPositionSide side)
14 { 14 {
15 return (side == ColumnStartSide || side == ColumnEndSide) ? style.namedGridC olumnLines() : style.namedGridRowLines(); 15 return (side == ColumnStartSide || side == ColumnEndSide) ? style.namedGridC olumnLines() : style.namedGridRowLines();
16 } 16 }
17 17
18 static inline String implicitNamedGridLineForSide(const String& lineName, GridPo sitionSide side) 18 static inline String implicitNamedGridLineForSide(const String& lineName, GridPo sitionSide side)
19 { 19 {
20 return lineName + ((side == ColumnStartSide || side == RowStartSide) ? "-sta rt" : "-end"); 20 return lineName + ((side == ColumnStartSide || side == RowStartSide) ? "-sta rt" : "-end");
21 } 21 }
22 22
23 static bool isValidNamedLineOrArea(const String& lineName, const LayoutStyle& st yle, GridPositionSide side) 23 static bool isValidNamedLineOrArea(const String& lineName, const ComputedStyle& style, GridPositionSide side)
24 { 24 {
25 const NamedGridLinesMap& gridLineNames = gridLinesForSide(style, side); 25 const NamedGridLinesMap& gridLineNames = gridLinesForSide(style, side);
26 26
27 return gridLineNames.contains(implicitNamedGridLineForSide(lineName, side)) || gridLineNames.contains(lineName); 27 return gridLineNames.contains(implicitNamedGridLineForSide(lineName, side)) || gridLineNames.contains(lineName);
28 } 28 }
29 29
30 static GridPositionSide calculateInitialPositionSide(GridTrackSizingDirection di rection) 30 static GridPositionSide calculateInitialPositionSide(GridTrackSizingDirection di rection)
31 { 31 {
32 return (direction == ForColumns) ? ColumnStartSide : RowStartSide; 32 return (direction == ForColumns) ? ColumnStartSide : RowStartSide;
33 } 33 }
34 34
35 static GridPositionSide calculateFinalPositionSide(GridTrackSizingDirection dire ction) 35 static GridPositionSide calculateFinalPositionSide(GridTrackSizingDirection dire ction)
36 { 36 {
37 return (direction == ForColumns) ? ColumnEndSide : RowEndSide; 37 return (direction == ForColumns) ? ColumnEndSide : RowEndSide;
38 } 38 }
39 39
40 void GridResolvedPosition::initialAndFinalPositionsFromStyle(const LayoutStyle& gridContainerStyle, const LayoutBox& gridItem, GridTrackSizingDirection directio n, GridPosition& initialPosition, GridPosition& finalPosition) 40 void GridResolvedPosition::initialAndFinalPositionsFromStyle(const ComputedStyle & gridContainerStyle, const LayoutBox& gridItem, GridTrackSizingDirection direct ion, GridPosition& initialPosition, GridPosition& finalPosition)
41 { 41 {
42 initialPosition = (direction == ForColumns) ? gridItem.style()->gridColumnSt art() : gridItem.style()->gridRowStart(); 42 initialPosition = (direction == ForColumns) ? gridItem.style()->gridColumnSt art() : gridItem.style()->gridRowStart();
43 finalPosition = (direction == ForColumns) ? gridItem.style()->gridColumnEnd( ) : gridItem.style()->gridRowEnd(); 43 finalPosition = (direction == ForColumns) ? gridItem.style()->gridColumnEnd( ) : gridItem.style()->gridRowEnd();
44 GridPositionSide initialPositionSide = calculateInitialPositionSide(directio n); 44 GridPositionSide initialPositionSide = calculateInitialPositionSide(directio n);
45 GridPositionSide finalPositionSide = calculateFinalPositionSide(direction); 45 GridPositionSide finalPositionSide = calculateFinalPositionSide(direction);
46 46
47 // We must handle the placement error handling code here instead of in the S tyleAdjuster because we don't want to 47 // We must handle the placement error handling code here instead of in the S tyleAdjuster because we don't want to
48 // overwrite the specified values. 48 // overwrite the specified values.
49 if (initialPosition.isSpan() && finalPosition.isSpan()) 49 if (initialPosition.isSpan() && finalPosition.isSpan())
50 finalPosition.setAutoPosition(); 50 finalPosition.setAutoPosition();
51 51
52 // Try to early detect the case of non existing named grid lines. This way w e could assume later that 52 // Try to early detect the case of non existing named grid lines. This way w e could assume later that
53 // GridResolvedPosition::resolveGrisPositionFromStyle() always return a vali d resolved position. 53 // GridResolvedPosition::resolveGrisPositionFromStyle() always return a vali d resolved position.
54 if (initialPosition.isNamedGridArea() && !isValidNamedLineOrArea(initialPosi tion.namedGridLine(), gridContainerStyle, initialPositionSide)) 54 if (initialPosition.isNamedGridArea() && !isValidNamedLineOrArea(initialPosi tion.namedGridLine(), gridContainerStyle, initialPositionSide))
55 initialPosition.setAutoPosition(); 55 initialPosition.setAutoPosition();
56 56
57 if (finalPosition.isNamedGridArea() && !isValidNamedLineOrArea(finalPosition .namedGridLine(), gridContainerStyle, finalPositionSide)) 57 if (finalPosition.isNamedGridArea() && !isValidNamedLineOrArea(finalPosition .namedGridLine(), gridContainerStyle, finalPositionSide))
58 finalPosition.setAutoPosition(); 58 finalPosition.setAutoPosition();
59 59
60 // If the grid item has an automatic position and a grid span for a named li ne in a given dimension, instead treat the grid span as one. 60 // If the grid item has an automatic position and a grid span for a named li ne in a given dimension, instead treat the grid span as one.
61 if (initialPosition.isAuto() && finalPosition.isSpan() && !finalPosition.nam edGridLine().isNull()) 61 if (initialPosition.isAuto() && finalPosition.isSpan() && !finalPosition.nam edGridLine().isNull())
62 finalPosition.setSpanPosition(1, String()); 62 finalPosition.setSpanPosition(1, String());
63 if (finalPosition.isAuto() && initialPosition.isSpan() && !initialPosition.n amedGridLine().isNull()) 63 if (finalPosition.isAuto() && initialPosition.isSpan() && !initialPosition.n amedGridLine().isNull())
64 initialPosition.setSpanPosition(1, String()); 64 initialPosition.setSpanPosition(1, String());
65 } 65 }
66 66
67 GridSpan GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(con st LayoutStyle& gridContainerStyle, const LayoutBox& gridItem, GridTrackSizingDi rection direction, const GridResolvedPosition& resolvedInitialPosition) 67 GridSpan GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(con st ComputedStyle& gridContainerStyle, const LayoutBox& gridItem, GridTrackSizing Direction direction, const GridResolvedPosition& resolvedInitialPosition)
68 { 68 {
69 GridPosition initialPosition, finalPosition; 69 GridPosition initialPosition, finalPosition;
70 initialAndFinalPositionsFromStyle(gridContainerStyle, gridItem, direction, i nitialPosition, finalPosition); 70 initialAndFinalPositionsFromStyle(gridContainerStyle, gridItem, direction, i nitialPosition, finalPosition);
71 71
72 GridPositionSide finalPositionSide = calculateFinalPositionSide(direction); 72 GridPositionSide finalPositionSide = calculateFinalPositionSide(direction);
73 73
74 // This method will only be used when both positions need to be resolved aga inst the opposite one. 74 // This method will only be used when both positions need to be resolved aga inst the opposite one.
75 ASSERT(initialPosition.shouldBeResolvedAgainstOppositePosition() && finalPos ition.shouldBeResolvedAgainstOppositePosition()); 75 ASSERT(initialPosition.shouldBeResolvedAgainstOppositePosition() && finalPos ition.shouldBeResolvedAgainstOppositePosition());
76 76
77 GridResolvedPosition resolvedFinalPosition = resolvedInitialPosition; 77 GridResolvedPosition resolvedFinalPosition = resolvedInitialPosition;
78 78
79 if (initialPosition.isSpan()) 79 if (initialPosition.isSpan())
80 return *resolveGridPositionAgainstOppositePosition(gridContainerStyle, r esolvedInitialPosition, initialPosition, finalPositionSide); 80 return *resolveGridPositionAgainstOppositePosition(gridContainerStyle, r esolvedInitialPosition, initialPosition, finalPositionSide);
81 if (finalPosition.isSpan()) 81 if (finalPosition.isSpan())
82 return *resolveGridPositionAgainstOppositePosition(gridContainerStyle, r esolvedInitialPosition, finalPosition, finalPositionSide); 82 return *resolveGridPositionAgainstOppositePosition(gridContainerStyle, r esolvedInitialPosition, finalPosition, finalPositionSide);
83 83
84 return GridSpan(resolvedInitialPosition, resolvedFinalPosition); 84 return GridSpan(resolvedInitialPosition, resolvedFinalPosition);
85 } 85 }
86 86
87 PassOwnPtr<GridSpan> GridResolvedPosition::resolveGridPositionsFromStyle(const L ayoutStyle& gridContainerStyle, const LayoutBox& gridItem, GridTrackSizingDirect ion direction) 87 PassOwnPtr<GridSpan> GridResolvedPosition::resolveGridPositionsFromStyle(const C omputedStyle& gridContainerStyle, const LayoutBox& gridItem, GridTrackSizingDire ction direction)
88 { 88 {
89 GridPosition initialPosition, finalPosition; 89 GridPosition initialPosition, finalPosition;
90 initialAndFinalPositionsFromStyle(gridContainerStyle, gridItem, direction, i nitialPosition, finalPosition); 90 initialAndFinalPositionsFromStyle(gridContainerStyle, gridItem, direction, i nitialPosition, finalPosition);
91 91
92 GridPositionSide initialPositionSide = calculateInitialPositionSide(directio n); 92 GridPositionSide initialPositionSide = calculateInitialPositionSide(directio n);
93 GridPositionSide finalPositionSide = calculateFinalPositionSide(direction); 93 GridPositionSide finalPositionSide = calculateFinalPositionSide(direction);
94 94
95 if (initialPosition.shouldBeResolvedAgainstOppositePosition() && finalPositi on.shouldBeResolvedAgainstOppositePosition()) { 95 if (initialPosition.shouldBeResolvedAgainstOppositePosition() && finalPositi on.shouldBeResolvedAgainstOppositePosition()) {
96 // We can't get our grid positions without running the auto placement al gorithm. 96 // We can't get our grid positions without running the auto placement al gorithm.
97 return nullptr; 97 return nullptr;
(...skipping 14 matching lines...) Expand all
112 GridResolvedPosition resolvedInitialPosition = resolveGridPositionFromStyle( gridContainerStyle, initialPosition, initialPositionSide); 112 GridResolvedPosition resolvedInitialPosition = resolveGridPositionFromStyle( gridContainerStyle, initialPosition, initialPositionSide);
113 GridResolvedPosition resolvedFinalPosition = resolveGridPositionFromStyle(gr idContainerStyle, finalPosition, finalPositionSide); 113 GridResolvedPosition resolvedFinalPosition = resolveGridPositionFromStyle(gr idContainerStyle, finalPosition, finalPositionSide);
114 114
115 // If 'grid-after' specifies a line at or before that specified by 'grid-bef ore', it computes to 'span 1'. 115 // If 'grid-after' specifies a line at or before that specified by 'grid-bef ore', it computes to 'span 1'.
116 if (resolvedFinalPosition < resolvedInitialPosition) 116 if (resolvedFinalPosition < resolvedInitialPosition)
117 resolvedFinalPosition = resolvedInitialPosition; 117 resolvedFinalPosition = resolvedInitialPosition;
118 118
119 return adoptPtr(new GridSpan(resolvedInitialPosition, resolvedFinalPosition) ); 119 return adoptPtr(new GridSpan(resolvedInitialPosition, resolvedFinalPosition) );
120 } 120 }
121 121
122 size_t GridResolvedPosition::explicitGridColumnCount(const LayoutStyle& gridCont ainerStyle) 122 size_t GridResolvedPosition::explicitGridColumnCount(const ComputedStyle& gridCo ntainerStyle)
123 { 123 {
124 return std::min(gridContainerStyle.gridTemplateColumns().size(), kGridMaxTra cks); 124 return std::min(gridContainerStyle.gridTemplateColumns().size(), kGridMaxTra cks);
125 } 125 }
126 126
127 size_t GridResolvedPosition::explicitGridRowCount(const LayoutStyle& gridContain erStyle) 127 size_t GridResolvedPosition::explicitGridRowCount(const ComputedStyle& gridConta inerStyle)
128 { 128 {
129 return std::min(gridContainerStyle.gridTemplateRows().size(), kGridMaxTracks ); 129 return std::min(gridContainerStyle.gridTemplateRows().size(), kGridMaxTracks );
130 } 130 }
131 131
132 size_t GridResolvedPosition::explicitGridSizeForSide(const LayoutStyle& gridCont ainerStyle, GridPositionSide side) 132 size_t GridResolvedPosition::explicitGridSizeForSide(const ComputedStyle& gridCo ntainerStyle, GridPositionSide side)
133 { 133 {
134 return (side == ColumnStartSide || side == ColumnEndSide) ? explicitGridColu mnCount(gridContainerStyle) : explicitGridRowCount(gridContainerStyle); 134 return (side == ColumnStartSide || side == ColumnEndSide) ? explicitGridColu mnCount(gridContainerStyle) : explicitGridRowCount(gridContainerStyle);
135 } 135 }
136 136
137 GridResolvedPosition GridResolvedPosition::resolveNamedGridLinePositionFromStyle (const LayoutStyle& gridContainerStyle, const GridPosition& position, GridPositi onSide side) 137 GridResolvedPosition GridResolvedPosition::resolveNamedGridLinePositionFromStyle (const ComputedStyle& gridContainerStyle, const GridPosition& position, GridPosi tionSide side)
138 { 138 {
139 ASSERT(!position.namedGridLine().isNull()); 139 ASSERT(!position.namedGridLine().isNull());
140 140
141 const NamedGridLinesMap& gridLinesNames = gridLinesForSide(gridContainerStyl e, side); 141 const NamedGridLinesMap& gridLinesNames = gridLinesForSide(gridContainerStyl e, side);
142 NamedGridLinesMap::const_iterator it = gridLinesNames.find(position.namedGri dLine()); 142 NamedGridLinesMap::const_iterator it = gridLinesNames.find(position.namedGri dLine());
143 if (it == gridLinesNames.end()) { 143 if (it == gridLinesNames.end()) {
144 if (position.isPositive()) 144 if (position.isPositive())
145 return GridResolvedPosition(0); 145 return GridResolvedPosition(0);
146 const size_t lastLine = explicitGridSizeForSide(gridContainerStyle, side ); 146 const size_t lastLine = explicitGridSizeForSide(gridContainerStyle, side );
147 return adjustGridPositionForSide(lastLine, side); 147 return adjustGridPositionForSide(lastLine, side);
148 } 148 }
149 149
150 size_t namedGridLineIndex; 150 size_t namedGridLineIndex;
151 if (position.isPositive()) 151 if (position.isPositive())
152 namedGridLineIndex = std::min<size_t>(position.integerPosition(), it->va lue.size()) - 1; 152 namedGridLineIndex = std::min<size_t>(position.integerPosition(), it->va lue.size()) - 1;
153 else 153 else
154 namedGridLineIndex = std::max<int>(it->value.size() - abs(position.integ erPosition()), 0); 154 namedGridLineIndex = std::max<int>(it->value.size() - abs(position.integ erPosition()), 0);
155 return adjustGridPositionForSide(it->value[namedGridLineIndex], side); 155 return adjustGridPositionForSide(it->value[namedGridLineIndex], side);
156 } 156 }
157 157
158 GridResolvedPosition GridResolvedPosition::resolveGridPositionFromStyle(const La youtStyle& gridContainerStyle, const GridPosition& position, GridPositionSide si de) 158 GridResolvedPosition GridResolvedPosition::resolveGridPositionFromStyle(const Co mputedStyle& gridContainerStyle, const GridPosition& position, GridPositionSide side)
159 { 159 {
160 switch (position.type()) { 160 switch (position.type()) {
161 case ExplicitPosition: { 161 case ExplicitPosition: {
162 ASSERT(position.integerPosition()); 162 ASSERT(position.integerPosition());
163 163
164 if (!position.namedGridLine().isNull()) 164 if (!position.namedGridLine().isNull())
165 return resolveNamedGridLinePositionFromStyle(gridContainerStyle, pos ition, side); 165 return resolveNamedGridLinePositionFromStyle(gridContainerStyle, pos ition, side);
166 166
167 // Handle <integer> explicit position. 167 // Handle <integer> explicit position.
168 if (position.isPositive()) 168 if (position.isPositive())
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 case AutoPosition: 205 case AutoPosition:
206 case SpanPosition: 206 case SpanPosition:
207 // 'auto' and span depend on the opposite position for resolution (e.g. grid-row: auto / 1 or grid-column: span 3 / "myHeader"). 207 // 'auto' and span depend on the opposite position for resolution (e.g. grid-row: auto / 1 or grid-column: span 3 / "myHeader").
208 ASSERT_NOT_REACHED(); 208 ASSERT_NOT_REACHED();
209 return GridResolvedPosition(0); 209 return GridResolvedPosition(0);
210 } 210 }
211 ASSERT_NOT_REACHED(); 211 ASSERT_NOT_REACHED();
212 return GridResolvedPosition(0); 212 return GridResolvedPosition(0);
213 } 213 }
214 214
215 PassOwnPtr<GridSpan> GridResolvedPosition::resolveGridPositionAgainstOppositePos ition(const LayoutStyle& gridContainerStyle, const GridResolvedPosition& resolve dOppositePosition, const GridPosition& position, GridPositionSide side) 215 PassOwnPtr<GridSpan> GridResolvedPosition::resolveGridPositionAgainstOppositePos ition(const ComputedStyle& gridContainerStyle, const GridResolvedPosition& resol vedOppositePosition, const GridPosition& position, GridPositionSide side)
216 { 216 {
217 if (position.isAuto()) 217 if (position.isAuto())
218 return GridSpan::create(resolvedOppositePosition, resolvedOppositePositi on); 218 return GridSpan::create(resolvedOppositePosition, resolvedOppositePositi on);
219 219
220 ASSERT(position.isSpan()); 220 ASSERT(position.isSpan());
221 ASSERT(position.spanPosition() > 0); 221 ASSERT(position.spanPosition() > 0);
222 222
223 if (!position.namedGridLine().isNull()) { 223 if (!position.namedGridLine().isNull()) {
224 // span 2 'c' -> we need to find the appropriate grid line before / afte r our opposite position. 224 // span 2 'c' -> we need to find the appropriate grid line before / afte r our opposite position.
225 return resolveNamedGridLinePositionAgainstOppositePosition(gridContainer Style, resolvedOppositePosition, position, side); 225 return resolveNamedGridLinePositionAgainstOppositePosition(gridContainer Style, resolvedOppositePosition, position, side);
226 } 226 }
227 227
228 return GridSpan::createWithSpanAgainstOpposite(resolvedOppositePosition, pos ition, side); 228 return GridSpan::createWithSpanAgainstOpposite(resolvedOppositePosition, pos ition, side);
229 } 229 }
230 230
231 PassOwnPtr<GridSpan> GridResolvedPosition::resolveNamedGridLinePositionAgainstOp positePosition(const LayoutStyle& gridContainerStyle, const GridResolvedPosition & resolvedOppositePosition, const GridPosition& position, GridPositionSide side) 231 PassOwnPtr<GridSpan> GridResolvedPosition::resolveNamedGridLinePositionAgainstOp positePosition(const ComputedStyle& gridContainerStyle, const GridResolvedPositi on& resolvedOppositePosition, const GridPosition& position, GridPositionSide sid e)
232 { 232 {
233 ASSERT(position.isSpan()); 233 ASSERT(position.isSpan());
234 ASSERT(!position.namedGridLine().isNull()); 234 ASSERT(!position.namedGridLine().isNull());
235 // Negative positions are not allowed per the specification and should have been handled during parsing. 235 // Negative positions are not allowed per the specification and should have been handled during parsing.
236 ASSERT(position.spanPosition() > 0); 236 ASSERT(position.spanPosition() > 0);
237 237
238 const NamedGridLinesMap& gridLinesNames = gridLinesForSide(gridContainerStyl e, side); 238 const NamedGridLinesMap& gridLinesNames = gridLinesForSide(gridContainerStyl e, side);
239 NamedGridLinesMap::const_iterator it = gridLinesNames.find(position.namedGri dLine()); 239 NamedGridLinesMap::const_iterator it = gridLinesNames.find(position.namedGri dLine());
240 240
241 // If there is no named grid line of that name, we resolve the position to ' auto' (which is equivalent to 'span 1' in this case). 241 // If there is no named grid line of that name, we resolve the position to ' auto' (which is equivalent to 'span 1' in this case).
242 // See http://lists.w3.org/Archives/Public/www-style/2013Jun/0394.html. 242 // See http://lists.w3.org/Archives/Public/www-style/2013Jun/0394.html.
243 if (it == gridLinesNames.end()) 243 if (it == gridLinesNames.end())
244 return GridSpan::create(resolvedOppositePosition, resolvedOppositePositi on); 244 return GridSpan::create(resolvedOppositePosition, resolvedOppositePositi on);
245 245
246 return GridSpan::createWithNamedSpanAgainstOpposite(resolvedOppositePosition , position, side, it->value); 246 return GridSpan::createWithNamedSpanAgainstOpposite(resolvedOppositePosition , position, side, it->value);
247 } 247 }
248 248
249 } // namespace blink 249 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/layout/style/GridResolvedPosition.h ('k') | Source/core/layout/style/KeyframeList.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698