| 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 e0d07324e6677ea00502bf1a0fdd5314fc50b32a..6a10f3426072301c3dbc576b030df4628c1e8d4a 100644
 | 
| --- a/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp
 | 
| +++ b/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp
 | 
| @@ -95,7 +95,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
 | 
|  }
 | 
| @@ -1216,7 +1217,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;
 | 
| @@ -1226,6 +1231,11 @@ int LayoutTableSection::PaginationStrutForRow(LayoutTableRow* row,
 | 
|    if (row_logical_height > page_logical_height)
 | 
|      return 0;
 | 
|  
 | 
| +  if (make_room_for_repeating_footer) {
 | 
| +    row_logical_height +=
 | 
| +        View()->GetLayoutState()->HeightOffsetForTableFooters();
 | 
| +  }
 | 
| +
 | 
|    LayoutUnit remaining_logical_height = PageRemainingLogicalHeightForOffset(
 | 
|        logical_offset, LayoutBlock::kAssociateWithLatterPage);
 | 
|    if (remaining_logical_height >= row_logical_height)
 | 
| @@ -1912,15 +1922,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;
 | 
| @@ -1943,17 +1953,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);
 | 
| 
 |