| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2011 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 { | 233 { |
| 234 ASSERT(!childrenInline()); | 234 ASSERT(!childrenInline()); |
| 235 } | 235 } |
| 236 | 236 |
| 237 RenderGrid::~RenderGrid() | 237 RenderGrid::~RenderGrid() |
| 238 { | 238 { |
| 239 } | 239 } |
| 240 | 240 |
| 241 void RenderGrid::addChild(RenderObject* newChild, RenderObject* beforeChild) | 241 void RenderGrid::addChild(RenderObject* newChild, RenderObject* beforeChild) |
| 242 { | 242 { |
| 243 // If the new requested beforeChild is not one of our children is because it
's wrapped by an anonymous container. If | |
| 244 // we do not special case this situation we could end up calling addChild()
twice for the newChild, one with the | |
| 245 // initial beforeChild and another one with its parent. | |
| 246 if (beforeChild && beforeChild->parent() != this) { | |
| 247 ASSERT(beforeChild->parent()->isAnonymous()); | |
| 248 beforeChild = splitAnonymousBoxesAroundChild(beforeChild); | |
| 249 dirtyGrid(); | |
| 250 } | |
| 251 | |
| 252 RenderBlock::addChild(newChild, beforeChild); | 243 RenderBlock::addChild(newChild, beforeChild); |
| 253 | 244 |
| 254 if (gridIsDirty()) | 245 if (gridIsDirty()) |
| 255 return; | 246 return; |
| 256 | 247 |
| 257 if (!newChild->isBox()) { | 248 // The grid needs to be recomputed as it might contain auto-placed items tha
t will change their position. |
| 258 dirtyGrid(); | 249 dirtyGrid(); |
| 259 return; | 250 return; |
| 260 } | |
| 261 | |
| 262 // Positioned items shouldn't take up space or otherwise participate in the
layout of the grid. | |
| 263 if (newChild->isOutOfFlowPositioned()) | |
| 264 return; | |
| 265 | |
| 266 // If the new child has been inserted inside an existent anonymous block, we
can simply ignore it as the anonymous | |
| 267 // block is an already known grid item. | |
| 268 if (newChild->parent() != this) | |
| 269 return; | |
| 270 | |
| 271 // FIXME: Implement properly "stack" value in auto-placement algorithm. | |
| 272 if (!style()->isGridAutoFlowAlgorithmStack()) { | |
| 273 // The grid needs to be recomputed as it might contain auto-placed items
that will change their position. | |
| 274 dirtyGrid(); | |
| 275 return; | |
| 276 } | |
| 277 | |
| 278 RenderBox* newChildBox = toRenderBox(newChild); | |
| 279 OwnPtr<GridSpan> rowPositions = GridResolvedPosition::resolveGridPositionsFr
omStyle(*style(), *newChildBox, ForRows); | |
| 280 OwnPtr<GridSpan> columnPositions = GridResolvedPosition::resolveGridPosition
sFromStyle(*style(), *newChildBox, ForColumns); | |
| 281 if (!rowPositions || !columnPositions) { | |
| 282 // The new child requires the auto-placement algorithm to run so we need
to recompute the grid fully. | |
| 283 dirtyGrid(); | |
| 284 return; | |
| 285 } else { | |
| 286 insertItemIntoGrid(*newChildBox, GridCoordinate(*rowPositions, *columnPo
sitions)); | |
| 287 addChildToIndexesMap(*newChildBox); | |
| 288 } | |
| 289 } | |
| 290 | |
| 291 void RenderGrid::addChildToIndexesMap(RenderBox& child) | |
| 292 { | |
| 293 ASSERT(!m_gridItemsIndexesMap.contains(&child)); | |
| 294 RenderBox* sibling = child.nextInFlowSiblingBox(); | |
| 295 bool lastSibling = !sibling; | |
| 296 | |
| 297 if (lastSibling) | |
| 298 sibling = child.previousInFlowSiblingBox(); | |
| 299 | |
| 300 size_t index = 0; | |
| 301 if (sibling) | |
| 302 index = lastSibling ? m_gridItemsIndexesMap.get(sibling) + 1 : m_gridIte
msIndexesMap.get(sibling); | |
| 303 | |
| 304 if (sibling && !lastSibling) { | |
| 305 for (; sibling; sibling = sibling->nextInFlowSiblingBox()) | |
| 306 m_gridItemsIndexesMap.set(sibling, m_gridItemsIndexesMap.get(sibling
) + 1); | |
| 307 } | |
| 308 | |
| 309 m_gridItemsIndexesMap.set(&child, index); | |
| 310 } | 251 } |
| 311 | 252 |
| 312 void RenderGrid::removeChild(RenderObject* child) | 253 void RenderGrid::removeChild(RenderObject* child) |
| 313 { | 254 { |
| 314 RenderBlock::removeChild(child); | 255 RenderBlock::removeChild(child); |
| 315 | 256 |
| 316 if (gridIsDirty()) | 257 if (gridIsDirty()) |
| 317 return; | 258 return; |
| 318 | 259 |
| 319 ASSERT(child->isBox()); | 260 // The grid needs to be recomputed as it might contain auto-placed items tha
t will change their position. |
| 320 | 261 dirtyGrid(); |
| 321 // FIXME: Implement properly "stack" value in auto-placement algorithm. | 262 return; |
| 322 if (!style()->isGridAutoFlowAlgorithmStack()) { | |
| 323 // The grid needs to be recomputed as it might contain auto-placed items
that will change their position. | |
| 324 dirtyGrid(); | |
| 325 return; | |
| 326 } | |
| 327 | |
| 328 if (child->isOutOfFlowPositioned()) | |
| 329 return; | |
| 330 | |
| 331 const RenderBox* childBox = toRenderBox(child); | |
| 332 GridCoordinate coordinate = m_gridItemCoordinate.take(childBox); | |
| 333 | |
| 334 for (GridSpan::iterator row = coordinate.rows.begin(); row != coordinate.row
s.end(); ++row) { | |
| 335 for (GridSpan::iterator column = coordinate.columns.begin(); column != c
oordinate.columns.end(); ++column) { | |
| 336 GridCell& cell = m_grid[row.toInt()][column.toInt()]; | |
| 337 cell.remove(cell.find(childBox)); | |
| 338 } | |
| 339 } | |
| 340 | |
| 341 m_gridItemsIndexesMap.remove(childBox); | |
| 342 } | 263 } |
| 343 | 264 |
| 344 void RenderGrid::styleDidChange(StyleDifference diff, const RenderStyle* oldStyl
e) | 265 void RenderGrid::styleDidChange(StyleDifference diff, const RenderStyle* oldStyl
e) |
| 345 { | 266 { |
| 346 RenderBlock::styleDidChange(diff, oldStyle); | 267 RenderBlock::styleDidChange(diff, oldStyle); |
| 347 if (!oldStyle) | 268 if (!oldStyle) |
| 348 return; | 269 return; |
| 349 | 270 |
| 350 // FIXME: The following checks could be narrowed down if we kept track of wh
ich type of grid items we have: | 271 // FIXME: The following checks could be narrowed down if we kept track of wh
ich type of grid items we have: |
| 351 // - explicit grid size changes impact negative explicitely positioned and a
uto-placed grid items. | 272 // - explicit grid size changes impact negative explicitely positioned and a
uto-placed grid items. |
| (...skipping 603 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 955 else | 876 else |
| 956 specifiedMajorAxisAutoGridItems.append(child); | 877 specifiedMajorAxisAutoGridItems.append(child); |
| 957 continue; | 878 continue; |
| 958 } | 879 } |
| 959 insertItemIntoGrid(*child, GridCoordinate(*rowPositions, *columnPosition
s)); | 880 insertItemIntoGrid(*child, GridCoordinate(*rowPositions, *columnPosition
s)); |
| 960 } | 881 } |
| 961 | 882 |
| 962 ASSERT(gridRowCount() >= GridResolvedPosition::explicitGridRowCount(*style()
)); | 883 ASSERT(gridRowCount() >= GridResolvedPosition::explicitGridRowCount(*style()
)); |
| 963 ASSERT(gridColumnCount() >= GridResolvedPosition::explicitGridColumnCount(*s
tyle())); | 884 ASSERT(gridColumnCount() >= GridResolvedPosition::explicitGridColumnCount(*s
tyle())); |
| 964 | 885 |
| 965 // FIXME: Implement properly "stack" value in auto-placement algorithm. | |
| 966 if (style()->isGridAutoFlowAlgorithmStack()) { | |
| 967 // If we did collect some grid items, they won't be placed thus never la
id out. | |
| 968 ASSERT(!autoMajorAxisAutoGridItems.size()); | |
| 969 ASSERT(!specifiedMajorAxisAutoGridItems.size()); | |
| 970 return; | |
| 971 } | |
| 972 | |
| 973 placeSpecifiedMajorAxisItemsOnGrid(specifiedMajorAxisAutoGridItems); | 886 placeSpecifiedMajorAxisItemsOnGrid(specifiedMajorAxisAutoGridItems); |
| 974 placeAutoMajorAxisItemsOnGrid(autoMajorAxisAutoGridItems); | 887 placeAutoMajorAxisItemsOnGrid(autoMajorAxisAutoGridItems); |
| 975 | 888 |
| 976 m_grid.shrinkToFit(); | 889 m_grid.shrinkToFit(); |
| 977 } | 890 } |
| 978 | 891 |
| 979 void RenderGrid::populateExplicitGridAndOrderIterator() | 892 void RenderGrid::populateExplicitGridAndOrderIterator() |
| 980 { | 893 { |
| 981 OrderIteratorPopulator populator(m_orderIterator); | 894 OrderIteratorPopulator populator(m_orderIterator); |
| 982 | 895 |
| (...skipping 732 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1715 if (isOutOfFlowPositioned()) | 1628 if (isOutOfFlowPositioned()) |
| 1716 return "RenderGrid (positioned)"; | 1629 return "RenderGrid (positioned)"; |
| 1717 if (isAnonymous()) | 1630 if (isAnonymous()) |
| 1718 return "RenderGrid (generated)"; | 1631 return "RenderGrid (generated)"; |
| 1719 if (isRelPositioned()) | 1632 if (isRelPositioned()) |
| 1720 return "RenderGrid (relative positioned)"; | 1633 return "RenderGrid (relative positioned)"; |
| 1721 return "RenderGrid"; | 1634 return "RenderGrid"; |
| 1722 } | 1635 } |
| 1723 | 1636 |
| 1724 } // namespace blink | 1637 } // namespace blink |
| OLD | NEW |