Index: third_party/WebKit/Source/core/layout/LayoutTableSection.cpp |
diff --git a/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp b/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp |
index 3c3a4bfda7dd52d64aba61f0a98f398747f7038c..024ab46da34ffca5ac5153117c9a49def727c87a 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp |
@@ -96,7 +96,8 @@ LayoutTableSection::LayoutTableSection(Element* element) |
force_full_paint_(false), |
has_multiple_cell_levels_(false), |
has_spanning_cells_(false), |
- is_repeating_header_group_(false) { |
+ is_repeating_header_group_(false), |
+ is_repeating_footer_group_(false) { |
// init LayoutObject attributes |
SetInline(false); // our object is not Inline |
} |
@@ -1265,7 +1266,11 @@ void LayoutTableSection::LayoutRows() { |
int LayoutTableSection::PaginationStrutForRow(LayoutTableRow* row, |
LayoutUnit logical_offset) const { |
DCHECK(row); |
- if (row->GetPaginationBreakability() == kAllowAnyBreaks) |
+ const LayoutTableSection* footer = Table()->Footer(); |
+ bool make_room_for_repeating_footer = |
+ footer && footer->IsRepeatingFooterGroup() && row->RowIndex(); |
+ if (!make_room_for_repeating_footer && |
+ row->GetPaginationBreakability() == kAllowAnyBreaks) |
return 0; |
if (!IsPageLogicalHeightKnown()) |
return 0; |
@@ -1960,15 +1965,15 @@ void LayoutTableSection::AdjustRowForPagination(LayoutTableRow& row_object, |
row_object.SetLogicalHeight(LayoutUnit(LogicalHeightForRow(row_object))); |
} |
-bool LayoutTableSection::HeaderGroupShouldRepeat() const { |
- if (Table()->Header() != this) |
- return false; |
- |
+bool LayoutTableSection::GroupShouldRepeat() const { |
+ DCHECK(Table()->Header() == this || Table()->Footer() == this); |
if (GetPaginationBreakability() == kAllowAnyBreaks) |
return false; |
+ |
// TODO(rhogan): Sections can be self-painting. |
if (HasSelfPaintingLayer()) |
return false; |
+ |
// If we don't know the page height yet, just assume we fit. |
if (!IsPageLogicalHeightKnown()) |
return true; |
@@ -1991,17 +1996,21 @@ bool LayoutTableSection::MapToVisualRectInAncestorSpaceInternal( |
VisualRectFlags flags) const { |
if (ancestor == this) |
return true; |
- // Repeating table headers are painted once per fragmentation page/column. |
+ // Repeating table headers and footers are painted once per |
+ // page/column. So we need to use the rect for the entire table because |
+ // the repeating headers/footers will appear throughout it. |
// This does not go through the regular fragmentation machinery, so we need |
// special code to expand the invalidation rect to contain all positions of |
// the header in all columns. |
// Note that this is in flow thread coordinates, not visual coordinates. The |
// enclosing LayoutFlowThread will convert to visual coordinates. |
- if (IsRepeatingHeaderGroup()) { |
+ if (IsRepeatingHeaderGroup() || IsRepeatingFooterGroup()) { |
transform_state.Flatten(); |
FloatRect rect = transform_state.LastPlanarQuad().BoundingBox(); |
rect.SetHeight(Table()->LogicalHeight()); |
transform_state.SetQuad(FloatQuad(rect)); |
+ return Table()->MapToVisualRectInAncestorSpaceInternal( |
+ ancestor, transform_state, flags); |
} |
return LayoutTableBoxComponent::MapToVisualRectInAncestorSpaceInternal( |
ancestor, transform_state, flags); |