CSS 2.1 failure: border-conflict-element-*
https://bugs.webkit.org/show_bug.cgi?id=71244
Reviewed by Darin Adler.
Source/WebCore:
From http://www.w3.org/TR/CSS21/tables.html#border-conflict-resolution :
"When two adjacent cells have the same border-width and the same border-style in a
'border-collapse: collapse' table, then the color of the border from the leftmost cell wins
(if the table's 'direction' is 'ltr'; right, if it is 'rtl') and the color of the border
from the topmost cell wins."
RenderTable manages collapsed borders by first creating a list of unique border values sorted in ascending
priority. A unique border value is determined by style, width and color and cell-type precedence. For each
entry in this list RenderTableSection paints each cell in its section starting at the top-left. If a cell
is using the border RenderTable is currently iterating for, the cell will paint that border.
The problems with this approach are:
1. Painting cells from the top-left to the bottom-right means that borders further to the right and to the bottom
of the table will paint over those further to the left and the top, breaking the precedence due to cell position.
2. It creates more unique borders in the list than necessary. Borders that differ only on color do not need to be painted in
a separate iteration. Precedence in such cases is determined by cell position.
So in order to respect cell position when painting collapsed borders:
1. RenderTableCell now treats borders with the same style, width and precedence as equal. This results in a performance
improvement on tables where collapsed borders differ only in color, since RenderTable is no longer painting every cell in the table
for each unique collapsed border color. It also allows color to be a function of cell position rather than border type.
2. RenderTableSection now paints collapsed borders separately from cells and from the bottom-right to the top-left instead of top-left
to bottom-right. If a collapsed border has precedence due to style, width or cell-group-type it will still be respected but precedence
due to color is enforced by painting cells nearer to the top and left *after* cells nearer to the bottom and right.
The order in which collapsed borders paint over each other in the same cell has not changed. Unlike Firefox,
WebKit does not attempt render them as diagonals or attempt to give borders on the edge of the table precedence
so that grooved and ridged styles have a smooth edge all round the table.
This fixes the following failing tests from the border-conflict-element-* set
in the CSS 2.1 test suite:
border-conflict-element-001d.htm
border-conflict-element-0037.htm
border-conflict-element-0038.htm
One test in the suite is known to be wrong, so a corrected version has been landed outside the
css2.1 folder:
border-conflict-element-002.htm
This change entails rebaselining quite a few tests, see the LayoutTests ChangeLog for a full
explanation of the rebaselines.
* rendering/RenderTableCell.cpp:
(WebCore::RenderTableCell::paint):
(WebCore::addBorderStyle):
(WebCore::compareBorderValuesForQSort):
(WebCore::RenderTableCell::paintCollapsedBorders):
* rendering/RenderTableCell.h:
* rendering/RenderTableSection.cpp:
(WebCore::RenderTableSection::paintCell):
(WebCore::RenderTableSection::paintObject):
* rendering/style/CollapsedBorderValue.h:
(WebCore::CollapsedBorderValue::isSameIgnoringColor):
LayoutTests:
Add all the passing border-conflict-element* tests from the CSS 2.1 test suite.
Add a corrected version of the CSS suite test border-conflict-element-002.htm, which can sit here until
the corrected version is landed upstream. See http://lists.w3.org/Archives/Public/public-css-testsuite/2011Nov/0002.html
Rebaseline all t170602-bdr-conflct-w-* tests. The rendering of the collapsed borders in these
tests now obeys the order of precedence for the position of the cell and the precendece of the position
of the borders within the same cell.
Rebaseline two border-conflict-style-* tests: ditto
Rebaseline fast/borders/border-antialiasing.html, the result is too small to confirm the difference but
presume it is one of the above.
Rebaseline floating-replaced-height-008.html as the support file it uses is added by this patch (in order to
support border-conflict-element-001d.htm).
* css2.1/20110323/border-conflict-element-001-expected.html: Added.
* css2.1/20110323/border-conflict-element-001.htm: Added.
* css2.1/20110323/border-conflict-element-001d-expected.html: Added.
* css2.1/20110323/border-conflict-element-001d.htm: Added.
* css2.1/20110323/border-conflict-element-003-expected.html: Added.
* css2.1/20110323/border-conflict-element-003.htm: Added.
* css2.1/20110323/border-conflict-element-004-expected.html: Added.
* css2.1/20110323/border-conflict-element-004.htm: Added.
* css2.1/20110323/border-conflict-element-005-expected.html: Added.
* css2.1/20110323/border-conflict-element-005.htm: Added.
* css2.1/20110323/border-conflict-element-006-expected.html: Added.
* css2.1/20110323/border-conflict-element-006.htm: Added.
* css2.1/20110323/border-conflict-element-007-expected.html: Added.
* css2.1/20110323/border-conflict-element-007.htm: Added.
* css2.1/20110323/border-conflict-element-008-expected.html: Added.
* css2.1/20110323/border-conflict-element-008.htm: Added.
* css2.1/20110323/border-conflict-element-009-expected.html: Added.
* css2.1/20110323/border-conflict-element-009.htm: Added.
* css2.1/20110323/border-conflict-element-010-expected.html: Added.
* css2.1/20110323/border-conflict-element-010.htm: Added.
* css2.1/20110323/border-conflict-element-011-expected.html: Added.
* css2.1/20110323/border-conflict-element-011.htm: Added.
* css2.1/20110323/border-conflict-element-012-expected.html: Added.
* css2.1/20110323/border-conflict-element-012.htm: Added.
* css2.1/20110323/border-conflict-element-013-expected.html: Added.
* css2.1/20110323/border-conflict-element-013.htm: Added.
* css2.1/20110323/border-conflict-element-014-expected.html: Added.
* css2.1/20110323/border-conflict-element-014.htm: Added.
* css2.1/20110323/border-conflict-element-015-expected.html: Added.
* css2.1/20110323/border-conflict-element-015.htm: Added.
* css2.1/20110323/border-conflict-element-016-expected.html: Added.
* css2.1/20110323/border-conflict-element-016.htm: Added.
* css2.1/20110323/border-conflict-element-017-expected.html: Added.
* css2.1/20110323/border-conflict-element-017.htm: Added.
* css2.1/20110323/border-conflict-element-018-expected.html: Added.
* css2.1/20110323/border-conflict-element-018.htm: Added.
* css2.1/20110323/border-conflict-element-019-expected.html: Added.
* css2.1/20110323/border-conflict-element-019.htm: Added.
* css2.1/20110323/border-conflict-element-020-expected.html: Added.
* css2.1/20110323/border-conflict-element-020.htm: Added.
* css2.1/20110323/border-conflict-element-021-expected.html: Added.
* css2.1/20110323/border-conflict-element-021.htm: Added.
* css2.1/20110323/border-conflict-element-022-expected.html: Added.
* css2.1/20110323/border-conflict-element-022.htm: Added.
* css2.1/20110323/border-conflict-element-023-expected.html: Added.
* css2.1/20110323/border-conflict-element-023.htm: Added.
* css2.1/20110323/border-conflict-element-024-expected.html: Added.
* css2.1/20110323/border-conflict-element-024.htm: Added.
* css2.1/20110323/border-conflict-element-025-expected.html: Added.
* css2.1/20110323/border-conflict-element-025.htm: Added.
* css2.1/20110323/border-conflict-element-026-expected.html: Added.
* css2.1/20110323/border-conflict-element-026.htm: Added.
* css2.1/20110323/border-conflict-element-027-expected.html: Added.
* css2.1/20110323/border-conflict-element-027.htm: Added.
* css2.1/20110323/border-conflict-element-028-expected.html: Added.
* css2.1/20110323/border-conflict-element-028.htm: Added.
* css2.1/20110323/border-conflict-element-029-expected.html: Added.
* css2.1/20110323/border-conflict-element-029.htm: Added.
* css2.1/20110323/border-conflict-element-030-expected.html: Added.
* css2.1/20110323/border-conflict-element-030.htm: Added.
* css2.1/20110323/border-conflict-element-031-expected.html: Added.
* css2.1/20110323/border-conflict-element-031.htm: Added.
* css2.1/20110323/border-conflict-element-032-expected.html: Added.
* css2.1/20110323/border-conflict-element-032.htm: Added.
* css2.1/20110323/border-conflict-element-033-expected.html: Added.
* css2.1/20110323/border-conflict-element-033.htm: Added.
* css2.1/20110323/border-conflict-element-034-expected.html: Added.
* css2.1/20110323/border-conflict-element-034.htm: Added.
* css2.1/20110323/border-conflict-element-035-expected.html: Added.
* css2.1/20110323/border-conflict-element-035.htm: Added.
* css2.1/20110323/border-conflict-element-036-expected.html: Added.
* css2.1/20110323/border-conflict-element-036.htm: Added.
* css2.1/20110323/border-conflict-element-037-expected.html: Added.
* css2.1/20110323/border-conflict-element-037.htm: Added.
* css2.1/20110323/border-conflict-element-038-expected.html: Added.
* css2.1/20110323/border-conflict-element-038.htm: Added.
* css2.1/20110323/border-conflict-element-039-expected.html: Added.
* css2.1/20110323/border-conflict-element-039.htm: Added.
* css2.1/20110323/support/swatch-blue.png: Added.
* css2.1/20110323/support/swatch-green.png: Added.
* css2.1/20110323/support/swatch-lime.png: Added.
* css2.1/20110323/support/swatch-orange.png: Added.
* css2.1/20110323/support/swatch-red.png: Added.
* css2.1/20110323/support/swatch-teal.png: Added.
* css2.1/20110323/support/swatch-white.png: Added.
* css2.1/20110323/support/swatch-yellow.png: Added.
* fast/css/border-conflict-element-002-expected.html: Added.
* fast/css/border-conflict-element-002.htm: Added.
* platform/chromium-linux/css2.1/20110323/border-conflict-style-079-expected.png:
* platform/chromium-linux/css2.1/20110323/floating-replaced-height-008-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-05-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-06-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-07-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-08-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-15-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-16-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-17-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-18-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-51-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-52-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-53-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-54-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-55-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-56-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-57-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-58-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-59-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-61-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-62-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-63-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-64-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-65-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-66-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-67-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-68-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-69-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-71-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-72-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-73-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-74-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-75-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-76-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-77-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-78-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-79-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-81-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-82-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-83-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-84-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-85-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-86-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-87-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-88-d-expected.png:
* platform/chromium-linux/css2.1/t170602-bdr-conflct-w-89-d-expected.png:
* platform/chromium-linux/fast/borders/border-antialiasing-expected.png:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@103251 268f45cc-cd09-0410-ab3c-d52691b4dbfc
145 files changed