Title: [230300] trunk/Tools
- Revision
- 230300
- Author
- za...@apple.com
- Date
- 2018-04-05 08:50:26 -0700 (Thu, 05 Apr 2018)
Log Message
[LayoutReloaded] Find the correct left edge for a line when floating boxes are in parent formatting context.
https://bugs.webkit.org/show_bug.cgi?id=184330
Reviewed by Antti Koivisto.
In inline formatting context, the floating boxes can come from the parent (block) formatting context. Let's
take them into account when computing the line edges.
* LayoutReloaded/FormattingContext/FloatingContext.js:
(FloatingContext.prototype.left):
(FloatingContext.prototype.right):
* LayoutReloaded/FormattingContext/InlineFormatting/InlineFormattingContext.js:
(InlineFormattingContext.prototype._createNewLine):
(InlineFormattingContext.prototype._mapFloatingVerticalPosition):
(InlineFormattingContext.prototype._mapFloatingHorizontalPosition):
(InlineFormattingContext.prototype._mapFloatingPosition): Deleted.
* LayoutReloaded/test/index.html:
* LayoutReloaded/test/multiple-left-floats-on-line-from-parent-formatting-context.html: Added.
Modified Paths
Added Paths
Diff
Modified: trunk/Tools/ChangeLog (230299 => 230300)
--- trunk/Tools/ChangeLog 2018-04-05 15:21:15 UTC (rev 230299)
+++ trunk/Tools/ChangeLog 2018-04-05 15:50:26 UTC (rev 230300)
@@ -1,5 +1,26 @@
2018-04-05 Zalan Bujtas <za...@apple.com>
+ [LayoutReloaded] Find the correct left edge for a line when floating boxes are in parent formatting context.
+ https://bugs.webkit.org/show_bug.cgi?id=184330
+
+ Reviewed by Antti Koivisto.
+
+ In inline formatting context, the floating boxes can come from the parent (block) formatting context. Let's
+ take them into account when computing the line edges.
+
+ * LayoutReloaded/FormattingContext/FloatingContext.js:
+ (FloatingContext.prototype.left):
+ (FloatingContext.prototype.right):
+ * LayoutReloaded/FormattingContext/InlineFormatting/InlineFormattingContext.js:
+ (InlineFormattingContext.prototype._createNewLine):
+ (InlineFormattingContext.prototype._mapFloatingVerticalPosition):
+ (InlineFormattingContext.prototype._mapFloatingHorizontalPosition):
+ (InlineFormattingContext.prototype._mapFloatingPosition): Deleted.
+ * LayoutReloaded/test/index.html:
+ * LayoutReloaded/test/multiple-left-floats-on-line-from-parent-formatting-context.html: Added.
+
+2018-04-05 Zalan Bujtas <za...@apple.com>
+
[LayoutReloaded] Collect floating boxes in inline formatting context and layout them first.
https://bugs.webkit.org/show_bug.cgi?id=184329
Modified: trunk/Tools/LayoutReloaded/FormattingContext/FloatingContext.js (230299 => 230300)
--- trunk/Tools/LayoutReloaded/FormattingContext/FloatingContext.js 2018-04-05 15:21:15 UTC (rev 230299)
+++ trunk/Tools/LayoutReloaded/FormattingContext/FloatingContext.js 2018-04-05 15:50:26 UTC (rev 230300)
@@ -46,18 +46,18 @@
left(verticalPosition) {
// Relative to the formatting context's root.
- let leftFloatings = this._leftFloatings();
- if (!leftFloatings.length)
+ let leftFloating = this._findFloatingAtVerticalPosition(verticalPosition, this._leftFloatings());
+ if (!leftFloating)
return Number.NaN;
- return this._mapDisplayMarginBoxToFormattingRoot(leftFloatings[leftFloatings.length - 1]).right();
+ return this._mapDisplayMarginBoxToFormattingRoot(leftFloating).right();
}
right(verticalPosition) {
// Relative to the formatting context's root.
- let rightFloatings = this._rightFloatings();
- if (!rightFloatings.length)
+ let rightFloating = this._findFloatingAtVerticalPosition(verticalPosition, this._rightFloatings());
+ if (!rightFloating)
return Number.NaN;
- return this._mapDisplayMarginBoxToFormattingRoot(rightFloatings[rightFloatings.length - 1]).left();
+ return this._mapDisplayMarginBoxToFormattingRoot(rightFloating).left();
}
bottom() {
Modified: trunk/Tools/LayoutReloaded/FormattingContext/InlineFormatting/InlineFormattingContext.js (230299 => 230300)
--- trunk/Tools/LayoutReloaded/FormattingContext/InlineFormatting/InlineFormattingContext.js 2018-04-05 15:21:15 UTC (rev 230299)
+++ trunk/Tools/LayoutReloaded/FormattingContext/InlineFormatting/InlineFormattingContext.js 2018-04-05 15:50:26 UTC (rev 230300)
@@ -119,9 +119,14 @@
_createNewLine() {
let lineRect = this.displayBox(this.formattingRoot()).contentBox();
- let floatingLeft = this._mapFloatingPosition(this.floatingContext().left());
- let floatingRight = this._mapFloatingPosition(this.floatingContext().right());
- // TODO: Check the case when the containing block is narrower than the floats.
+ let lines = this.formattingState().lines();
+ if (lines.length)
+ lineRect.setTop(lines[lines.length - 1].rect().bottom());
+ // Find floatings on this line.
+ // Offset the vertical position if the floating context belongs to the parent formatting context.
+ let lineTopInFloatingPosition = this._mapFloatingVerticalPosition(lineRect.top());
+ let floatingLeft = this._mapFloatingHorizontalPosition(this.floatingContext().left(lineTopInFloatingPosition));
+ let floatingRight = this._mapFloatingHorizontalPosition(this.floatingContext().right(lineTopInFloatingPosition));
if (!Number.isNaN(floatingLeft) && !Number.isNaN(floatingRight)) {
// Floats on both sides.
lineRect.setLeft(floatingLeft);
@@ -131,26 +136,33 @@
else if (!Number.isNaN(floatingRight))
lineRect.setRight(floatingRight);
- let lines = this.formattingState().lines();
- if (lines.length)
- lineRect.setTop(lines[lines.length - 1].rect().bottom());
return new Line(lineRect.topLeft(), Utils.computedLineHeight(this.formattingRoot().node()), lineRect.width());
}
- _mapFloatingPosition(verticalPosition) {
- if (Number.isNaN(verticalPosition))
+ _mapFloatingVerticalPosition(verticalPosition) {
+ // Floats position are relative to their formatting root (which might not be this formatting root).
+ let root = this.displayBox(this.formattingRoot());
+ let floatFormattingRoot = this.displayBox(this.floatingContext().formattingRoot());
+ if (root == floatFormattingRoot)
return verticalPosition;
+ let rootTop = Utils.mapPosition(root.topLeft(), root, floatFormattingRoot).top();
+ return rootTop += root.contentBox().top();
+ }
+
+ _mapFloatingHorizontalPosition(horizontalPosition) {
+ if (Number.isNaN(horizontalPosition))
+ return horizontalPosition;
// Floats position are relative to their formatting root (which might not be this formatting root).
let root = this.displayBox(this.formattingRoot());
let floatFormattingRoot = this.displayBox(this.floatingContext().formattingRoot());
if (root == floatFormattingRoot)
- return verticalPosition;
+ return horizontalPosition;
let rootLeft = Utils.mapPosition(root.topLeft(), root, floatFormattingRoot).left();
rootLeft += root.contentBox().left();
// The left most float is to the right of the root.
- if (rootLeft >= verticalPosition)
+ if (rootLeft >= horizontalPosition)
return root.contentBox().left();
- return verticalPosition - rootLeft;
+ return horizontalPosition - rootLeft;
}
_floatingBoxes() {
Modified: trunk/Tools/LayoutReloaded/test/index.html (230299 => 230300)
--- trunk/Tools/LayoutReloaded/test/index.html 2018-04-05 15:21:15 UTC (rev 230299)
+++ trunk/Tools/LayoutReloaded/test/index.html 2018-04-05 15:50:26 UTC (rev 230300)
@@ -68,7 +68,8 @@
"inline-with-floats-right-left-simple.html",
"inline-formatting-context-with-floats2.html",
"float-is-inside-inline-formatting-context-simple.html",
- "multiple-left-floats-on-line-simple.html"
+ "multiple-left-floats-on-line-simple.html",
+ "multiple-left-floats-on-line-from-parent-formatting-context.html"
];
let debugThis = [];
Added: trunk/Tools/LayoutReloaded/test/multiple-left-floats-on-line-from-parent-formatting-context.html (0 => 230300)
--- trunk/Tools/LayoutReloaded/test/multiple-left-floats-on-line-from-parent-formatting-context.html (rev 0)
+++ trunk/Tools/LayoutReloaded/test/multiple-left-floats-on-line-from-parent-formatting-context.html 2018-04-05 15:50:26 UTC (rev 230300)
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<html>
+<body>
+<div>foobar foobar<div style="float: left; width: 10px; height: 10px;"></div><div style="float: left; width: 10px; height: 10px;"></div><div style="float: left; width: 10px; height: 10px;"></div></div>
+<div><div style="float: left; width: 10px; height: 10px;"></div>foobar foobar<div style="float: left; width: 10px; height: 10px;"></div><div style="float: left; width: 10px; height: 10px;"></div></div>
+<div><div style="float: left; width: 10px; height: 10px;"></div><div style="float: left; width: 10px; height: 10px;"></div>foobar foobar<div style="float: left; width: 10px; height: 10px;"></div></div>
+</body>
+</html>
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes