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

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutTableSection.cpp

Issue 1602773005: Respect break-inside:avoid on table rows (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Updated Created 4 years, 7 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
OLDNEW
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, 2013 Apple Inc. All r ights 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
(...skipping 938 matching lines...) Expand 10 before | Expand all | Expand 10 after
949 949
950 // FIXME: Changing the height without a layout can change the overflow so it seems wrong. 950 // FIXME: Changing the height without a layout can change the overflow so it seems wrong.
951 951
952 unsigned totalRows = m_grid.size(); 952 unsigned totalRows = m_grid.size();
953 953
954 // Set the width of our section now. The rows will also be this width. 954 // Set the width of our section now. The rows will also be this width.
955 setLogicalWidth(table()->contentLogicalWidth()); 955 setLogicalWidth(table()->contentLogicalWidth());
956 956
957 int vspacing = table()->vBorderSpacing(); 957 int vspacing = table()->vBorderSpacing();
958 unsigned nEffCols = table()->numEffectiveColumns(); 958 unsigned nEffCols = table()->numEffectiveColumns();
959 bool isPaginated = view()->layoutState()->isPaginated();
959 960
960 LayoutState state(*this, locationOffset()); 961 LayoutState state(*this, locationOffset());
961 962
962 for (unsigned r = 0; r < totalRows; r++) { 963 for (unsigned r = 0; r < totalRows; r++) {
963 // Set the row's x/y position and width/height. 964 // Set the row's x/y position and width/height.
964 LayoutTableRow* rowLayoutObject = m_grid[r].rowLayoutObject; 965 LayoutTableRow* rowLayoutObject = m_grid[r].rowLayoutObject;
966 int paginationStrutOnRow = 0;
965 if (rowLayoutObject) { 967 if (rowLayoutObject) {
966 rowLayoutObject->setLocation(LayoutPoint(0, m_rowPos[r])); 968 rowLayoutObject->setLocation(LayoutPoint(0, m_rowPos[r]));
967 rowLayoutObject->setLogicalWidth(logicalWidth()); 969 rowLayoutObject->setLogicalWidth(logicalWidth());
968 rowLayoutObject->setLogicalHeight(LayoutUnit(m_rowPos[r + 1] - m_row Pos[r] - vspacing)); 970 rowLayoutObject->setLogicalHeight(LayoutUnit(m_rowPos[r + 1] - m_row Pos[r] - vspacing));
969 rowLayoutObject->updateLayerTransformAfterLayout(); 971 rowLayoutObject->updateLayerTransformAfterLayout();
972 if (isPaginated) {
973 paginationStrutOnRow = paginationStrutForRow(rowLayoutObject, La youtUnit(m_rowPos[r]));
974 if (paginationStrutOnRow) {
975 for (unsigned rowIndex = r; rowIndex <= totalRows; rowIndex+ +)
976 m_rowPos[rowIndex] += paginationStrutOnRow;
977 }
978 }
970 } 979 }
971 980
972 int rowHeightIncreaseForPagination = 0; 981 int rowHeightIncreaseForPagination = INT_MIN;
973 982
974 for (unsigned c = 0; c < nEffCols; c++) { 983 for (unsigned c = 0; c < nEffCols; c++) {
975 CellStruct& cs = cellAt(r, c); 984 CellStruct& cs = cellAt(r, c);
976 LayoutTableCell* cell = cs.primaryCell(); 985 LayoutTableCell* cell = cs.primaryCell();
977 986
978 if (!cell || cs.inColSpan) 987 if (!cell || cs.inColSpan)
979 continue; 988 continue;
980 989
981 int rowIndex = cell->rowIndex(); 990 int rowIndex = cell->rowIndex();
982 int rHeight = m_rowPos[rowIndex + cell->rowSpan()] - m_rowPos[rowInd ex] - vspacing; 991 int rHeight = m_rowPos[rowIndex + cell->rowSpan()] - m_rowPos[rowInd ex] - vspacing;
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1044 cell->markForPaginationRelayoutIfNeeded(layouter); 1053 cell->markForPaginationRelayoutIfNeeded(layouter);
1045 1054
1046 cell->layoutIfNeeded(); 1055 cell->layoutIfNeeded();
1047 1056
1048 // FIXME: Make pagination work with vertical tables. 1057 // FIXME: Make pagination work with vertical tables.
1049 if (view()->layoutState()->pageLogicalHeight() && cell->logicalHeigh t() != rHeight) { 1058 if (view()->layoutState()->pageLogicalHeight() && cell->logicalHeigh t() != rHeight) {
1050 // FIXME: Pagination might have made us change size. For now jus t shrink or grow the cell to fit without doing a relayout. 1059 // FIXME: Pagination might have made us change size. For now jus t shrink or grow the cell to fit without doing a relayout.
1051 // We'll also do a basic increase of the row height to accommoda te the cell if it's bigger, but this isn't quite right 1060 // We'll also do a basic increase of the row height to accommoda te the cell if it's bigger, but this isn't quite right
1052 // either. It's at least stable though and won't result in an in finite # of relayouts that may never stabilize. 1061 // either. It's at least stable though and won't result in an in finite # of relayouts that may never stabilize.
1053 LayoutUnit oldLogicalHeight = cell->logicalHeight(); 1062 LayoutUnit oldLogicalHeight = cell->logicalHeight();
1054 if (oldLogicalHeight > rHeight) 1063 rowHeightIncreaseForPagination = std::max<int>(rowHeightIncrease ForPagination, oldLogicalHeight - rHeight);
mstensho (USE GERRIT) 2016/05/04 20:23:44 This is new. What is it for? Looks like you want t
rhogan 2016/05/04 20:31:45 This is per your comment: " When paginationStrutFo
mstensho (USE GERRIT) 2016/05/04 21:02:23 Oh, I said that? Indeed I did. Well, can't argue w
1055 rowHeightIncreaseForPagination = std::max<int>(rowHeightIncr easeForPagination, oldLogicalHeight - rHeight);
1056 cell->setLogicalHeight(LayoutUnit(rHeight)); 1064 cell->setLogicalHeight(LayoutUnit(rHeight));
1057 cell->computeOverflow(oldLogicalHeight, false); 1065 cell->computeOverflow(oldLogicalHeight, false);
1058 } 1066 }
1059 1067
1060 LayoutSize childOffset(cell->location() - oldCellRect.location()); 1068 LayoutSize childOffset(cell->location() - oldCellRect.location());
1061 if (childOffset.width() || childOffset.height()) { 1069 if (childOffset.width() || childOffset.height()) {
1062 // If the child moved, we have to issue paint invalidations to i t as well as any floating/positioned 1070 // If the child moved, we have to issue paint invalidations to i t as well as any floating/positioned
1063 // descendants. An exception is if we need a layout. In this cas e, we know we're going to 1071 // descendants. An exception is if we need a layout. In this cas e, we know we're going to
1064 // issue paint invalidations ourselves (and the child) anyway. 1072 // issue paint invalidations ourselves (and the child) anyway.
1065 if (!table()->selfNeedsLayout()) 1073 if (!table()->selfNeedsLayout())
1066 cell->setMayNeedPaintInvalidation(); 1074 cell->setMayNeedPaintInvalidation();
1067 } 1075 }
1068 } 1076 }
1069 if (rowHeightIncreaseForPagination) { 1077 if (rowHeightIncreaseForPagination > INT_MIN) {
1070 for (unsigned rowIndex = r + 1; rowIndex <= totalRows; rowIndex++) 1078 for (unsigned rowIndex = r + 1; rowIndex <= totalRows; rowIndex++)
1071 m_rowPos[rowIndex] += rowHeightIncreaseForPagination; 1079 m_rowPos[rowIndex] += rowHeightIncreaseForPagination;
1072 for (unsigned c = 0; c < nEffCols; ++c) { 1080 for (unsigned c = 0; c < nEffCols; ++c) {
1073 Vector<LayoutTableCell*, 1>& cells = cellAt(r, c).cells; 1081 Vector<LayoutTableCell*, 1>& cells = cellAt(r, c).cells;
1074 for (size_t i = 0; i < cells.size(); ++i) { 1082 for (size_t i = 0; i < cells.size(); ++i) {
1075 LayoutUnit oldLogicalHeight = cells[i]->logicalHeight(); 1083 LayoutUnit oldLogicalHeight = cells[i]->logicalHeight();
1076 cells[i]->setLogicalHeight(oldLogicalHeight + rowHeightIncre aseForPagination); 1084 cells[i]->setLogicalHeight(oldLogicalHeight + rowHeightIncre aseForPagination);
1077 cells[i]->computeOverflow(oldLogicalHeight, false); 1085 cells[i]->computeOverflow(oldLogicalHeight, false);
1078 } 1086 }
1079 } 1087 }
1080 } 1088 }
1081 if (rowLayoutObject) 1089 if (rowLayoutObject)
1082 rowLayoutObject->computeOverflow(); 1090 rowLayoutObject->computeOverflow();
1083 } 1091 }
1084 1092
1085 ASSERT(!needsLayout()); 1093 ASSERT(!needsLayout());
1086 1094
1087 setLogicalHeight(LayoutUnit(m_rowPos[totalRows])); 1095 setLogicalHeight(LayoutUnit(m_rowPos[totalRows]));
1088 1096
1089 computeOverflowFromCells(totalRows, nEffCols); 1097 computeOverflowFromCells(totalRows, nEffCols);
1090 } 1098 }
1091 1099
1100 int LayoutTableSection::paginationStrutForRow(LayoutTableRow* row, LayoutUnit lo gicalOffset) const
1101 {
1102 if (row->getPaginationBreakability() == AllowAnyBreaks)
1103 return 0;
1104 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset);
1105 if (!pageLogicalHeight)
1106 return 0;
1107 // If the row is too tall for the page don't insert a strut.
1108 LayoutUnit rowLogicalHeight = row->logicalHeight();
1109 if (rowLogicalHeight > pageLogicalHeight)
1110 return 0;
1111 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi calOffset, LayoutBlock::AssociateWithLatterPage);
1112 if (remainingLogicalHeight >= rowLogicalHeight)
1113 return 0; // It fits fine where it is. No need to break.
1114 LayoutUnit paginationStrut = calculatePaginationStrutToFitContent(logicalOff set, remainingLogicalHeight, rowLogicalHeight);
1115 if (paginationStrut == remainingLogicalHeight && remainingLogicalHeight == p ageLogicalHeight) {
1116 // Don't break if we were at the top of a page, and we failed to fit the content
1117 // completely. No point in leaving a page completely blank.
1118 return 0;
1119 }
1120 return paginationStrut;
1121 }
1122
1092 void LayoutTableSection::computeOverflowFromCells() 1123 void LayoutTableSection::computeOverflowFromCells()
1093 { 1124 {
1094 unsigned totalRows = m_grid.size(); 1125 unsigned totalRows = m_grid.size();
1095 unsigned nEffCols = table()->numEffectiveColumns(); 1126 unsigned nEffCols = table()->numEffectiveColumns();
1096 computeOverflowFromCells(totalRows, nEffCols); 1127 computeOverflowFromCells(totalRows, nEffCols);
1097 } 1128 }
1098 1129
1099 void LayoutTableSection::computeOverflowFromCells(unsigned totalRows, unsigned n EffCols) 1130 void LayoutTableSection::computeOverflowFromCells(unsigned totalRows, unsigned n EffCols)
1100 { 1131 {
1101 unsigned totalCellsCount = nEffCols * totalRows; 1132 unsigned totalCellsCount = nEffCols * totalRows;
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after
1668 // FIXME: The table's direction should determine our row's direction, not th e section's (see bug 96691). 1699 // FIXME: The table's direction should determine our row's direction, not th e section's (see bug 96691).
1669 if (!style()->isLeftToRightDirection()) 1700 if (!style()->isLeftToRightDirection())
1670 cellLocation.setX(LayoutUnit(table()->effectiveColumnPositions()[table() ->numEffectiveColumns()] - table()->effectiveColumnPositions()[table()->absolute ColumnToEffectiveColumn(cell->absoluteColumnIndex() + cell->colSpan())] + horizo ntalBorderSpacing)); 1701 cellLocation.setX(LayoutUnit(table()->effectiveColumnPositions()[table() ->numEffectiveColumns()] - table()->effectiveColumnPositions()[table()->absolute ColumnToEffectiveColumn(cell->absoluteColumnIndex() + cell->colSpan())] + horizo ntalBorderSpacing));
1671 else 1702 else
1672 cellLocation.setX(LayoutUnit(table()->effectiveColumnPositions()[effecti veColumn] + horizontalBorderSpacing)); 1703 cellLocation.setX(LayoutUnit(table()->effectiveColumnPositions()[effecti veColumn] + horizontalBorderSpacing));
1673 1704
1674 cell->setLogicalLocation(cellLocation); 1705 cell->setLogicalLocation(cellLocation);
1675 } 1706 }
1676 1707
1677 } // namespace blink 1708 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698