| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1997 Martin Jones (mjones@kde.org) | 2 * Copyright (C) 1997 Martin Jones (mjones@kde.org) |
| 3 * (C) 1997 Torben Weis (weis@kde.org) | 3 * (C) 1997 Torben Weis (weis@kde.org) |
| 4 * (C) 1998 Waldo Bastian (bastian@kde.org) | 4 * (C) 1998 Waldo Bastian (bastian@kde.org) |
| 5 * (C) 1999 Lars Knoll (knoll@kde.org) | 5 * (C) 1999 Lars Knoll (knoll@kde.org) |
| 6 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 6 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 7 * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010 Apple Inc. All rights
reserved. | 7 * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2013 Apple Inc. All r
ights reserved. |
| 8 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com) | 8 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com) |
| 9 * | 9 * |
| 10 * This library is free software; you can redistribute it and/or | 10 * This library is free software; you can redistribute it and/or |
| 11 * modify it under the terms of the GNU Library General Public | 11 * modify it under the terms of the GNU Library General Public |
| 12 * License as published by the Free Software Foundation; either | 12 * License as published by the Free Software Foundation; either |
| 13 * version 2 of the License, or (at your option) any later version. | 13 * version 2 of the License, or (at your option) any later version. |
| 14 * | 14 * |
| 15 * This library is distributed in the hope that it will be useful, | 15 * This library is distributed in the hope that it will be useful, |
| 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 117 // Preventively invalidate our cells as we may be re-inserted into | 117 // Preventively invalidate our cells as we may be re-inserted into |
| 118 // a new table which would require us to rebuild our structure. | 118 // a new table which would require us to rebuild our structure. |
| 119 setNeedsCellRecalc(); | 119 setNeedsCellRecalc(); |
| 120 } | 120 } |
| 121 | 121 |
| 122 void RenderTableSection::addChild(RenderObject* child, RenderObject* beforeChild
) | 122 void RenderTableSection::addChild(RenderObject* child, RenderObject* beforeChild
) |
| 123 { | 123 { |
| 124 if (!child->isTableRow()) { | 124 if (!child->isTableRow()) { |
| 125 RenderObject* last = beforeChild; | 125 RenderObject* last = beforeChild; |
| 126 if (!last) | 126 if (!last) |
| 127 last = lastChild(); | 127 last = lastRow(); |
| 128 if (last && last->isAnonymous() && !last->isBeforeOrAfterContent()) { | 128 if (last && last->isAnonymous() && !last->isBeforeOrAfterContent()) { |
| 129 if (beforeChild == last) | 129 if (beforeChild == last) |
| 130 beforeChild = last->slowFirstChild(); | 130 beforeChild = last->slowFirstChild(); |
| 131 last->addChild(child, beforeChild); | 131 last->addChild(child, beforeChild); |
| 132 return; | 132 return; |
| 133 } | 133 } |
| 134 | 134 |
| 135 if (beforeChild && !beforeChild->isAnonymous() && beforeChild->parent()
== this) { | 135 if (beforeChild && !beforeChild->isAnonymous() && beforeChild->parent()
== this) { |
| 136 RenderObject* row = beforeChild->previousSibling(); | 136 RenderObject* row = beforeChild->previousSibling(); |
| 137 if (row && row->isTableRow() && row->isAnonymous()) { | 137 if (row && row->isTableRow() && row->isAnonymous()) { |
| (...skipping 939 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1077 return 0; | 1077 return 0; |
| 1078 | 1078 |
| 1079 unsigned borderWidth = 0; | 1079 unsigned borderWidth = 0; |
| 1080 | 1080 |
| 1081 const BorderValue& sb = side == BorderBefore ? style()->borderBefore() : sty
le()->borderAfter(); | 1081 const BorderValue& sb = side == BorderBefore ? style()->borderBefore() : sty
le()->borderAfter(); |
| 1082 if (sb.style() == BHIDDEN) | 1082 if (sb.style() == BHIDDEN) |
| 1083 return -1; | 1083 return -1; |
| 1084 if (sb.style() > BHIDDEN) | 1084 if (sb.style() > BHIDDEN) |
| 1085 borderWidth = sb.width(); | 1085 borderWidth = sb.width(); |
| 1086 | 1086 |
| 1087 const BorderValue& rb = side == BorderBefore ? firstChild()->style()->border
Before() : lastChild()->style()->borderAfter(); | 1087 const BorderValue& rb = side == BorderBefore ? firstRow()->style()->borderBe
fore() : lastRow()->style()->borderAfter(); |
| 1088 if (rb.style() == BHIDDEN) | 1088 if (rb.style() == BHIDDEN) |
| 1089 return -1; | 1089 return -1; |
| 1090 if (rb.style() > BHIDDEN && rb.width() > borderWidth) | 1090 if (rb.style() > BHIDDEN && rb.width() > borderWidth) |
| 1091 borderWidth = rb.width(); | 1091 borderWidth = rb.width(); |
| 1092 | 1092 |
| 1093 bool allHidden = true; | 1093 bool allHidden = true; |
| 1094 for (unsigned c = 0; c < totalCols; c++) { | 1094 for (unsigned c = 0; c < totalCols; c++) { |
| 1095 const CellStruct& current = cellAt(side == BorderBefore ? 0 : m_grid.siz
e() - 1, c); | 1095 const CellStruct& current = cellAt(side == BorderBefore ? 0 : m_grid.siz
e() - 1, c); |
| 1096 if (current.inColSpan || !current.hasCells()) | 1096 if (current.inColSpan || !current.hasCells()) |
| 1097 continue; | 1097 continue; |
| (...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1490 ASSERT(m_needsCellRecalc); | 1490 ASSERT(m_needsCellRecalc); |
| 1491 // We reset the flag here to ensure that |addCell| works. This is safe to do
as | 1491 // We reset the flag here to ensure that |addCell| works. This is safe to do
as |
| 1492 // fillRowsWithDefaultStartingAtPosition makes sure we match the table's col
umns | 1492 // fillRowsWithDefaultStartingAtPosition makes sure we match the table's col
umns |
| 1493 // representation. | 1493 // representation. |
| 1494 m_needsCellRecalc = false; | 1494 m_needsCellRecalc = false; |
| 1495 | 1495 |
| 1496 m_cCol = 0; | 1496 m_cCol = 0; |
| 1497 m_cRow = 0; | 1497 m_cRow = 0; |
| 1498 m_grid.clear(); | 1498 m_grid.clear(); |
| 1499 | 1499 |
| 1500 for (RenderObject* row = firstChild(); row; row = row->nextSibling()) { | 1500 for (RenderTableRow* row = firstRow(); row; row = row->nextRow()) { |
| 1501 if (row->isTableRow()) { | 1501 unsigned insertionRow = m_cRow; |
| 1502 unsigned insertionRow = m_cRow; | 1502 ++m_cRow; |
| 1503 m_cRow++; | 1503 m_cCol = 0; |
| 1504 m_cCol = 0; | 1504 ensureRows(m_cRow); |
| 1505 ensureRows(m_cRow); | |
| 1506 | 1505 |
| 1507 RenderTableRow* tableRow = toRenderTableRow(row); | 1506 m_grid[insertionRow].rowRenderer = row; |
| 1508 m_grid[insertionRow].rowRenderer = tableRow; | 1507 row->setRowIndex(insertionRow); |
| 1509 tableRow->setRowIndex(insertionRow); | 1508 setRowLogicalHeightToRowStyleLogicalHeight(m_grid[insertionRow]); |
| 1510 setRowLogicalHeightToRowStyleLogicalHeight(m_grid[insertionRow]); | |
| 1511 | 1509 |
| 1512 for (RenderObject* cell = tableRow->firstChild(); cell; cell = cell-
>nextSibling()) { | 1510 for (RenderTableCell* cell = row->firstCell(); cell; cell = cell->nextCe
ll()) |
| 1513 if (!cell->isTableCell()) | 1511 addCell(cell, row); |
| 1514 continue; | |
| 1515 | |
| 1516 RenderTableCell* tableCell = toRenderTableCell(cell); | |
| 1517 addCell(tableCell, tableRow); | |
| 1518 } | |
| 1519 } | |
| 1520 } | 1512 } |
| 1521 | 1513 |
| 1522 m_grid.shrinkToFit(); | 1514 m_grid.shrinkToFit(); |
| 1523 setNeedsLayout(); | 1515 setNeedsLayout(); |
| 1524 } | 1516 } |
| 1525 | 1517 |
| 1526 // FIXME: This function could be made O(1) in certain cases (like for the non-mo
st-constrainive cells' case). | 1518 // FIXME: This function could be made O(1) in certain cases (like for the non-mo
st-constrainive cells' case). |
| 1527 void RenderTableSection::rowLogicalHeightChanged(unsigned rowIndex) | 1519 void RenderTableSection::rowLogicalHeightChanged(unsigned rowIndex) |
| 1528 { | 1520 { |
| 1529 if (needsCellRecalc()) | 1521 if (needsCellRecalc()) |
| 1530 return; | 1522 return; |
| 1531 | 1523 |
| 1532 setRowLogicalHeightToRowStyleLogicalHeight(m_grid[rowIndex]); | 1524 setRowLogicalHeightToRowStyleLogicalHeight(m_grid[rowIndex]); |
| 1533 | 1525 |
| 1534 for (RenderObject* cell = m_grid[rowIndex].rowRenderer->firstChild(); cell;
cell = cell->nextSibling()) { | 1526 for (RenderTableCell* cell = m_grid[rowIndex].rowRenderer->firstCell(); cell
; cell = cell->nextCell()) |
| 1535 if (!cell->isTableCell()) | 1527 updateLogicalHeightForCell(m_grid[rowIndex], cell); |
| 1536 continue; | |
| 1537 | |
| 1538 updateLogicalHeightForCell(m_grid[rowIndex], toRenderTableCell(cell)); | |
| 1539 } | |
| 1540 } | 1528 } |
| 1541 | 1529 |
| 1542 void RenderTableSection::setNeedsCellRecalc() | 1530 void RenderTableSection::setNeedsCellRecalc() |
| 1543 { | 1531 { |
| 1544 m_needsCellRecalc = true; | 1532 m_needsCellRecalc = true; |
| 1545 if (RenderTable* t = table()) | 1533 if (RenderTable* t = table()) |
| 1546 t->setNeedsSectionRecalc(); | 1534 t->setNeedsSectionRecalc(); |
| 1547 } | 1535 } |
| 1548 | 1536 |
| 1549 unsigned RenderTableSection::numColumns() const | 1537 unsigned RenderTableSection::numColumns() const |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1615 } else { | 1603 } else { |
| 1616 r[pos + 1].inColSpan = 0; | 1604 r[pos + 1].inColSpan = 0; |
| 1617 } | 1605 } |
| 1618 } | 1606 } |
| 1619 } | 1607 } |
| 1620 | 1608 |
| 1621 // Hit Testing | 1609 // Hit Testing |
| 1622 bool RenderTableSection::nodeAtPoint(const HitTestRequest& request, HitTestResul
t& result, const HitTestLocation& locationInContainer, const LayoutPoint& accumu
latedOffset, HitTestAction action) | 1610 bool RenderTableSection::nodeAtPoint(const HitTestRequest& request, HitTestResul
t& result, const HitTestLocation& locationInContainer, const LayoutPoint& accumu
latedOffset, HitTestAction action) |
| 1623 { | 1611 { |
| 1624 // If we have no children then we have nothing to do. | 1612 // If we have no children then we have nothing to do. |
| 1625 if (!firstChild()) | 1613 if (!firstRow()) |
| 1626 return false; | 1614 return false; |
| 1627 | 1615 |
| 1628 // Table sections cannot ever be hit tested. Effectively they do not exist. | 1616 // Table sections cannot ever be hit tested. Effectively they do not exist. |
| 1629 // Just forward to our children always. | 1617 // Just forward to our children always. |
| 1630 LayoutPoint adjustedLocation = accumulatedOffset + location(); | 1618 LayoutPoint adjustedLocation = accumulatedOffset + location(); |
| 1631 | 1619 |
| 1632 if (hasOverflowClip() && !locationInContainer.intersects(overflowClipRect(ad
justedLocation))) | 1620 if (hasOverflowClip() && !locationInContainer.intersects(overflowClipRect(ad
justedLocation))) |
| 1633 return false; | 1621 return false; |
| 1634 | 1622 |
| 1635 if (hasOverflowingCell()) { | 1623 if (hasOverflowingCell()) { |
| 1636 for (RenderObject* child = lastChild(); child; child = child->previousSi
bling()) { | 1624 for (RenderTableRow* row = lastRow(); row; row = row->previousRow()) { |
| 1637 // FIXME: We have to skip over inline flows, since they can show up
inside table rows | 1625 // FIXME: We have to skip over inline flows, since they can show up
inside table rows |
| 1638 // at the moment (a demoted inline <form> for example). If we ever i
mplement a | 1626 // at the moment (a demoted inline <form> for example). If we ever i
mplement a |
| 1639 // table-specific hit-test method (which we should do for performanc
e reasons anyway), | 1627 // table-specific hit-test method (which we should do for performanc
e reasons anyway), |
| 1640 // then we can remove this check. | 1628 // then we can remove this check. |
| 1641 if (child->isBox() && !toRenderBox(child)->hasSelfPaintingLayer()) { | 1629 if (!row->hasSelfPaintingLayer()) { |
| 1642 LayoutPoint childPoint = flipForWritingModeForChild(toRenderBox(
child), adjustedLocation); | 1630 LayoutPoint childPoint = flipForWritingModeForChild(row, adjuste
dLocation); |
| 1643 if (child->nodeAtPoint(request, result, locationInContainer, chi
ldPoint, action)) { | 1631 if (row->nodeAtPoint(request, result, locationInContainer, child
Point, action)) { |
| 1644 updateHitTestResult(result, toLayoutPoint(locationInContaine
r.point() - childPoint)); | 1632 updateHitTestResult(result, toLayoutPoint(locationInContaine
r.point() - childPoint)); |
| 1645 return true; | 1633 return true; |
| 1646 } | 1634 } |
| 1647 } | 1635 } |
| 1648 } | 1636 } |
| 1649 return false; | 1637 return false; |
| 1650 } | 1638 } |
| 1651 | 1639 |
| 1652 recalcCellsIfNeeded(); | 1640 recalcCellsIfNeeded(); |
| 1653 | 1641 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1731 else | 1719 else |
| 1732 cellLocation.setX(table()->columnPositions()[effectiveColumn] + horizont
alBorderSpacing); | 1720 cellLocation.setX(table()->columnPositions()[effectiveColumn] + horizont
alBorderSpacing); |
| 1733 | 1721 |
| 1734 cell->setLogicalLocation(cellLocation); | 1722 cell->setLogicalLocation(cellLocation); |
| 1735 | 1723 |
| 1736 if (!RuntimeEnabledFeatures::repaintAfterLayoutEnabled()) | 1724 if (!RuntimeEnabledFeatures::repaintAfterLayoutEnabled()) |
| 1737 view()->addLayoutDelta(oldCellLocation - cell->location()); | 1725 view()->addLayoutDelta(oldCellLocation - cell->location()); |
| 1738 } | 1726 } |
| 1739 | 1727 |
| 1740 } // namespace WebCore | 1728 } // namespace WebCore |
| OLD | NEW |