Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(501)

Unified Diff: third_party/WebKit/Source/core/layout/LayoutTableCol.cpp

Issue 2791433003: Fix Border collapsing with colpsan / rowspan cells
Patch Set: bug 2902 Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/LayoutTableCol.cpp
diff --git a/third_party/WebKit/Source/core/layout/LayoutTableCol.cpp b/third_party/WebKit/Source/core/layout/LayoutTableCol.cpp
index b50985464debe297dc4fb1552c2fc7e08a4c8cb6..b46abe1379cb783d46c4e548cc4d1bbf7a14afbc 100644
--- a/third_party/WebKit/Source/core/layout/LayoutTableCol.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutTableCol.cpp
@@ -101,7 +101,7 @@ void LayoutTableCol::WillBeRemovedFromTree() {
bool LayoutTableCol::IsChildAllowed(LayoutObject* child,
const ComputedStyle& style) const {
- // We cannot use isTableColumn here as style() may return 0.
+ // We cannot use IsTableColumn here as style() may return 0.
return child->IsLayoutTableCol() && style.Display() == EDisplay::kTableColumn;
}
@@ -150,6 +150,20 @@ LayoutTableCol* LayoutTableCol::EnclosingColumnGroup() const {
return parent_column_group;
}
+LayoutTableCol* LayoutTableCol::LastColumnInGroup() const {
+ DCHECK(this->IsTableColumnGroupWithColumnChildren());
+ LayoutTableCol* end_col = nullptr;
+ LayoutTableCol* current_col = this->NextColumn();
+ // If column has children, traverse the children to find last.
+ if (this->FirstChild()) {
+ while (current_col && current_col->EnclosingColumnGroup() == this) {
+ end_col = current_col;
+ current_col = current_col->NextColumn();
+ }
+ }
+ return end_col;
+}
+
LayoutTableCol* LayoutTableCol::NextColumn() const {
// If |this| is a column-group, the next column is the colgroup's first child
// column.
@@ -161,8 +175,9 @@ LayoutTableCol* LayoutTableCol::NextColumn() const {
// Failing that, the child is the last column in a column-group, so the next
// column is the next column/column-group after its column-group.
- if (!next && Parent()->IsLayoutTableCol())
- next = Parent()->NextSibling();
+ auto p = Parent();
+ if (!next && p && p->IsLayoutTableCol())
+ next = p->NextSibling();
for (; next && !next->IsLayoutTableCol(); next = next->NextSibling()) {
}
@@ -199,4 +214,53 @@ const BorderValue& LayoutTableCol::BorderAdjoiningCellAfter(
return Style()->BorderEnd();
}
+Vector<unsigned> LayoutTableCol::GetEffectiveColumnIndexes() const {
+ LayoutTable* table = this->Table();
+ Vector<unsigned> indexes;
+ if (!table)
+ return indexes;
+ unsigned last_effective_column = table->LastEffectiveColumnIndex();
+ if (IsTableColumn()) {
+ unsigned idx = table->ColElementToAbsoluteColumn(this);
+ auto span = this->Span();
+ unsigned last_seen_column = 0xFFFFFFFF;
+ while (span--) {
+ unsigned effective_column = table->AbsoluteColumnToEffectiveColumn(idx++);
+ if (effective_column != last_seen_column &&
+ effective_column <= last_effective_column) {
+ indexes.push_back(effective_column);
+ last_seen_column = effective_column;
+ }
+ }
+ } else { // IsTableColumnGroup
+ if (IsTableColumnGroupWithColumnChildren()) {
+ LayoutTableCol* current_col = nullptr;
+ auto last_col = LastColumnInGroup();
+ do {
+ current_col = current_col ? current_col->NextColumn() : NextColumn();
+ if (current_col) {
+ auto colIndexes = current_col->GetEffectiveColumnIndexes();
+ for (auto c = colIndexes.begin(); c != colIndexes.end(); c++)
+ indexes.push_back(*c);
+ }
+ } while (current_col && current_col != last_col);
+ } else { // tableColumnGroup with no children
+ // its covers span columns
+ unsigned idx = table->ColElementToAbsoluteColumn(this);
+ auto span = this->Span();
+ unsigned last_seen_column = 0xFFFFFFFF;
+ while (span--) {
+ unsigned effective_column =
+ table->AbsoluteColumnToEffectiveColumn(idx++);
+ if (effective_column != last_seen_column &&
+ effective_column <= last_effective_column) {
+ indexes.push_back(effective_column);
+ last_seen_column = effective_column;
+ }
+ }
+ }
+ }
+ return indexes;
+}
+
} // namespace blink
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutTableCol.h ('k') | third_party/WebKit/Source/core/layout/LayoutTableSection.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698