Modified: trunk/Source/WebCore/ChangeLog (145761 => 145762)
--- trunk/Source/WebCore/ChangeLog 2013-03-13 22:24:08 UTC (rev 145761)
+++ trunk/Source/WebCore/ChangeLog 2013-03-13 22:28:10 UTC (rev 145762)
@@ -1,3 +1,41 @@
+2013-03-13 Julien Chaffraix <[email protected]>
+
+ [CSS Grid Layout] Refactor GridCoordinate to hold GridSpans
+ https://bugs.webkit.org/show_bug.cgi?id=112211
+
+ Reviewed by Tony Chang.
+
+ In order to bring more spanning knowledge to RenderGrid without having
+ duplicated GridSpan resolution, it became needed to store them into
+ GridCoordinate. Note that this change is needed as we can only resolve
+ all the positions with enough context in one place: when we place the
+ item in the grid.
+
+ Refactoring, no change in behavior expected.
+
+ * rendering/RenderGrid.cpp:
+ (WebCore::RenderGrid::GridIterator::nextEmptyGridArea):
+ Updated to create 2 GridSpans. Also fixed a style violation (PassOwnPtr
+ as local member, not sure why it wasn't caught earlier).
+
+ (WebCore::RenderGrid::placeItemsOnGrid):
+ (WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid):
+ (WebCore::RenderGrid::placeAutoMajorAxisItemOnGrid):
+ (WebCore::RenderGrid::gridAreaBreadthForChild):
+ (WebCore::RenderGrid::findChildLogicalPosition):
+ Updated the original function after GridCoordinate internal representation change.
+
+ (WebCore::RenderGrid::insertItemIntoGrid):
+ Ditto. Also added a new overloaded function that does resolution after auto-placement.
+
+ (WebCore::RenderGrid::resolveGridPositionsFromAutoPlacementPosition):
+ Removed the extra GridSpan computation, which was wrong.
+
+ * rendering/RenderGrid.h:
+ (WebCore::RenderGrid::GridCoordinate::GridCoordinate):
+ Updated GridCoordinate to hold 2 GridSpan. Also removed the 2 position
+ constructor (it would have been a hazard), replaced by a 2 GridSpan constructor.
+
2013-03-13 Jochen Eisinger <[email protected]>
Also don't log error messages from the GraphicsContext3D if webGLErrorsToConsoleEnabled is false
Modified: trunk/Source/WebCore/rendering/RenderGrid.cpp (145761 => 145762)
--- trunk/Source/WebCore/rendering/RenderGrid.cpp 2013-03-13 22:24:08 UTC (rev 145761)
+++ trunk/Source/WebCore/rendering/RenderGrid.cpp 2013-03-13 22:28:10 UTC (rev 145762)
@@ -109,10 +109,10 @@
for (; varyingTrackIndex < endOfVaryingTrackIndex; ++varyingTrackIndex) {
const Vector<RenderBox*>& children = m_grid[m_rowIndex][m_columnIndex];
if (children.isEmpty()) {
- PassOwnPtr<GridCoordinate> result = adoptPtr(new GridCoordinate(m_rowIndex, m_columnIndex));
+ OwnPtr<GridCoordinate> result = adoptPtr(new GridCoordinate(GridSpan(m_rowIndex, m_rowIndex), GridSpan(m_columnIndex, m_columnIndex)));
// Advance the iterator to avoid an infinite loop where we would return the same grid area over and over.
++varyingTrackIndex;
- return result;
+ return result.release();
}
}
return nullptr;
@@ -514,10 +514,17 @@
}
}
+void RenderGrid::insertItemIntoGrid(RenderBox* child, const GridCoordinate& coordinate)
+{
+ m_grid[coordinate.rows.initialPositionIndex][coordinate.columns.initialPositionIndex].append(child);
+ m_gridItemCoordinate.set(child, coordinate);
+}
+
void RenderGrid::insertItemIntoGrid(RenderBox* child, size_t rowTrack, size_t columnTrack)
{
- m_grid[rowTrack][columnTrack].append(child);
- m_gridItemCoordinate.set(child, GridCoordinate(rowTrack, columnTrack));
+ const GridSpan& rowSpan = resolveGridPositionsFromAutoPlacementPosition(child, ForRows, rowTrack);
+ const GridSpan& columnSpan = resolveGridPositionsFromAutoPlacementPosition(child, ForColumns, columnTrack);
+ insertItemIntoGrid(child, GridCoordinate(rowSpan, columnSpan));
}
void RenderGrid::placeItemsOnGrid()
@@ -546,7 +553,7 @@
specifiedMajorAxisAutoGridItems.append(child);
continue;
}
- insertItemIntoGrid(child, rowPositions->initialPositionIndex, columnPositions->initialPositionIndex);
+ insertItemIntoGrid(child, GridCoordinate(*rowPositions, *columnPositions));
}
ASSERT(gridRowCount() >= style()->gridRows().size());
@@ -569,14 +576,14 @@
OwnPtr<GridSpan> majorAxisPositions = resolveGridPositionsFromStyle(autoGridItems[i], autoPlacementMajorAxisDirection());
GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisPositions->initialPositionIndex);
if (OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea()) {
- insertItemIntoGrid(autoGridItems[i], emptyGridArea->rowIndex, emptyGridArea->columnIndex);
+ insertItemIntoGrid(autoGridItems[i], emptyGridArea->rows.initialPositionIndex, emptyGridArea->columns.initialPositionIndex);
continue;
}
growGrid(autoPlacementMinorAxisDirection());
OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea();
ASSERT(emptyGridArea);
- insertItemIntoGrid(autoGridItems[i], emptyGridArea->rowIndex, emptyGridArea->columnIndex);
+ insertItemIntoGrid(autoGridItems[i], emptyGridArea->rows.initialPositionIndex, emptyGridArea->columns.initialPositionIndex);
}
}
@@ -595,7 +602,7 @@
minorAxisIndex = minorAxisPositions->initialPositionIndex;
GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), minorAxisIndex);
if (OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea()) {
- insertItemIntoGrid(gridItem, emptyGridArea->rowIndex, emptyGridArea->columnIndex);
+ insertItemIntoGrid(gridItem, emptyGridArea->rows.initialPositionIndex, emptyGridArea->columns.initialPositionIndex);
return;
}
} else {
@@ -603,7 +610,7 @@
for (size_t majorAxisIndex = 0; majorAxisIndex < endOfMajorAxis; ++majorAxisIndex) {
GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisIndex);
if (OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea()) {
- insertItemIntoGrid(gridItem, emptyGridArea->rowIndex, emptyGridArea->columnIndex);
+ insertItemIntoGrid(gridItem, emptyGridArea->rows.initialPositionIndex, emptyGridArea->columns.initialPositionIndex);
return;
}
}
@@ -689,6 +696,13 @@
return m_gridItemCoordinate.get(gridItem);
}
+RenderGrid::GridSpan RenderGrid::resolveGridPositionsFromAutoPlacementPosition(const RenderBox*, TrackSizingDirection, size_t initialPosition) const
+{
+ // FIXME: We don't support spanning with auto positions yet. Once we do, this is wrong. Also we should make
+ // sure the grid can accomodate the new item as we only grow 1 position in a given direction.
+ return GridSpan(initialPosition, initialPosition);
+}
+
PassOwnPtr<RenderGrid::GridSpan> RenderGrid::resolveGridPositionsFromStyle(const RenderBox* gridItem, TrackSizingDirection direction) const
{
ASSERT(gridWasPopulated());
@@ -750,16 +764,9 @@
LayoutUnit RenderGrid::gridAreaBreadthForChild(const RenderBox* child, TrackSizingDirection direction, const Vector<GridTrack>& tracks) const
{
const GridCoordinate& coordinate = cachedGridCoordinate(child);
- size_t trackIndex = (direction == ForColumns) ? coordinate.columnIndex : coordinate.rowIndex;
- OwnPtr<GridSpan> span = resolveGridPositionsFromStyle(child, direction);
- if (!span) {
- // FIXME: We don't support spanning with auto positions yet. Once we do, this is wrong.
- span = adoptPtr(new GridSpan(trackIndex, trackIndex));
- }
-
- ASSERT(span->initialPositionIndex == trackIndex);
+ const GridSpan& span = (direction == ForColumns) ? coordinate.columns : coordinate.rows;
LayoutUnit gridAreaBreadth = 0;
- for (; trackIndex <= span->finalPositionIndex; ++trackIndex)
+ for (size_t trackIndex = span.initialPositionIndex; trackIndex <= span.finalPositionIndex; ++trackIndex)
gridAreaBreadth += tracks[trackIndex].m_usedBreadth;
return gridAreaBreadth;
}
@@ -770,9 +777,9 @@
LayoutPoint offset;
// FIXME: |columnTrack| and |rowTrack| should be smaller than our column / row count.
- for (size_t i = 0; i < coordinate.columnIndex && i < columnTracks.size(); ++i)
+ for (size_t i = 0; i < coordinate.columns.initialPositionIndex && i < columnTracks.size(); ++i)
offset.setX(offset.x() + columnTracks[i].m_usedBreadth);
- for (size_t i = 0; i < coordinate.rowIndex && i < rowTracks.size(); ++i)
+ for (size_t i = 0; i < coordinate.rows.initialPositionIndex && i < rowTracks.size(); ++i)
offset.setY(offset.y() + rowTracks[i].m_usedBreadth);
// FIXME: Handle margins on the grid item.
Modified: trunk/Source/WebCore/rendering/RenderGrid.h (145761 => 145762)
--- trunk/Source/WebCore/rendering/RenderGrid.h 2013-03-13 22:24:08 UTC (rev 145761)
+++ trunk/Source/WebCore/rendering/RenderGrid.h 2013-03-13 22:28:10 UTC (rev 145762)
@@ -51,24 +51,6 @@
LayoutUnit computePreferredTrackWidth(const Length&, size_t) const;
- struct GridCoordinate {
- // HashMap requires a default constuctor.
- GridCoordinate()
- : columnIndex(0)
- , rowIndex(0)
- {
- }
-
- GridCoordinate(size_t row, size_t column)
- : columnIndex(column)
- , rowIndex(row)
- {
- }
-
- size_t columnIndex;
- size_t rowIndex;
- };
-
struct GridSpan {
GridSpan(size_t initialPosition, size_t finalPosition)
: initialPositionIndex(initialPosition)
@@ -81,6 +63,24 @@
size_t finalPositionIndex;
};
+ struct GridCoordinate {
+ // HashMap requires a default constuctor.
+ GridCoordinate()
+ : columns(0, 0)
+ , rows(0, 0)
+ {
+ }
+
+ GridCoordinate(const GridSpan& r, const GridSpan& c)
+ : columns(c)
+ , rows(r)
+ {
+ }
+
+ GridSpan columns;
+ GridSpan rows;
+ };
+
class GridIterator;
enum TrackSizingDirection { ForColumns, ForRows };
void computedUsedBreadthOfGridTracks(TrackSizingDirection, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks);
@@ -91,6 +91,7 @@
void growGrid(TrackSizingDirection);
void insertItemIntoGrid(RenderBox*, size_t rowTrack, size_t columnTrack);
+ void insertItemIntoGrid(RenderBox*, const GridCoordinate&);
void placeItemsOnGrid();
void placeSpecifiedMajorAxisItemsOnGrid(Vector<RenderBox*>);
void placeAutoMajorAxisItemsOnGrid(Vector<RenderBox*>);
@@ -116,6 +117,7 @@
LayoutPoint findChildLogicalPosition(RenderBox*, const Vector<GridTrack>& columnTracks, const Vector<GridTrack>& rowTracks);
GridCoordinate cachedGridCoordinate(const RenderBox*) const;
+ GridSpan resolveGridPositionsFromAutoPlacementPosition(const RenderBox*, TrackSizingDirection, size_t) const;
PassOwnPtr<GridSpan> resolveGridPositionsFromStyle(const RenderBox*, TrackSizingDirection) const;
enum GridPositionSide {
StartSide,