Title: [176285] trunk
Revision
176285
Author
[email protected]
Date
2014-11-18 14:40:29 -0800 (Tue, 18 Nov 2014)

Log Message

Multicolumn layout with negative line spacing and orphans causes pieces of letters to be shown at the bottom of columns
https://bugs.webkit.org/show_bug.cgi?id=138204

Source/WebCore:

Reviewed by Dave Hyatt.

This code is responsible for pushing block elements to the next column if
the "orphans" CSS property is triggered. The mechanism by which this is
achieved is to push the block down such that the origin of the block is
at the origin of the next column. However, if there is negative line
spacing, the top portion of the text might actually be on top of the
origin of the block. Therefore, the block wasn't being pushed down enough
to entirely contain its text, so the top pieces were being drawn on the
previous column.

Test: fast/multicol/orphans-negative-line-spacing.html

* rendering/RenderBlockFlow.cpp:
(WebCore::RenderBlockFlow::adjustLinePositionForPagination):

LayoutTests:

Patch by Myles C. Maxfield <[email protected]> on 2014-11-18
Reviewed by Dave Hyatt.

Create a layout where the "orphans" css property causes a block element to
be pushed to the next column.

* fast/multicol/orphans-negative-line-spacing-expected.html: Added.
* fast/multicol/orphans-negative-line-spacing.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (176284 => 176285)


--- trunk/LayoutTests/ChangeLog	2014-11-18 22:10:57 UTC (rev 176284)
+++ trunk/LayoutTests/ChangeLog	2014-11-18 22:40:29 UTC (rev 176285)
@@ -1,3 +1,16 @@
+2014-11-18  Myles C. Maxfield  <[email protected]>
+
+        Multicolumn layout with negative line spacing and orphans causes pieces of letters to be shown at the bottom of columns
+        https://bugs.webkit.org/show_bug.cgi?id=138204
+
+        Reviewed by Dave Hyatt.
+
+        Create a layout where the "orphans" css property causes a block element to
+        be pushed to the next column.
+
+        * fast/multicol/orphans-negative-line-spacing-expected.html: Added.
+        * fast/multicol/orphans-negative-line-spacing.html: Added.
+
 2014-11-18  Chris Dumez  <[email protected]>
 
         DOMTimers sometimes don't get unthrottled on scrolling

Added: trunk/LayoutTests/fast/multicol/orphans-negative-line-spacing-expected.html (0 => 176285)


--- trunk/LayoutTests/fast/multicol/orphans-negative-line-spacing-expected.html	                        (rev 0)
+++ trunk/LayoutTests/fast/multicol/orphans-negative-line-spacing-expected.html	2014-11-18 22:40:29 UTC (rev 176285)
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+    if (window.internals)
+        internals.setPagination("LeftToRightPaginated", 0);
+</script>
+</head>
+<body>
+<div style="height: 35px;">
+This test makes sure that orphans get pushed to the next page correctly in paginated content. The test fails if you
+see little bits of black at the bottom of the window. (But you should see two giant paragraphs of Ahem text)
+</div>
+<div style="font: 20px ahem; line-height: 50%; orphans: 5;">
+<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc in ornare enim, quis condimentum ipsum. Pellentesque eu pretium urna, ac fringilla felis. Etiam eros massa, posuere at efficitur id, interdum at est. Fusce nec purus purus. Fusce dignissim lorem tortor, ut sollicitudin augue malesuada et. Pellentesque malesuada iaculis elit a consequat. Aliquam erat volutpat. Mauris quis est non velit iaculis porttitor. Donec a mauris id risus elementum tincidunt. Donec fermentum ipsum ac cursus iaculis. Curabitur vitae nisi tortor. Donec sit amet posuere odio, a viverra ipsum. Nulla sit amet mauris finibus metus accumsan tempus nec et quam. Mauris non convallis nisl, quis finibus leo. Etiam lacinia eros vitae est dapibus tempor.</p>
+<p>Nullam quis est vel mauris volutpat luctus. Morbi eget libero feugiat, lacinia tellus nec, auctor nulla. Suspendisse potenti. Vestibulum lobortis et sapien eu consequat. Aenean dui tellus, dapibus quis ante vel, dictum finibus ipsum. Cras eu risus malesuada, maximus nisl ultrices, placerat velit. Donec egestas, libero ut feugiat pretium, quam ligula rhoncus tortor, tempus hendrerit nulla tortor vel sem. Integer lacinia, nisi sed lobortis tincidunt, tortor mauris tincidunt leo, eu lacinia leo augue eu arcu. Donec ultricies vel arcu eget bibendum. Vestibulum placerat, lectus quis sagittis maximus, mi arcu pharetra massa, nec posuere dolor tortor nec erat. Proin luctus pharetra augue sed tincidunt. Fusce non mauris pharetra, viverra libero in, porttitor libero. Nam nibh magna, faucibus id erat eu, ornare maximus odio. Suspendisse bibendum augue hendrerit, vehicula est nec, porttitor libero. Cras eget augue non urna consectetur feugiat. Nulla eget fringilla dui.</p&g
 t;
+<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
+<p>Suspendisse id fermentum dolor. Sed vestibulum metus sit amet dictum faucibus. In interdum sapien turpis, viverra sagittis justo consequat eu. Nullam lacinia lacus convallis felis sodales, id luctus quam sodales. Nunc sit amet elit quis libero placerat aliquet eu in massa. Morbi blandit urna urna, id tincidunt quam porta sed. Suspendisse sagittis ex aliquam congue luctus. Nunc tincidunt erat vel dui blandit, sit amet blandit augue pulvinar. Nullam efficitur nulla sit amet arcu rutrum consectetur. Suspendisse pretium lectus lectus, vitae sagittis ante auctor ac. Praesent ut arcu ac eros imperdiet rhoncus. Sed imperdiet bibendum pretium. Etiam ornare libero nulla, vitae interdum nunc interdum at.</p>
+</div>
+</body>
+<html>
+

Added: trunk/LayoutTests/fast/multicol/orphans-negative-line-spacing.html (0 => 176285)


--- trunk/LayoutTests/fast/multicol/orphans-negative-line-spacing.html	                        (rev 0)
+++ trunk/LayoutTests/fast/multicol/orphans-negative-line-spacing.html	2014-11-18 22:40:29 UTC (rev 176285)
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+    if (window.internals)
+        internals.setPagination("LeftToRightPaginated", 0);
+</script>
+</head>
+<body>
+<div style="height: 35px;">
+This test makes sure that orphans get pushed to the next page correctly in paginated content. The test fails if you
+see little bits of black at the bottom of the window. (But you should see two giant paragraphs of Ahem text)
+</div>
+<div style="font: 20px ahem; line-height: 50%; orphans: 5;">
+<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc in ornare enim, quis condimentum ipsum. Pellentesque eu pretium urna, ac fringilla felis. Etiam eros massa, posuere at efficitur id, interdum at est. Fusce nec purus purus. Fusce dignissim lorem tortor, ut sollicitudin augue malesuada et. Pellentesque malesuada iaculis elit a consequat. Aliquam erat volutpat. Mauris quis est non velit iaculis porttitor. Donec a mauris id risus elementum tincidunt. Donec fermentum ipsum ac cursus iaculis. Curabitur vitae nisi tortor. Donec sit amet posuere odio, a viverra ipsum. Nulla sit amet mauris finibus metus accumsan tempus nec et quam. Mauris non convallis nisl, quis finibus leo. Etiam lacinia eros vitae est dapibus tempor.</p>
+<p>Nullam quis est vel mauris volutpat luctus. Morbi eget libero feugiat, lacinia tellus nec, auctor nulla. Suspendisse potenti. Vestibulum lobortis et sapien eu consequat. Aenean dui tellus, dapibus quis ante vel, dictum finibus ipsum. Cras eu risus malesuada, maximus nisl ultrices, placerat velit. Donec egestas, libero ut feugiat pretium, quam ligula rhoncus tortor, tempus hendrerit nulla tortor vel sem. Integer lacinia, nisi sed lobortis tincidunt, tortor mauris tincidunt leo, eu lacinia leo augue eu arcu. Donec ultricies vel arcu eget bibendum. Vestibulum placerat, lectus quis sagittis maximus, mi arcu pharetra massa, nec posuere dolor tortor nec erat. Proin luctus pharetra augue sed tincidunt. Fusce non mauris pharetra, viverra libero in, porttitor libero. Nam nibh magna, faucibus id erat eu, ornare maximus odio. Suspendisse bibendum augue hendrerit, vehicula est nec, porttitor libero. Cras eget augue non urna consectetur feugiat. Nulla eget fringilla dui.</p&g
 t;
+<p>Suspendisse id fermentum dolor. Sed vestibulum metus sit amet dictum faucibus. In interdum sapien turpis, viverra sagittis justo consequat eu. Nullam lacinia lacus convallis felis sodales, id luctus quam sodales. Nunc sit amet elit quis libero placerat aliquet eu in massa. Morbi blandit urna urna, id tincidunt quam porta sed. Suspendisse sagittis ex aliquam congue luctus. Nunc tincidunt erat vel dui blandit, sit amet blandit augue pulvinar. Nullam efficitur nulla sit amet arcu rutrum consectetur. Suspendisse pretium lectus lectus, vitae sagittis ante auctor ac. Praesent ut arcu ac eros imperdiet rhoncus. Sed imperdiet bibendum pretium. Etiam ornare libero nulla, vitae interdum nunc interdum at.</p>
+</div>
+</body>
+<html>
+

Modified: trunk/Source/WebCore/ChangeLog (176284 => 176285)


--- trunk/Source/WebCore/ChangeLog	2014-11-18 22:10:57 UTC (rev 176284)
+++ trunk/Source/WebCore/ChangeLog	2014-11-18 22:40:29 UTC (rev 176285)
@@ -1,3 +1,24 @@
+2014-11-18  Myles C. Maxfield  <[email protected]>
+
+        Multicolumn layout with negative line spacing and orphans causes pieces of letters to be shown at the bottom of columns
+        https://bugs.webkit.org/show_bug.cgi?id=138204
+
+        Reviewed by Dave Hyatt.
+
+        This code is responsible for pushing block elements to the next column if
+        the "orphans" CSS property is triggered. The mechanism by which this is
+        achieved is to push the block down such that the origin of the block is
+        at the origin of the next column. However, if there is negative line
+        spacing, the top portion of the text might actually be on top of the
+        origin of the block. Therefore, the block wasn't being pushed down enough
+        to entirely contain its text, so the top pieces were being drawn on the
+        previous column.
+
+        Test: fast/multicol/orphans-negative-line-spacing.html
+
+        * rendering/RenderBlockFlow.cpp:
+        (WebCore::RenderBlockFlow::adjustLinePositionForPagination):
+
 2014-11-18  Chris Dumez  <[email protected]>
 
         DOMTimers sometimes don't get unthrottled on scrolling

Modified: trunk/Source/WebCore/rendering/RenderBlockFlow.cpp (176284 => 176285)


--- trunk/Source/WebCore/rendering/RenderBlockFlow.cpp	2014-11-18 22:10:57 UTC (rev 176284)
+++ trunk/Source/WebCore/rendering/RenderBlockFlow.cpp	2014-11-18 22:40:29 UTC (rev 176285)
@@ -1667,9 +1667,12 @@
         LayoutUnit pageLogicalHeightAtNewOffset = hasUniformPageLogicalHeight ? pageLogicalHeight : pageLogicalHeightForOffset(logicalOffset + remainingLogicalHeight);
         setPageBreak(logicalOffset, lineHeight - remainingLogicalHeight);
         if (((lineBox == firstRootBox() && totalLogicalHeight < pageLogicalHeightAtNewOffset) || (!style().hasAutoOrphans() && style().orphans() >= lineIndex))
-            && !isOutOfFlowPositioned() && !isTableCell())
-            setPaginationStrut(remainingLogicalHeight + std::max<LayoutUnit>(0, logicalOffset));
-        else {
+            && !isOutOfFlowPositioned() && !isTableCell()) {
+            auto firstRootBox = this->firstRootBox();
+            auto firstRootBoxOverflowRect = firstRootBox->logicalVisualOverflowRect(firstRootBox->lineTop(), firstRootBox->lineBottom());
+            auto firstLineUpperOverhang = std::max(-firstRootBoxOverflowRect.y(), LayoutUnit());
+            setPaginationStrut(remainingLogicalHeight + logicalOffset + firstLineUpperOverhang);
+        } else {
             delta += remainingLogicalHeight;
             lineBox->setPaginationStrut(remainingLogicalHeight);
             lineBox->setIsFirstAfterPageBreak(true);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to