Index: third_party/WebKit/Source/core/layout/LayoutTableCell.cpp |
diff --git a/third_party/WebKit/Source/core/layout/LayoutTableCell.cpp b/third_party/WebKit/Source/core/layout/LayoutTableCell.cpp |
index d6b729806e0330285287748fdef948b7e9d40653..db9585482d1b726949726e56f2afbc3b7ec43e20 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutTableCell.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutTableCell.cpp |
@@ -409,21 +409,26 @@ LayoutSize LayoutTableCell::OffsetFromContainer(const LayoutObject* o) const { |
return offset; |
} |
-LayoutRect LayoutTableCell::LocalVisualRect() const { |
- // If the table grid is dirty, we cannot get reliable information about |
- // adjoining cells, so we ignore outside borders. This should not be a problem |
- // because it means that the table is going to recalculate the grid, relayout |
- // and issue a paint invalidation of its current rect, which includes any |
- // outside borders of this cell. |
- if (!Table()->ShouldCollapseBorders() || Table()->NeedsSectionRecalc()) |
- return LayoutBlockFlow::LocalVisualRect(); |
+void LayoutTableCell::ComputeOverflow(LayoutUnit old_client_after_edge, |
+ bool recompute_floats) { |
+ LayoutBlockFlow::ComputeOverflow(old_client_after_edge, recompute_floats); |
+ |
+ UpdateCollapsedBorderValues(); |
+ if (!collapsed_border_values_) |
+ return; |
+ // Calculate local visual rect of collapsed borders. |
+ // Our border rect already includes the inner halves of the collapsed borders, |
+ // so here we get the outer halves. |
bool rtl = !StyleForCellFlow().IsLeftToRightDirection(); |
- LayoutUnit outline_outset(Style()->OutlineOutsetExtent()); |
- LayoutUnit left(std::max(CollapsedBorderHalfLeft(true), outline_outset)); |
- LayoutUnit right(std::max(CollapsedBorderHalfRight(true), outline_outset)); |
- LayoutUnit top(std::max(CollapsedBorderHalfTop(true), outline_outset)); |
- LayoutUnit bottom(std::max(CollapsedBorderHalfBottom(true), outline_outset)); |
+ LayoutUnit left = CollapsedBorderHalfLeft(true); |
+ LayoutUnit right = CollapsedBorderHalfRight(true); |
+ LayoutUnit top = CollapsedBorderHalfTop(true); |
+ LayoutUnit bottom = CollapsedBorderHalfBottom(true); |
+ |
+ // This cell's borders may be lengthened to match the widths of orthogonal |
+ // borders of adjacent cells. Expand visual overflow to cover the lengthened |
+ // parts. |
if ((left && !rtl) || (right && rtl)) { |
if (LayoutTableCell* before = Table()->CellBefore(this)) { |
top = std::max(top, before->CollapsedBorderHalfTop(true)); |
@@ -449,15 +454,16 @@ LayoutRect LayoutTableCell::LocalVisualRect() const { |
} |
} |
- LayoutRect self_visual_overflow_rect = this->SelfVisualOverflowRect(); |
- LayoutPoint location( |
- std::max(LayoutUnit(left), -self_visual_overflow_rect.X()), |
- std::max(LayoutUnit(top), -self_visual_overflow_rect.Y())); |
- return LayoutRect(-location.X(), -location.Y(), |
- location.X() + std::max(Size().Width() + right, |
- self_visual_overflow_rect.MaxX()), |
- location.Y() + std::max(Size().Height() + bottom, |
- self_visual_overflow_rect.MaxY())); |
+ LayoutRect rect = BorderBoxRect(); |
+ rect.ExpandEdges(top, right, bottom, left); |
+ collapsed_border_values_->SetLocalVisualRect(rect); |
+} |
+ |
+LayoutRect LayoutTableCell::LocalVisualRect() const { |
+ LayoutRect rect = SelfVisualOverflowRect(); |
+ if (collapsed_border_values_) |
+ rect.Unite(collapsed_border_values_->LocalVisualRect()); |
+ return rect; |
} |
int LayoutTableCell::CellBaselinePosition() const { |
@@ -1262,12 +1268,6 @@ void LayoutTableCell::Paint(const PaintInfo& paint_info, |
} |
void LayoutTableCell::UpdateCollapsedBorderValues() const { |
- Table()->InvalidateCollapsedBordersForAllCellsIfNeeded(); |
- if (collapsed_border_values_valid_) |
- return; |
- |
- collapsed_border_values_valid_ = true; |
- |
if (!Table()->ShouldCollapseBorders()) { |
if (collapsed_border_values_) { |
collapsed_borders_visually_changed_ = true; |
@@ -1276,6 +1276,12 @@ void LayoutTableCell::UpdateCollapsedBorderValues() const { |
return; |
} |
+ Table()->InvalidateCollapsedBordersForAllCellsIfNeeded(); |
+ if (collapsed_border_values_valid_) |
+ return; |
+ |
+ collapsed_border_values_valid_ = true; |
+ |
CollapsedBorderValues new_values( |
*this, ComputeCollapsedStartBorder(), ComputeCollapsedEndBorder(), |
ComputeCollapsedBeforeBorder(), ComputeCollapsedAfterBorder()); |