haikuwebkit/LayoutTests/fast/multicol/newmulticol
Simon Fraser ab23c891c4 getBoundingClientRect() returns the incorrect rectangle on elements whose parent element is set -webkit-column-count
https://bugs.webkit.org/show_bug.cgi?id=99959
rdar://80106111

Reviewed by Alan Bujtas.
Source/WebCore:

getBoundingClientRect() and getClientRects() for elements inside multicol had a quick
and dirty implementation that just mapped the element center point into a column. This
resulted in odd, negative top/left in some cases.

Fix by correctly generating multiple rects for elements that span columns, following
the repaint code path that already knew how to do this correctly.

The entry point is RenderFragmentContainer::absoluteQuadsForBox() which now has a
real implementation. For each fragment that the box covers, it calls fragmentRectsForFlowContentRect()
which generates one or more rects; RenderMultiColumnSet overrides this to
compute rects for multicol.

We have to take care not to eliminate empty rects, since the API does return these.

Tested by existing tests.

* dom/Element.cpp:
(WebCore::Element::absoluteEventBounds):
* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::absoluteQuadsIgnoringContinuation const):
* rendering/RenderBox.cpp:
(WebCore::RenderBox::absoluteQuads const):
* rendering/RenderFragmentContainer.cpp:
(WebCore::RenderFragmentContainer::fragmentedFlowContentRectangle):
(WebCore::RenderFragmentContainer::fragmentRectsForFlowContentRect):
* rendering/RenderFragmentContainer.h:
(WebCore::RenderFragmentContainer::absoluteQuadsForBoxInFragment): Deleted.
* rendering/RenderFragmentedFlow.cpp:
(WebCore::RenderFragmentedFlow::absoluteQuadsForBox const):
* rendering/RenderFragmentedFlow.h:
* rendering/RenderMultiColumnFlow.h:
* rendering/RenderMultiColumnSet.cpp:
(WebCore::RenderMultiColumnSet::firstAndLastColumnsFromOffsets const):
(WebCore::RenderMultiColumnSet::repaintFragmentedFlowContent):
(WebCore::RenderMultiColumnSet::fragmentRectsForFlowContentRect):
(WebCore::RenderMultiColumnSet::collectLayerFragments):
* rendering/RenderMultiColumnSet.h:

LayoutTests:

These tests have all progressed.

* fast/multicol/client-rects-spanners-complex.html:
* fast/multicol/client-rects-spanners.html:
* fast/multicol/client-rects.html:
* fast/multicol/newmulticol/client-rects.html:
* imported/blink/fast/multicol/client-rects-rtl-expected.html:
* imported/blink/fast/multicol/client-rects-rtl.html: This test appeared to be hand-coded to the incorrect old behavior.
* platform/ios/fast/multicol/client-rects-expected.txt:
* platform/ios/fast/multicol/client-rects-spanners-complex-expected.txt:
* platform/ios/fast/multicol/client-rects-spanners-expected.txt:
* platform/ios/fast/multicol/newmulticol/client-rects-expected.txt:
* platform/mac/fast/multicol/client-rects-expected.txt:
* platform/mac/fast/multicol/client-rects-spanners-complex-expected.txt:
* platform/mac/fast/multicol/client-rects-spanners-expected.txt:
* platform/mac/fast/multicol/newmulticol/client-rects-expected.txt:


Canonical link: https://commits.webkit.org/239759@main
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@280017 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-07-17 05:42:32 +00:00
..
compare-with-old-impl
adjacent-spanners-expected.html
adjacent-spanners.html
avoid-column-break-inside-expected.html
avoid-column-break-inside.html
balance-images-expected.txt
balance-images.html
balance-maxheight1-expected.txt
balance-maxheight1.html
balance-maxheight2-expected.txt
balance-maxheight2.html
balance1-expected.txt
balance1.html
balance2-expected.txt
balance2.html
balance3-expected.txt
balance3.html
balance4-expected.txt
balance4.html
balance5-expected.txt
balance5.html
balance6-expected.txt
balance6.html
balance7-expected.txt
balance7.html
balance8-expected.txt
balance8.html
balance9-expected.txt
balance9.html
balance10-expected.txt
balance10.html
block-becomes-spanner-expected.html
block-becomes-spanner.html
block-split-inline-in-multicol-expected.txt
block-split-inline-in-multicol.html
break-after-expected.html
break-after.html
break-before-expected.html
break-before.html
breaks-2-columns-3-expected.html
breaks-2-columns-3-no-balancing-expected.html
breaks-2-columns-3-no-balancing.html
breaks-2-columns-3.html
breaks-3-columns-3-expected.html
breaks-3-columns-3.html
cell-shrinkback-expected.html
cell-shrinkback.html
change-spanner-display-expected.html
change-spanner-display.html
change-spanner-parent-display-expected.html
change-spanner-parent-display.html
client-rects.html getBoundingClientRect() returns the incorrect rectangle on elements whose parent element is set -webkit-column-count 2021-07-17 05:42:32 +00:00
clipping-expected.html
clipping-overflow-hidden-expected.html
clipping-overflow-hidden.html
clipping-top-overflow-expected.html
clipping-top-overflow.html
clipping.html
column-rules-fixed-height-expected.html
column-rules-fixed-height.html
columns-shorthand-parsing-expected.html
columns-shorthand-parsing.html
crash-when-switching-to-floating-expected.txt
crash-when-switching-to-floating.html
direct-child-column-span-all-expected.html
direct-child-column-span-all.html
first-letter-create-expected.html
first-letter-create.html
fixed-height-fill-auto-expected.html
fixed-height-fill-auto.html
fixed-height-fill-balance-2-expected.html
fixed-height-fill-balance-2.html
fixed-height-fill-balance-expected.html
fixed-height-fill-balance.html
float-avoidance-expected.html
float-avoidance.html
float-multicol-expected.html
float-multicol.html
float-paginate-complex-expected.html
float-paginate-complex.html
float-paginate-empty-lines-expected.html
float-paginate-empty-lines.html
float-paginate-expected.html
float-paginate.html
hide-box-horizontal-bt-expected.html
hide-box-horizontal-bt.html
hide-box-vertical-lr-expected.html
hide-box-vertical-lr.html
hide-box-vertical-rl-expected.html
hide-box-vertical-rl.html
input-as-multicol-expected.txt
input-as-multicol.html
insert-row-content1-expected.html
insert-row-content1.html
insert-row-content2-expected.html
insert-row-content2.html
insert-row-content3-expected.html
insert-row-content3.html
insert-row-content4-expected.html
insert-row-content4.html
insert-row-content5-expected.html
insert-row-content5.html
insert-row-content6-expected.html
insert-row-content6.html
insert-row-content7-expected.html
insert-row-content7.html
insert-row-content8-expected.html
insert-row-content8.html
insert-row-content9-expected.html
insert-row-content9.html
insert-spanner-child1-expected.html
insert-spanner-child1.html
insert-spanner-child2-expected.html
insert-spanner-child2.html
insert-spanner-child3-expected.html
insert-spanner-child3.html
insert-spanner1-expected.html
insert-spanner1.html
insert-spanner2-expected.html
insert-spanner2.html
insert-spanner3-expected.html
insert-spanner3.html
insert-spanner4-expected.html
insert-spanner4.html
insert-spanner5-expected.html
insert-spanner5.html
insert-spanner6-expected.html
insert-spanner6.html
insert-spanner7-expected.html
insert-spanner7.html
insert-spanner8-expected.html
insert-spanner8.html
layers-in-multicol-expected.html
layers-in-multicol.html
layers-split-across-columns-expected.html
layers-split-across-columns.html
leading-and-trailing-margin-expected.html
leading-and-trailing-margin.html
leading-margin-expected.html
leading-margin.html
line-grid-inside-columns-expected.html
line-grid-inside-columns.html
line-grid-into-columns-expected.html
line-grid-into-columns.html
lines-region-map-crash-expected.html
lines-region-map-crash.html
multicol-clip-rounded-corners-expected.html
multicol-clip-rounded-corners.html
multicol-inside-multicol-expected.html
multicol-inside-multicol.html
multicol-with-spanner-becomes-regular-block-expected.html
multicol-with-spanner-becomes-regular-block.html
orphans-and-widows-balance-expected.txt
orphans-and-widows-balance.html
positioned-split-expected.html
positioned-split.html
positioned-with-constrained-height-expected.html
positioned-with-constrained-height.html
progression-reverse-expected.html
progression-reverse-overflow-expected.html
progression-reverse-overflow.html
progression-reverse.html
remove-row-content1-expected.html
remove-row-content1.html
remove-row-content2-expected.html
remove-row-content2.html
remove-row-content3-expected.html
remove-row-content3.html
remove-row-content4-expected.html
remove-row-content4.html
remove-row-content5-expected.html
remove-row-content5.html
remove-row-content6-expected.html
remove-row-content6.html
remove-row-content7-expected.html
remove-row-content7.html
remove-row-content8-expected.html
remove-row-content8.html
remove-row-content9-expected.html
remove-row-content9.html
remove-spanner1-expected.html
remove-spanner1.html
remove-spanner2-expected.html
remove-spanner2.html
remove-spanner3-expected.html
remove-spanner3.html
remove-spanner4-expected.html
remove-spanner4.html
remove-spanner5-expected.html
remove-spanner5.html
remove-spanner6-expected.html
remove-spanner6.html
ruby-from-multicol-to-auto-expected.txt
ruby-from-multicol-to-auto.html
single-line-expected.html
single-line.html
sole-spanner-expected.html
sole-spanner.html
span-between-text-expected.html
span-between-text.html
spanner-becomes-regular-block-expected.html
spanner-becomes-regular-block.html
spanner-crash-expected.txt
spanner-crash-with-embedded-columns-expected.txt
spanner-crash-with-embedded-columns.html
spanner-crash.html
spanner-first-expected.html
spanner-first.html
spanner-img-expected.html
spanner-img.html
spanner-inline-block-expected.html
spanner-inline-block.html
spanner-last-expected.html
spanner-last.html
spanner-nested-dynamic-expected.html
spanner-nested-dynamic.html
spanner-nested-expected.html
spanner-nested.html
spanner-pseudo-after1-expected.html
spanner-pseudo-after1.html
spanner-pseudo-after2-expected.html
spanner-pseudo-after2.html
spanner-pseudo-after3-expected.html
spanner-pseudo-after3.html
spanner-pseudo-after4-expected.html
spanner-pseudo-after4.html
spanner-pseudo-before-after1-expected.html
spanner-pseudo-before-after1.html
spanner-pseudo-before-after2-expected.html
spanner-pseudo-before-after2.html
spanner-pseudo-before-after3-expected.html
spanner-pseudo-before-after3.html
spanner-pseudo-before-after4-expected.html
spanner-pseudo-before-after4.html
spanner-pseudo-before1-expected.html
spanner-pseudo-before1.html
spanner-pseudo-before2-expected.html
spanner-pseudo-before2.html
spanner-pseudo-before3-expected.html
spanner-pseudo-before3.html
spanner-pseudo-before4-expected.html
spanner-pseudo-before4.html
spanner-table-expected.html
spanner-table.html
spanner-with-margin-expected.html
spanner-with-margin.html
spanner1-expected.html
spanner1.html
spanner2-expected.html
spanner2.html
spanner3-expected.html
spanner3.html
spanner4-expected.html
spanner4.html
spanner5-expected.html
spanner5.html
spanner6-expected.html
spanner6.html
spanner7-expected.html
spanner7.html
spanner8-expected.html
spanner8.html
spanner9-expected.html
spanner9.html
table-section-crash-expected.txt
table-section-crash.html
trailing-margin-with-spanner-expected.html
trailing-margin-with-spanner.html
trailing-margin-with-spanner2-expected.html
trailing-margin-with-spanner2.html
unresolvable-percent-height-2-expected.html
unresolvable-percent-height-2.html
unresolvable-percent-height-expected.html
unresolvable-percent-height.html
unresolvable-percent-max-height-2-expected.html
unresolvable-percent-max-height-2.html
unresolvable-percent-max-height-expected.html
unresolvable-percent-max-height.html