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 609c713bb82745b5aa75a938fe01ffc0c1edc31a..67af45c2514fb14aec3e1f65d1c3a99a5fa1754e 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutTableCell.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutTableCell.cpp |
@@ -59,6 +59,8 @@ LayoutTableCell::LayoutTableCell(Element* element) |
: LayoutBlockFlow(element), |
absolute_column_index_(kUnsetColumnIndex), |
cell_width_changed_(false), |
+ collapsed_border_values_valid_(false), |
+ collapsed_borders_visually_changed_(false), |
intrinsic_padding_before_(0), |
intrinsic_padding_after_(0) { |
// We only update the flags when notified of DOM changes in |
@@ -596,36 +598,34 @@ bool LayoutTableCell::HasEndBorderAdjoiningTable() const { |
return HasSameDirectionAs(Table()) ? IsInEndColumn() : IsInStartColumn(); |
} |
-CollapsedBorderValue LayoutTableCell::ComputeCollapsedStartBorder( |
- IncludeBorderColorOrNot include_color) const { |
+CollapsedBorderValue LayoutTableCell::ComputeCollapsedStartBorder() const { |
LayoutTable* table = this->Table(); |
+ LayoutTableCell* cell_before = table->CellBefore(this); |
+ // We can use the border shared with cellBefore if it is valid. |
wkorman
2017/04/27 20:11:15
cellBefore -> |cell_before|
Xianzhu
2017/04/28 20:31:44
Done.
|
+ if (cell_before && cell_before->collapsed_border_values_valid_ && |
+ cell_before->RowIndex() == RowIndex()) { |
+ return cell_before->GetCollapsedBorderValues() |
+ ? cell_before->GetCollapsedBorderValues()->EndBorder() |
+ : CollapsedBorderValue(); |
+ } |
// For the start border, we need to check, in order of precedence: |
// (1) Our start border. |
- int start_color_property = include_color |
- ? CSSProperty::ResolveDirectionAwareProperty( |
- CSSPropertyWebkitBorderStartColor, |
- StyleForCellFlow().Direction(), |
- StyleForCellFlow().GetWritingMode()) |
- : 0; |
- int end_color_property = |
- include_color |
- ? CSSProperty::ResolveDirectionAwareProperty( |
- CSSPropertyWebkitBorderEndColor, StyleForCellFlow().Direction(), |
- StyleForCellFlow().GetWritingMode()) |
- : 0; |
- CollapsedBorderValue result( |
- Style()->BorderStart(), |
- include_color ? ResolveColor(start_color_property) : Color(), |
- kBorderPrecedenceCell); |
+ int start_color_property = CSSProperty::ResolveDirectionAwareProperty( |
+ CSSPropertyWebkitBorderStartColor, StyleForCellFlow().Direction(), |
+ StyleForCellFlow().GetWritingMode()); |
+ int end_color_property = CSSProperty::ResolveDirectionAwareProperty( |
+ CSSPropertyWebkitBorderEndColor, StyleForCellFlow().Direction(), |
+ StyleForCellFlow().GetWritingMode()); |
+ CollapsedBorderValue result(Style()->BorderStart(), |
+ ResolveColor(start_color_property), |
+ kBorderPrecedenceCell); |
// (2) The end border of the preceding cell. |
- LayoutTableCell* cell_before = table->CellBefore(this); |
if (cell_before) { |
CollapsedBorderValue cell_before_adjoining_border = CollapsedBorderValue( |
cell_before->BorderAdjoiningCellAfter(this), |
- include_color ? cell_before->ResolveColor(end_color_property) : Color(), |
- kBorderPrecedenceCell); |
+ cell_before->ResolveColor(end_color_property), kBorderPrecedenceCell); |
// |result| should be the 2nd argument as |cellBefore| should win in case of |
// equality per CSS 2.1 (Border conflict resolution, point 4). |
result = ChooseBorder(cell_before_adjoining_border, result); |
@@ -637,21 +637,19 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedStartBorder( |
if (start_border_adjoins_table) { |
// (3) Our row's start border. |
result = ChooseBorder( |
- result, CollapsedBorderValue( |
- Row()->BorderAdjoiningStartCell(this), |
- include_color ? Parent()->ResolveColor(start_color_property) |
- : Color(), |
- kBorderPrecedenceRow)); |
+ result, |
+ CollapsedBorderValue(Row()->BorderAdjoiningStartCell(this), |
+ Parent()->ResolveColor(start_color_property), |
+ kBorderPrecedenceRow)); |
if (!result.Exists()) |
return result; |
// (4) Our row group's start border. |
result = ChooseBorder( |
- result, CollapsedBorderValue(Section()->BorderAdjoiningStartCell(this), |
- include_color ? Section()->ResolveColor( |
- start_color_property) |
- : Color(), |
- kBorderPrecedenceRowGroup)); |
+ result, |
+ CollapsedBorderValue(Section()->BorderAdjoiningStartCell(this), |
+ Section()->ResolveColor(start_color_property), |
+ kBorderPrecedenceRowGroup)); |
if (!result.Exists()) |
return result; |
} |
@@ -666,9 +664,7 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedStartBorder( |
result, |
CollapsedBorderValue( |
col_and_col_group.colgroup->BorderAdjoiningCellStartBorder(this), |
- include_color |
- ? col_and_col_group.colgroup->ResolveColor(start_color_property) |
- : Color(), |
+ col_and_col_group.colgroup->ResolveColor(start_color_property), |
kBorderPrecedenceColumnGroup)); |
if (!result.Exists()) |
return result; |
@@ -681,9 +677,7 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedStartBorder( |
result = ChooseBorder( |
result, CollapsedBorderValue( |
col_and_col_group.col->BorderAdjoiningCellStartBorder(this), |
- include_color ? col_and_col_group.col->ResolveColor( |
- start_color_property) |
- : Color(), |
+ col_and_col_group.col->ResolveColor(start_color_property), |
kBorderPrecedenceColumn)); |
if (!result.Exists()) |
return result; |
@@ -699,9 +693,7 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedStartBorder( |
result = ChooseBorder( |
CollapsedBorderValue( |
col_and_col_group.colgroup->BorderAdjoiningCellEndBorder(this), |
- include_color |
- ? col_and_col_group.colgroup->ResolveColor(end_color_property) |
- : Color(), |
+ col_and_col_group.colgroup->ResolveColor(end_color_property), |
kBorderPrecedenceColumnGroup), |
result); |
if (!result.Exists()) |
@@ -715,9 +707,7 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedStartBorder( |
result = ChooseBorder( |
CollapsedBorderValue( |
col_and_col_group.col->BorderAdjoiningCellAfter(this), |
- include_color |
- ? col_and_col_group.col->ResolveColor(end_color_property) |
- : Color(), |
+ col_and_col_group.col->ResolveColor(end_color_property), |
kBorderPrecedenceColumn), |
result); |
if (!result.Exists()) |
@@ -728,11 +718,9 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedStartBorder( |
if (start_border_adjoins_table) { |
// (7) The table's start border. |
result = ChooseBorder( |
- result, |
- CollapsedBorderValue( |
- table->TableStartBorderAdjoiningCell(this), |
- include_color ? table->ResolveColor(start_color_property) : Color(), |
- kBorderPrecedenceTable)); |
+ result, CollapsedBorderValue(table->TableStartBorderAdjoiningCell(this), |
+ table->ResolveColor(start_color_property), |
+ kBorderPrecedenceTable)); |
if (!result.Exists()) |
return result; |
} |
@@ -740,68 +728,60 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedStartBorder( |
return result; |
} |
-CollapsedBorderValue LayoutTableCell::ComputeCollapsedEndBorder( |
- IncludeBorderColorOrNot include_color) const { |
+CollapsedBorderValue LayoutTableCell::ComputeCollapsedEndBorder() const { |
LayoutTable* table = this->Table(); |
// Note: We have to use the effective column information instead of whether we |
// have a cell after as a table doesn't have to be regular (any row can have |
// less cells than the total cell count). |
- bool is_end_column = table->AbsoluteColumnToEffectiveColumn( |
- AbsoluteColumnIndex() + ColSpan() - 1) == |
- table->NumEffectiveColumns() - 1; |
+ bool is_end_column = IsInEndColumn(); |
+ LayoutTableCell* cell_after = |
+ is_end_column ? nullptr : table->CellAfter(this); |
+ // We can use the border shared with cellAfter if it is valid. |
+ if (cell_after && cell_after->collapsed_border_values_valid_ && |
+ cell_after->RowIndex() == RowIndex()) { |
+ return cell_after->GetCollapsedBorderValues() |
+ ? cell_after->GetCollapsedBorderValues()->StartBorder() |
+ : CollapsedBorderValue(); |
+ } |
// For end border, we need to check, in order of precedence: |
// (1) Our end border. |
- int start_color_property = include_color |
- ? CSSProperty::ResolveDirectionAwareProperty( |
- CSSPropertyWebkitBorderStartColor, |
- StyleForCellFlow().Direction(), |
- StyleForCellFlow().GetWritingMode()) |
- : 0; |
- int end_color_property = |
- include_color |
- ? CSSProperty::ResolveDirectionAwareProperty( |
- CSSPropertyWebkitBorderEndColor, StyleForCellFlow().Direction(), |
- StyleForCellFlow().GetWritingMode()) |
- : 0; |
+ int start_color_property = CSSProperty::ResolveDirectionAwareProperty( |
wkorman
2017/04/27 20:11:15
We do similar to these 3 lines about 8 times in th
Xianzhu
2017/04/28 20:31:44
Done.
|
+ CSSPropertyWebkitBorderStartColor, StyleForCellFlow().Direction(), |
+ StyleForCellFlow().GetWritingMode()); |
+ int end_color_property = CSSProperty::ResolveDirectionAwareProperty( |
+ CSSPropertyWebkitBorderEndColor, StyleForCellFlow().Direction(), |
+ StyleForCellFlow().GetWritingMode()); |
CollapsedBorderValue result = CollapsedBorderValue( |
- Style()->BorderEnd(), |
- include_color ? ResolveColor(end_color_property) : Color(), |
+ Style()->BorderEnd(), ResolveColor(end_color_property), |
kBorderPrecedenceCell); |
// (2) The start border of the following cell. |
- if (!is_end_column) { |
- if (LayoutTableCell* cell_after = table->CellAfter(this)) { |
- CollapsedBorderValue cell_after_adjoining_border = CollapsedBorderValue( |
- cell_after->BorderAdjoiningCellBefore(this), |
- include_color ? cell_after->ResolveColor(start_color_property) |
- : Color(), |
- kBorderPrecedenceCell); |
- result = ChooseBorder(result, cell_after_adjoining_border); |
- if (!result.Exists()) |
- return result; |
- } |
+ if (cell_after) { |
+ CollapsedBorderValue cell_after_adjoining_border = CollapsedBorderValue( |
+ cell_after->BorderAdjoiningCellBefore(this), |
+ cell_after->ResolveColor(start_color_property), kBorderPrecedenceCell); |
+ result = ChooseBorder(result, cell_after_adjoining_border); |
+ if (!result.Exists()) |
+ return result; |
} |
bool end_border_adjoins_table = HasEndBorderAdjoiningTable(); |
if (end_border_adjoins_table) { |
// (3) Our row's end border. |
result = ChooseBorder( |
- result, CollapsedBorderValue( |
- Row()->BorderAdjoiningEndCell(this), |
- include_color ? Parent()->ResolveColor(end_color_property) |
- : Color(), |
- kBorderPrecedenceRow)); |
+ result, CollapsedBorderValue(Row()->BorderAdjoiningEndCell(this), |
+ Parent()->ResolveColor(end_color_property), |
+ kBorderPrecedenceRow)); |
if (!result.Exists()) |
return result; |
// (4) Our row group's end border. |
result = ChooseBorder( |
- result, CollapsedBorderValue( |
- Section()->BorderAdjoiningEndCell(this), |
- include_color ? Section()->ResolveColor(end_color_property) |
- : Color(), |
- kBorderPrecedenceRowGroup)); |
+ result, |
+ CollapsedBorderValue(Section()->BorderAdjoiningEndCell(this), |
+ Section()->ResolveColor(end_color_property), |
+ kBorderPrecedenceRowGroup)); |
if (!result.Exists()) |
return result; |
} |
@@ -816,9 +796,7 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedEndBorder( |
result, |
CollapsedBorderValue( |
col_and_col_group.colgroup->BorderAdjoiningCellEndBorder(this), |
- include_color |
- ? col_and_col_group.colgroup->ResolveColor(end_color_property) |
- : Color(), |
+ col_and_col_group.colgroup->ResolveColor(end_color_property), |
kBorderPrecedenceColumnGroup)); |
if (!result.Exists()) |
return result; |
@@ -831,9 +809,7 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedEndBorder( |
result = ChooseBorder( |
result, CollapsedBorderValue( |
col_and_col_group.col->BorderAdjoiningCellEndBorder(this), |
- include_color ? col_and_col_group.col->ResolveColor( |
- end_color_property) |
- : Color(), |
+ col_and_col_group.col->ResolveColor(end_color_property), |
kBorderPrecedenceColumn)); |
if (!result.Exists()) |
return result; |
@@ -851,9 +827,7 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedEndBorder( |
result, |
CollapsedBorderValue( |
col_and_col_group.colgroup->BorderAdjoiningCellStartBorder(this), |
- include_color ? col_and_col_group.colgroup->ResolveColor( |
- start_color_property) |
- : Color(), |
+ col_and_col_group.colgroup->ResolveColor(start_color_property), |
kBorderPrecedenceColumnGroup)); |
if (!result.Exists()) |
return result; |
@@ -866,9 +840,7 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedEndBorder( |
result = ChooseBorder( |
result, CollapsedBorderValue( |
col_and_col_group.col->BorderAdjoiningCellBefore(this), |
- include_color ? col_and_col_group.col->ResolveColor( |
- start_color_property) |
- : Color(), |
+ col_and_col_group.col->ResolveColor(start_color_property), |
kBorderPrecedenceColumn)); |
if (!result.Exists()) |
return result; |
@@ -878,11 +850,9 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedEndBorder( |
if (end_border_adjoins_table) { |
// (7) The table's end border. |
result = ChooseBorder( |
- result, |
- CollapsedBorderValue( |
- table->TableEndBorderAdjoiningCell(this), |
- include_color ? table->ResolveColor(end_color_property) : Color(), |
- kBorderPrecedenceTable)); |
+ result, CollapsedBorderValue(table->TableEndBorderAdjoiningCell(this), |
+ table->ResolveColor(end_color_property), |
+ kBorderPrecedenceTable)); |
if (!result.Exists()) |
return result; |
} |
@@ -890,37 +860,34 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedEndBorder( |
return result; |
} |
-CollapsedBorderValue LayoutTableCell::ComputeCollapsedBeforeBorder( |
- IncludeBorderColorOrNot include_color) const { |
+CollapsedBorderValue LayoutTableCell::ComputeCollapsedBeforeBorder() const { |
LayoutTable* table = this->Table(); |
+ LayoutTableCell* prev_cell = table->CellAbove(this); |
+ // We can use the border shared with prevCell if it is valid. |
wkorman
2017/04/27 20:11:15
prevCell -> |prev_cell|
Xianzhu
2017/04/28 20:31:44
Done.
|
+ if (prev_cell && prev_cell->collapsed_border_values_valid_ && |
+ prev_cell->AbsoluteColumnIndex() == AbsoluteColumnIndex()) { |
+ return prev_cell->GetCollapsedBorderValues() |
+ ? prev_cell->GetCollapsedBorderValues()->AfterBorder() |
+ : CollapsedBorderValue(); |
+ } |
// For before border, we need to check, in order of precedence: |
// (1) Our before border. |
- int before_color_property = include_color |
- ? CSSProperty::ResolveDirectionAwareProperty( |
- CSSPropertyWebkitBorderBeforeColor, |
- StyleForCellFlow().Direction(), |
- StyleForCellFlow().GetWritingMode()) |
- : 0; |
- int after_color_property = include_color |
- ? CSSProperty::ResolveDirectionAwareProperty( |
- CSSPropertyWebkitBorderAfterColor, |
- StyleForCellFlow().Direction(), |
- StyleForCellFlow().GetWritingMode()) |
- : 0; |
+ int before_color_property = CSSProperty::ResolveDirectionAwareProperty( |
+ CSSPropertyWebkitBorderBeforeColor, StyleForCellFlow().Direction(), |
+ StyleForCellFlow().GetWritingMode()); |
+ int after_color_property = CSSProperty::ResolveDirectionAwareProperty( |
+ CSSPropertyWebkitBorderAfterColor, StyleForCellFlow().Direction(), |
+ StyleForCellFlow().GetWritingMode()); |
CollapsedBorderValue result = CollapsedBorderValue( |
- Style()->BorderBefore(), |
- include_color ? ResolveColor(before_color_property) : Color(), |
+ Style()->BorderBefore(), ResolveColor(before_color_property), |
kBorderPrecedenceCell); |
- LayoutTableCell* prev_cell = table->CellAbove(this); |
if (prev_cell) { |
// (2) A before cell's after border. |
result = ChooseBorder( |
CollapsedBorderValue(prev_cell->Style()->BorderAfter(), |
- include_color |
- ? prev_cell->ResolveColor(after_color_property) |
- : Color(), |
+ prev_cell->ResolveColor(after_color_property), |
kBorderPrecedenceCell), |
result); |
if (!result.Exists()) |
@@ -929,11 +896,10 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedBeforeBorder( |
// (3) Our row's before border. |
result = ChooseBorder( |
- result, CollapsedBorderValue( |
- Parent()->Style()->BorderBefore(), |
- include_color ? Parent()->ResolveColor(before_color_property) |
- : Color(), |
- kBorderPrecedenceRow)); |
+ result, |
+ CollapsedBorderValue(Parent()->Style()->BorderBefore(), |
+ Parent()->ResolveColor(before_color_property), |
+ kBorderPrecedenceRow)); |
if (!result.Exists()) |
return result; |
@@ -947,11 +913,9 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedBeforeBorder( |
if (prev_row) { |
result = ChooseBorder( |
- CollapsedBorderValue( |
- prev_row->Style()->BorderAfter(), |
- include_color ? prev_row->ResolveColor(after_color_property) |
- : Color(), |
- kBorderPrecedenceRow), |
+ CollapsedBorderValue(prev_row->Style()->BorderAfter(), |
+ prev_row->ResolveColor(after_color_property), |
+ kBorderPrecedenceRow), |
result); |
if (!result.Exists()) |
return result; |
@@ -963,11 +927,10 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedBeforeBorder( |
if (!RowIndex()) { |
// (5) Our row group's before border. |
result = ChooseBorder( |
- result, CollapsedBorderValue(curr_section->Style()->BorderBefore(), |
- include_color ? curr_section->ResolveColor( |
- before_color_property) |
- : Color(), |
- kBorderPrecedenceRowGroup)); |
+ result, |
+ CollapsedBorderValue(curr_section->Style()->BorderBefore(), |
+ curr_section->ResolveColor(before_color_property), |
+ kBorderPrecedenceRowGroup)); |
if (!result.Exists()) |
return result; |
@@ -975,11 +938,9 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedBeforeBorder( |
curr_section = table->SectionAbove(curr_section, kSkipEmptySections); |
if (curr_section) { |
result = ChooseBorder( |
- CollapsedBorderValue( |
- curr_section->Style()->BorderAfter(), |
- include_color ? curr_section->ResolveColor(after_color_property) |
- : Color(), |
- kBorderPrecedenceRowGroup), |
+ CollapsedBorderValue(curr_section->Style()->BorderAfter(), |
+ curr_section->ResolveColor(after_color_property), |
+ kBorderPrecedenceRowGroup), |
result); |
if (!result.Exists()) |
return result; |
@@ -994,22 +955,19 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedBeforeBorder( |
if (col_elt) { |
result = ChooseBorder( |
result, |
- CollapsedBorderValue( |
- col_elt->Style()->BorderBefore(), |
- include_color ? col_elt->ResolveColor(before_color_property) |
- : Color(), |
- kBorderPrecedenceColumn)); |
+ CollapsedBorderValue(col_elt->Style()->BorderBefore(), |
+ col_elt->ResolveColor(before_color_property), |
+ kBorderPrecedenceColumn)); |
if (!result.Exists()) |
return result; |
if (LayoutTableCol* enclosing_column_group = |
col_elt->EnclosingColumnGroup()) { |
result = ChooseBorder( |
- result, CollapsedBorderValue( |
- enclosing_column_group->Style()->BorderBefore(), |
- include_color ? enclosing_column_group->ResolveColor( |
- before_color_property) |
- : Color(), |
- kBorderPrecedenceColumnGroup)); |
+ result, |
+ CollapsedBorderValue( |
+ enclosing_column_group->Style()->BorderBefore(), |
+ enclosing_column_group->ResolveColor(before_color_property), |
+ kBorderPrecedenceColumnGroup)); |
if (!result.Exists()) |
return result; |
} |
@@ -1017,11 +975,9 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedBeforeBorder( |
// (9) The table's before border. |
result = ChooseBorder( |
- result, CollapsedBorderValue( |
- table->Style()->BorderBefore(), |
- include_color ? table->ResolveColor(before_color_property) |
- : Color(), |
- kBorderPrecedenceTable)); |
+ result, CollapsedBorderValue(table->Style()->BorderBefore(), |
+ table->ResolveColor(before_color_property), |
+ kBorderPrecedenceTable)); |
if (!result.Exists()) |
return result; |
} |
@@ -1029,61 +985,55 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedBeforeBorder( |
return result; |
} |
-CollapsedBorderValue LayoutTableCell::ComputeCollapsedAfterBorder( |
- IncludeBorderColorOrNot include_color) const { |
+CollapsedBorderValue LayoutTableCell::ComputeCollapsedAfterBorder() const { |
LayoutTable* table = this->Table(); |
+ LayoutTableCell* next_cell = table->CellBelow(this); |
+ // We can use the border shared with nextCell if it is valid. |
+ if (next_cell && next_cell->collapsed_border_values_valid_ && |
+ next_cell->AbsoluteColumnIndex() == AbsoluteColumnIndex()) { |
+ return next_cell->GetCollapsedBorderValues() |
+ ? next_cell->GetCollapsedBorderValues()->BeforeBorder() |
+ : CollapsedBorderValue(); |
+ } |
// For after border, we need to check, in order of precedence: |
// (1) Our after border. |
- int before_color_property = include_color |
- ? CSSProperty::ResolveDirectionAwareProperty( |
- CSSPropertyWebkitBorderBeforeColor, |
- StyleForCellFlow().Direction(), |
- StyleForCellFlow().GetWritingMode()) |
- : 0; |
- int after_color_property = include_color |
- ? CSSProperty::ResolveDirectionAwareProperty( |
- CSSPropertyWebkitBorderAfterColor, |
- StyleForCellFlow().Direction(), |
- StyleForCellFlow().GetWritingMode()) |
- : 0; |
+ int before_color_property = CSSProperty::ResolveDirectionAwareProperty( |
+ CSSPropertyWebkitBorderBeforeColor, StyleForCellFlow().Direction(), |
+ StyleForCellFlow().GetWritingMode()); |
+ int after_color_property = CSSProperty::ResolveDirectionAwareProperty( |
+ CSSPropertyWebkitBorderAfterColor, StyleForCellFlow().Direction(), |
+ StyleForCellFlow().GetWritingMode()); |
CollapsedBorderValue result = CollapsedBorderValue( |
- Style()->BorderAfter(), |
- include_color ? ResolveColor(after_color_property) : Color(), |
+ Style()->BorderAfter(), ResolveColor(after_color_property), |
kBorderPrecedenceCell); |
- LayoutTableCell* next_cell = table->CellBelow(this); |
if (next_cell) { |
// (2) An after cell's before border. |
result = ChooseBorder( |
- result, CollapsedBorderValue(next_cell->Style()->BorderBefore(), |
- include_color ? next_cell->ResolveColor( |
- before_color_property) |
- : Color(), |
- kBorderPrecedenceCell)); |
+ result, |
+ CollapsedBorderValue(next_cell->Style()->BorderBefore(), |
+ next_cell->ResolveColor(before_color_property), |
+ kBorderPrecedenceCell)); |
if (!result.Exists()) |
return result; |
} |
// (3) Our row's after border. (FIXME: Deal with rowspan!) |
result = ChooseBorder( |
- result, CollapsedBorderValue( |
- Parent()->Style()->BorderAfter(), |
- include_color ? Parent()->ResolveColor(after_color_property) |
- : Color(), |
- kBorderPrecedenceRow)); |
+ result, CollapsedBorderValue(Parent()->Style()->BorderAfter(), |
+ Parent()->ResolveColor(after_color_property), |
+ kBorderPrecedenceRow)); |
if (!result.Exists()) |
return result; |
// (4) The next row's before border. |
if (next_cell) { |
result = ChooseBorder( |
- result, |
- CollapsedBorderValue(next_cell->Parent()->Style()->BorderBefore(), |
- include_color ? next_cell->Parent()->ResolveColor( |
- before_color_property) |
- : Color(), |
- kBorderPrecedenceRow)); |
+ result, CollapsedBorderValue( |
+ next_cell->Parent()->Style()->BorderBefore(), |
+ next_cell->Parent()->ResolveColor(before_color_property), |
+ kBorderPrecedenceRow)); |
if (!result.Exists()) |
return result; |
} |
@@ -1093,11 +1043,10 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedAfterBorder( |
if (RowIndex() + RowSpan() >= curr_section->NumRows()) { |
// (5) Our row group's after border. |
result = ChooseBorder( |
- result, CollapsedBorderValue(curr_section->Style()->BorderAfter(), |
- include_color ? curr_section->ResolveColor( |
- after_color_property) |
- : Color(), |
- kBorderPrecedenceRowGroup)); |
+ result, |
+ CollapsedBorderValue(curr_section->Style()->BorderAfter(), |
+ curr_section->ResolveColor(after_color_property), |
+ kBorderPrecedenceRowGroup)); |
if (!result.Exists()) |
return result; |
@@ -1105,12 +1054,10 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedAfterBorder( |
curr_section = table->SectionBelow(curr_section, kSkipEmptySections); |
if (curr_section) { |
result = ChooseBorder( |
- result, |
- CollapsedBorderValue( |
- curr_section->Style()->BorderBefore(), |
- include_color ? curr_section->ResolveColor(before_color_property) |
- : Color(), |
- kBorderPrecedenceRowGroup)); |
+ result, CollapsedBorderValue( |
+ curr_section->Style()->BorderBefore(), |
+ curr_section->ResolveColor(before_color_property), |
+ kBorderPrecedenceRowGroup)); |
if (!result.Exists()) |
return result; |
} |
@@ -1123,22 +1070,20 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedAfterBorder( |
.InnermostColOrColGroup(); |
if (col_elt) { |
result = ChooseBorder( |
- result, CollapsedBorderValue(col_elt->Style()->BorderAfter(), |
- include_color ? col_elt->ResolveColor( |
- after_color_property) |
- : Color(), |
- kBorderPrecedenceColumn)); |
+ result, |
+ CollapsedBorderValue(col_elt->Style()->BorderAfter(), |
+ col_elt->ResolveColor(after_color_property), |
+ kBorderPrecedenceColumn)); |
if (!result.Exists()) |
return result; |
if (LayoutTableCol* enclosing_column_group = |
col_elt->EnclosingColumnGroup()) { |
result = ChooseBorder( |
- result, CollapsedBorderValue( |
- enclosing_column_group->Style()->BorderAfter(), |
- include_color ? enclosing_column_group->ResolveColor( |
wkorman
2017/04/27 20:11:15
Perhaps worth mentioning this color change in CL d
Xianzhu
2017/04/28 20:31:45
Done.
|
- after_color_property) |
- : Color(), |
- kBorderPrecedenceColumnGroup)); |
+ result, |
+ CollapsedBorderValue( |
+ enclosing_column_group->Style()->BorderAfter(), |
+ enclosing_column_group->ResolveColor(after_color_property), |
+ kBorderPrecedenceColumnGroup)); |
if (!result.Exists()) |
return result; |
} |
@@ -1146,11 +1091,9 @@ CollapsedBorderValue LayoutTableCell::ComputeCollapsedAfterBorder( |
// (9) The table's after border. |
result = ChooseBorder( |
- result, |
- CollapsedBorderValue( |
- table->Style()->BorderAfter(), |
- include_color ? table->ResolveColor(after_color_property) : Color(), |
- kBorderPrecedenceTable)); |
+ result, CollapsedBorderValue(table->Style()->BorderAfter(), |
+ table->ResolveColor(after_color_property), |
+ kBorderPrecedenceTable)); |
if (!result.Exists()) |
return result; |
} |
@@ -1250,8 +1193,12 @@ LayoutUnit LayoutTableCell::CollapsedBorderHalfBottom(bool outer) const { |
} |
LayoutUnit LayoutTableCell::CollapsedBorderHalfStart(bool outer) const { |
- CollapsedBorderValue border = |
- ComputeCollapsedStartBorder(kDoNotIncludeBorderColor); |
+ RecalcCollapsedBorderValuesIfNeeded(); |
+ const auto* collapsed_border_values = this->GetCollapsedBorderValues(); |
+ if (!collapsed_border_values) |
+ return LayoutUnit(); |
+ |
+ const auto& border = collapsed_border_values->StartBorder(); |
if (border.Exists()) { |
return LayoutUnit( |
(border.Width() + |
@@ -1262,8 +1209,12 @@ LayoutUnit LayoutTableCell::CollapsedBorderHalfStart(bool outer) const { |
} |
LayoutUnit LayoutTableCell::CollapsedBorderHalfEnd(bool outer) const { |
- CollapsedBorderValue border = |
- ComputeCollapsedEndBorder(kDoNotIncludeBorderColor); |
+ RecalcCollapsedBorderValuesIfNeeded(); |
+ const auto* collapsed_border_values = this->GetCollapsedBorderValues(); |
+ if (!collapsed_border_values) |
+ return LayoutUnit(); |
+ |
+ const auto& border = collapsed_border_values->EndBorder(); |
if (border.Exists()) { |
return LayoutUnit( |
(border.Width() + |
@@ -1274,8 +1225,12 @@ LayoutUnit LayoutTableCell::CollapsedBorderHalfEnd(bool outer) const { |
} |
LayoutUnit LayoutTableCell::CollapsedBorderHalfBefore(bool outer) const { |
- CollapsedBorderValue border = |
- ComputeCollapsedBeforeBorder(kDoNotIncludeBorderColor); |
+ RecalcCollapsedBorderValuesIfNeeded(); |
+ const auto* collapsed_border_values = this->GetCollapsedBorderValues(); |
+ if (!collapsed_border_values) |
+ return LayoutUnit(); |
+ |
+ const auto& border = collapsed_border_values->BeforeBorder(); |
if (border.Exists()) { |
return LayoutUnit( |
(border.Width() + |
@@ -1286,8 +1241,12 @@ LayoutUnit LayoutTableCell::CollapsedBorderHalfBefore(bool outer) const { |
} |
LayoutUnit LayoutTableCell::CollapsedBorderHalfAfter(bool outer) const { |
- CollapsedBorderValue border = |
- ComputeCollapsedAfterBorder(kDoNotIncludeBorderColor); |
+ RecalcCollapsedBorderValuesIfNeeded(); |
+ const auto* collapsed_border_values = this->GetCollapsedBorderValues(); |
+ if (!collapsed_border_values) |
+ return LayoutUnit(); |
+ |
+ const auto& border = collapsed_border_values->AfterBorder(); |
if (border.Exists()) { |
return LayoutUnit( |
(border.Width() + |
@@ -1302,6 +1261,59 @@ void LayoutTableCell::Paint(const PaintInfo& paint_info, |
TableCellPainter(*this).Paint(paint_info, paint_offset); |
} |
+void LayoutTableCell::RecalcCollapsedBorderValuesIfNeeded() const { |
wkorman
2017/04/27 20:11:15
Same as previous -- believe prefer without ...IfNe
Xianzhu
2017/04/28 20:31:44
Renamed to UpdateCollapsedBorderValues(). Simply r
|
+ Table()->InvalidateCollapsedBordersForAllCellsIfNeeded(); |
+ if (collapsed_border_values_valid_) |
+ return; |
+ |
+ collapsed_border_values_valid_ = true; |
+ |
+ if (!Table()->CollapseBorders()) { |
+ if (collapsed_border_values_) { |
+ collapsed_borders_visually_changed_ = true; |
+ collapsed_border_values_ = nullptr; |
+ } |
+ return; |
+ } |
+ |
+ CollapsedBorderValues new_values( |
+ *this, ComputeCollapsedStartBorder(), ComputeCollapsedEndBorder(), |
+ ComputeCollapsedBeforeBorder(), ComputeCollapsedAfterBorder()); |
+ |
+ // We need to save collapsed border if has a non-zero width even if it's |
+ // invisible because the width affects table layout. |
+ if (!new_values.StartBorder().Width() && !new_values.EndBorder().Width() && |
+ !new_values.BeforeBorder().Width() && !new_values.AfterBorder().Width()) { |
+ if (collapsed_border_values_) { |
+ collapsed_borders_visually_changed_ = true; |
+ collapsed_border_values_ = nullptr; |
+ } |
+ return; |
+ } |
+ |
+ if (!collapsed_border_values_) { |
+ collapsed_borders_visually_changed_ = true; |
+ collapsed_border_values_ = WTF::WrapUnique(new CollapsedBorderValues( |
+ *this, new_values.StartBorder(), new_values.EndBorder(), |
+ new_values.BeforeBorder(), new_values.AfterBorder())); |
+ return; |
+ } |
+ |
+ // We check VisuallyEquals so that the table cell is invalidated only if a |
+ // changed collapsed border is visible in the first place. |
+ if (!collapsed_border_values_->StartBorder().VisuallyEquals( |
+ new_values.StartBorder()) || |
+ !collapsed_border_values_->EndBorder().VisuallyEquals( |
+ new_values.EndBorder()) || |
+ !collapsed_border_values_->BeforeBorder().VisuallyEquals( |
+ new_values.BeforeBorder()) || |
+ !collapsed_border_values_->AfterBorder().VisuallyEquals( |
+ new_values.AfterBorder())) { |
+ collapsed_border_values_->SetCollapsedBorderValues(new_values); |
+ collapsed_borders_visually_changed_ = true; |
+ } |
+} |
+ |
static void AddBorderStyle(LayoutTable::CollapsedBorderValues& border_values, |
CollapsedBorderValue border_value) { |
if (!border_value.IsVisible()) |
@@ -1316,51 +1328,26 @@ static void AddBorderStyle(LayoutTable::CollapsedBorderValues& border_values, |
void LayoutTableCell::CollectCollapsedBorderValues( |
LayoutTable::CollapsedBorderValues& border_values) { |
- CollapsedBorderValues new_values( |
- *this, ComputeCollapsedStartBorder(), ComputeCollapsedEndBorder(), |
- ComputeCollapsedBeforeBorder(), ComputeCollapsedAfterBorder()); |
- |
- bool changed = false; |
- if (!new_values.StartBorder().IsVisible() && |
- !new_values.EndBorder().IsVisible() && |
- !new_values.BeforeBorder().IsVisible() && |
- !new_values.AfterBorder().IsVisible()) { |
- changed = !!collapsed_border_values_; |
- collapsed_border_values_ = nullptr; |
- } else if (!collapsed_border_values_) { |
- changed = true; |
- collapsed_border_values_ = WTF::WrapUnique(new CollapsedBorderValues( |
- *this, new_values.StartBorder(), new_values.EndBorder(), |
- new_values.BeforeBorder(), new_values.AfterBorder())); |
- } else { |
- // We check visuallyEquals so that the table cell is invalidated only if a |
- // changed collapsed border is visible in the first place. |
- changed = !collapsed_border_values_->StartBorder().VisuallyEquals( |
- new_values.StartBorder()) || |
- !collapsed_border_values_->EndBorder().VisuallyEquals( |
- new_values.EndBorder()) || |
- !collapsed_border_values_->BeforeBorder().VisuallyEquals( |
- new_values.BeforeBorder()) || |
- !collapsed_border_values_->AfterBorder().VisuallyEquals( |
- new_values.AfterBorder()); |
- if (changed) |
- collapsed_border_values_->SetCollapsedBorderValues(new_values); |
- } |
+ RecalcCollapsedBorderValuesIfNeeded(); |
// If collapsed borders changed, invalidate the cell's display item client on |
// the table's backing. |
// TODO(crbug.com/451090#c5): Need a way to invalidate/repaint the borders |
// only. |
- if (changed) { |
+ if (collapsed_borders_visually_changed_) { |
ObjectPaintInvalidator(*Table()) |
.SlowSetPaintingLayerNeedsRepaintAndInvalidateDisplayItemClient( |
*this, kPaintInvalidationStyleChange); |
+ collapsed_borders_visually_changed_ = false; |
} |
- AddBorderStyle(border_values, new_values.StartBorder()); |
- AddBorderStyle(border_values, new_values.EndBorder()); |
- AddBorderStyle(border_values, new_values.BeforeBorder()); |
- AddBorderStyle(border_values, new_values.AfterBorder()); |
+ if (!collapsed_border_values_) |
+ return; |
+ |
+ AddBorderStyle(border_values, collapsed_border_values_->StartBorder()); |
+ AddBorderStyle(border_values, collapsed_border_values_->EndBorder()); |
+ AddBorderStyle(border_values, collapsed_border_values_->BeforeBorder()); |
+ AddBorderStyle(border_values, collapsed_border_values_->AfterBorder()); |
} |
void LayoutTableCell::SortCollapsedBorderValues( |