| Index: third_party/WebKit/Source/core/paint/TableSectionPainter.cpp
|
| diff --git a/third_party/WebKit/Source/core/paint/TableSectionPainter.cpp b/third_party/WebKit/Source/core/paint/TableSectionPainter.cpp
|
| index 08cf2213cf08b2e018db79706b12a23c00ff706e..280f2291b979bd667d64bf3687f9749d35d8530d 100644
|
| --- a/third_party/WebKit/Source/core/paint/TableSectionPainter.cpp
|
| +++ b/third_party/WebKit/Source/core/paint/TableSectionPainter.cpp
|
| @@ -39,9 +39,9 @@ void TableSectionPainter::PaintRepeatingHeaderGroup(
|
| header_group_offset += strut_on_first_row;
|
| LayoutUnit offset_to_next_page =
|
| page_height - IntMod(header_group_offset, page_height);
|
| - // Move paginationOffset to the top of the next page.
|
| + // Move pagination_offset to the top of the next page.
|
| pagination_offset.Move(LayoutUnit(), offset_to_next_page);
|
| - // Now move paginationOffset to the top of the page the cull rect starts on.
|
| + // Now move pagination_offset to the top of the page the cull rect starts on.
|
| if (paint_info.GetCullRect().rect_.Y() > pagination_offset.Y()) {
|
| pagination_offset.Move(LayoutUnit(),
|
| page_height * ((paint_info.GetCullRect().rect_.Y() -
|
| @@ -75,14 +75,80 @@ void TableSectionPainter::PaintRepeatingHeaderGroup(
|
| }
|
| }
|
|
|
| +void TableSectionPainter::PaintRepeatingFooterGroup(
|
| + const PaintInfo& paint_info,
|
| + const LayoutPoint& paint_offset,
|
| + ItemToPaint item_to_paint) {
|
| + if (!layout_table_section_.IsRepeatingFooterGroup())
|
| + return;
|
| +
|
| + // Work out the top position of the table so we can decide
|
| + // which page to paint the first footer on.
|
| + LayoutTable* table = layout_table_section_.Table();
|
| + LayoutRect sections_rect(LayoutPoint(), table->Size());
|
| + table->SubtractCaptionRect(sections_rect);
|
| + LayoutUnit page_height = table->PageLogicalHeightForOffset(LayoutUnit());
|
| + LayoutUnit height_of_previous_footers = table->RowOffsetFromRepeatingFooter();
|
| + LayoutUnit offset_for_footer = page_height - height_of_previous_footers;
|
| + // TODO: Accounting for the border-spacing here is wrong.
|
| + LayoutUnit header_group_offset =
|
| + table->BlockOffsetToFirstRepeatableHeader() + table->VBorderSpacing();
|
| + // The first row in the table may have a pagination strut before it so we need
|
| + // to account for that when establishing its position.
|
| + LayoutUnit strut_on_first_row;
|
| + LayoutTableSection* top_section = table->TopSection();
|
| + if (top_section) {
|
| + if (LayoutTableRow* row = top_section->FirstRow())
|
| + strut_on_first_row = row->PaginationStrut();
|
| + }
|
| + header_group_offset += strut_on_first_row;
|
| + LayoutUnit total_height_of_rows =
|
| + sections_rect.Height() + IntMod(header_group_offset, page_height);
|
| + total_height_of_rows -= (layout_table_section_.LogicalHeight() -
|
| + layout_table_section_.FirstRow()->PaginationStrut());
|
| +
|
| + // Move the offset to the top of the page the table starts on.
|
| + LayoutPoint pagination_offset = paint_offset;
|
| + pagination_offset.Move(LayoutUnit(), -total_height_of_rows);
|
| +
|
| + // Paint up to the last page that needs painting.
|
| + LayoutUnit bottom_bound =
|
| + std::min(LayoutUnit(paint_info.GetCullRect().rect_.MaxY()),
|
| + pagination_offset.Y() + total_height_of_rows - page_height);
|
| +
|
| + // If the first row in the table would overlap with the footer on the first
|
| + // page then don't repeat the footer there.
|
| + if (top_section && top_section->FirstRow() &&
|
| + IntMod(header_group_offset, page_height) +
|
| + top_section->FirstRow()->LogicalHeight() >
|
| + offset_for_footer) {
|
| + pagination_offset.Move(LayoutUnit(), page_height);
|
| + }
|
| +
|
| + // Paint a footer on each page from first to next-to-last.
|
| + while (pagination_offset.Y() < bottom_bound) {
|
| + LayoutPoint nested_offset = pagination_offset;
|
| + nested_offset.Move(LayoutUnit(), offset_for_footer);
|
| + if (item_to_paint == kPaintCollapsedBorders) {
|
| + PaintCollapsedSectionBorders(paint_info, nested_offset);
|
| + } else {
|
| + PaintSection(paint_info, nested_offset);
|
| + }
|
| + pagination_offset.Move(0, page_height.ToInt());
|
| + }
|
| +}
|
| +
|
| void TableSectionPainter::Paint(const PaintInfo& paint_info,
|
| const LayoutPoint& paint_offset) {
|
| ObjectPainter(layout_table_section_)
|
| .CheckPaintOffset(paint_info, paint_offset);
|
| PaintSection(paint_info, paint_offset);
|
| LayoutTable* table = layout_table_section_.Table();
|
| - if (table->Header() == layout_table_section_)
|
| + if (table->Header() == layout_table_section_) {
|
| PaintRepeatingHeaderGroup(paint_info, paint_offset, kPaintSection);
|
| + } else if (table->Footer() == layout_table_section_) {
|
| + PaintRepeatingFooterGroup(paint_info, paint_offset, kPaintSection);
|
| + }
|
| }
|
|
|
| void TableSectionPainter::PaintSection(const PaintInfo& paint_info,
|
| @@ -119,8 +185,11 @@ void TableSectionPainter::PaintCollapsedBorders(
|
| const LayoutPoint& paint_offset) {
|
| PaintCollapsedSectionBorders(paint_info, paint_offset);
|
| LayoutTable* table = layout_table_section_.Table();
|
| - if (table->Header() == layout_table_section_)
|
| + if (table->Header() == layout_table_section_) {
|
| PaintRepeatingHeaderGroup(paint_info, paint_offset, kPaintCollapsedBorders);
|
| + } else if (table->Footer() == layout_table_section_) {
|
| + PaintRepeatingFooterGroup(paint_info, paint_offset, kPaintCollapsedBorders);
|
| + }
|
| }
|
|
|
| void TableSectionPainter::PaintCollapsedSectionBorders(
|
|
|