diff --git a/layout/tables/nsTableFrame.cpp b/layout/tables/nsTableFrame.cpp index 0129c749360a790cf6f4e6aa30a9577b3f9bedaf..e932f2b98c2787c51d5a55a34d7d9cd290b7ea47 100644 --- a/layout/tables/nsTableFrame.cpp +++ b/layout/tables/nsTableFrame.cpp @@ -7285,6 +7285,22 @@ void BCPaintBorderIterator::AccumulateOrDoActionBlockDirSegment( } } blockDirSeg.AdvanceOffsetB(); + // If the row is empty and cell borders are defined, the row will be + // zero-sized (If there existed an empty cell, it'd be sized to contain + // the cell's borders). In this case, we effectively need to "pull up" + // where the segment starts (Unless the empty row has enough block size). + if (mRow->PrincipalChildList().IsEmpty()) { + const auto rowSize = mRow->BSize(mTableWM); + if (blockDirSeg.mBEndOffset > 0 && blockDirSeg.mBEndOffset > rowSize) { + blockDirSeg.mOffsetB -= blockDirSeg.mBEndOffset - rowSize; + } else if (blockDirSeg.mBEndOffset < 0 && + -blockDirSeg.mBEndOffset > rowSize) { + // For cases of segments that don't have bevel (e.g. inner block + // direction borders). Since they "end early," the block end offset is + // negative. + blockDirSeg.mOffsetB += blockDirSeg.mBEndOffset + rowSize; + } + } } blockDirSeg.Start(*this, borderOwner, blockSegISize, inlineSegBSize); } diff --git a/testing/web-platform/tests/css/CSS2/tables/border-collapse-empty-row-ref.html b/testing/web-platform/tests/css/CSS2/tables/border-collapse-empty-row-ref.html new file mode 100644 index 0000000000000000000000000000000000000000..ca1108ccd7bf733e26e3bb6f9105404063da942a --- /dev/null +++ b/testing/web-platform/tests/css/CSS2/tables/border-collapse-empty-row-ref.html @@ -0,0 +1,69 @@ +<!DOCTYPE html> +<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com"> +<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#collapsing-borders"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1819266"> +<meta name="assert" content="This test checks that collapsed border does not paint outside of its expected area."> +<style> +table { + display: inline-table; + border-collapse: collapse; +} + +td { + border: 10px solid black; + line-height: 0; + padding: 0; +} + +span { + display: inline-block; + width: 10px; + height: 10px; + background: grey; +} + +.spacer-1 tr:not(:last-child) td { + border-bottom: 12px solid black; +} + +.spacer-2 tr:not(:last-child) td { + border-bottom: 15px solid black; +} + +.spacer-3 tr:not(:last-child) td { + border-bottom: 20px solid black; +} + +</style> +<table> +<tr><td><span></span></td><td><span></span></td></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr><td><span></span></td><td><span></span></td></tr> +</table> +<table class="spacer-1"> +<tr><td><span></span></td><td><span></span></td></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr><td><span></span></td><td><span></span></td></tr> +</table> +<table class="spacer-2"> +<tr><td><span></span></td><td><span></span></td></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr><td><span></span></td><td><span></span></td></tr> +</table> +<table class="spacer-3"> +<tr><td><span></span></td><td><span></span></td></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr><td><span></span></td><td><span></span></td></tr> +</table> diff --git a/testing/web-platform/tests/css/CSS2/tables/border-collapse-empty-row.html b/testing/web-platform/tests/css/CSS2/tables/border-collapse-empty-row.html new file mode 100644 index 0000000000000000000000000000000000000000..c4114a145df0c18ee6745c3cb3e74388609a9eb9 --- /dev/null +++ b/testing/web-platform/tests/css/CSS2/tables/border-collapse-empty-row.html @@ -0,0 +1,93 @@ +<!DOCTYPE html> +<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com"> +<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#collapsing-borders"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1819266"> +<link rel="match" href="border-collapse-empty-row-ref.html"> +<meta name="assert" content="This test checks that collapsed border does not paint outside of its expected area."> +<style> +table { + display: inline-table; + border-collapse: collapse; +} + +td { + border: 10px solid black; + line-height: 0; + padding: 0; +} + +span { + display: inline-block; + width: 10px; + height: 10px; + background: grey; +} + +.spacer-1 { + height: 2px; +} + +.spacer-2 { + height: 5px; +} + +.spacer-3 { + height: 10px; +} +</style> +<!-- Empty rows --> +<table> +<tr><td><span></span></td><td><span></span></td></tr> +<tr></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr></tr> +<tr><td><span></span></td><td><span></span></td></tr> +</table> +<!-- Empty rows, sized less than collapsed border offset (10px / 2 = 5px). --> +<table> +<tr><td><span></span></td><td><span></span></td></tr> +<tr class="spacer-1"></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr class="spacer-1"></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr class="spacer-1"></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr class="spacer-1"></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr class="spacer-1"></tr> +<tr><td><span></span></td><td><span></span></td></tr> +</table> +<!-- Empty rows, sized exactly at collapsed border offset. --> +<table> +<tr><td><span></span></td><td><span></span></td></tr> +<tr class="spacer-2"></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr class="spacer-2"></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr class="spacer-2"></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr class="spacer-2"></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr class="spacer-2"></tr> +<tr><td><span></span></td><td><span></span></td></tr> +</table> +<!-- Empty rows, sized larger than collapsed border offset. --> +<table> +<tr><td><span></span></td><td><span></span></td></tr> +<tr class="spacer-3"></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr class="spacer-3"></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr class="spacer-3"></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr class="spacer-3"></tr> +<tr><td><span></span></td><td><span></span></td></tr> +<tr class="spacer-3"></tr> +<tr><td><span></span></td><td><span></span></td></tr> +</table>