Title: [203771] trunk
Revision
203771
Author
[email protected]
Date
2016-07-27 03:07:19 -0700 (Wed, 27 Jul 2016)

Log Message

[css-grid] Handle alignment with orthogonal flows
https://bugs.webkit.org/show_bug.cgi?id=159295

Reviewed by Darin Adler.

Now that grid sizing and positioning issues wrt orthogonal flows have
been clarified in the last spec draft, we can adapt now our alignment
logic to work with orthogonal flows.

Source/WebCore:

Even though basic alignment would work with orthogonal flows with
this patch, we still doesn't allow stretching in that case. I'll provide a
patch for that feature since it's a complex logic and better have an
isolated change.

Tests: fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-lr.html
       fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-rl.html
       fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows.html

* rendering/RenderGrid.cpp:
(WebCore::computeOverflowAlignmentOffset): Using 'size' instead of 'breadth' as concept.
(WebCore::RenderGrid::columnAxisPositionForChild): Dealing with orthogonal flow cases.
(WebCore::RenderGrid::rowAxisPositionForChild): Dealing with orthogonal flow cases.
(WebCore::RenderGrid::columnAxisOffsetForChild): Using 'size' instead of 'breadth' as concept.
(WebCore::RenderGrid::rowAxisOffsetForChild): Using 'size' instead of 'breadth' as concept.
(WebCore::RenderGrid::findChildLogicalPosition): Dealing with orthogonal flow cases.

LayoutTests:

These tests ensure that alignment works as expected in the cases where
grid and its children are orthogonal.

* fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-expected.txt: Added.
* fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-lr-expected.txt: Added.
* fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-lr.html: Added.
* fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-rl-expected.txt: Added.
* fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-rl.html: Added.
* fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows.html: Added.
* fast/css-grid-layout/resources/grid-alignment.css:
(.alignContentSpaceBetween):
(.alignContentSpaceAround):
(.alignContentSpaceEvenly):
(.alignContentStretch):
(.selfStart):
(.selfEnd):
(.selfCenter):
(.selfRight):
(.selfLeft):
(.selfSelfStart):
(.selfSelfEnd):
(.itemsSelfEnd): Deleted.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (203770 => 203771)


--- trunk/LayoutTests/ChangeLog	2016-07-27 07:42:16 UTC (rev 203770)
+++ trunk/LayoutTests/ChangeLog	2016-07-27 10:07:19 UTC (rev 203771)
@@ -1,3 +1,37 @@
+2016-07-27  Javier Fernandez  <[email protected]>
+
+        [css-grid] Handle alignment with orthogonal flows
+        https://bugs.webkit.org/show_bug.cgi?id=159295
+
+        Reviewed by Darin Adler.
+
+        Now that grid sizing and positioning issues wrt orthogonal flows have
+        been clarified in the last spec draft, we can adapt now our alignment
+        logic to work with orthogonal flows.
+
+        These tests ensure that alignment works as expected in the cases where
+        grid and its children are orthogonal.
+
+        * fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-expected.txt: Added.
+        * fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-lr-expected.txt: Added.
+        * fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-lr.html: Added.
+        * fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-rl-expected.txt: Added.
+        * fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-rl.html: Added.
+        * fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows.html: Added.
+        * fast/css-grid-layout/resources/grid-alignment.css:
+        (.alignContentSpaceBetween):
+        (.alignContentSpaceAround):
+        (.alignContentSpaceEvenly):
+        (.alignContentStretch):
+        (.selfStart):
+        (.selfEnd):
+        (.selfCenter):
+        (.selfRight):
+        (.selfLeft):
+        (.selfSelfStart):
+        (.selfSelfEnd):
+        (.itemsSelfEnd): Deleted.
+
 2016-07-26  Youenn Fablet  <[email protected]>
 
         JS Built-ins should throw this-error messages consistently with binding generated code

Added: trunk/LayoutTests/fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-expected.txt (0 => 203771)


--- trunk/LayoutTests/fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-expected.txt	2016-07-27 10:07:19 UTC (rev 203771)
@@ -0,0 +1,97 @@
+This test checks that grid items alignment works as expected with HORIZONTAL-TB vs VERTICAL-RL orthogonal flows.
+
+Orthogonal flows: HORIZONTAL-TB vs VERTICAL-RL
+
+Direction: LTR vs LTR
+
+end
+center
+left
+right
+PASS
+
+s-end
+start
+default
+s-start
+PASS
+Direction: RTL vs LTR
+
+end
+center
+left
+right
+PASS
+
+s-end
+start
+default
+s-start
+PASS
+Direction: LTR vs RTL
+
+end
+center
+left
+right
+PASS
+
+s-end
+start
+default
+s-start
+PASS
+Direction: RTL vs RTL
+
+end
+center
+left
+right
+PASS
+
+s-end
+start
+default
+s-start
+PASS
+Orthogonal flows: HORIZONTAL-TB vs VERTICAL-LR
+
+Direction: LTR vs LTR
+
+end
+center
+left
+right
+PASS
+
+s-end
+start
+default
+s-start
+PASS
+Direction: RTL vs LTR
+
+end
+center
+left
+right
+PASS
+
+s-end
+start
+default
+s-start
+PASS
+Direction: RTL vs RTL
+
+end
+center
+left
+right
+PASS
+
+s-end
+start
+default
+s-start
+PASS

Added: trunk/LayoutTests/fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-lr-expected.txt (0 => 203771)


--- trunk/LayoutTests/fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-lr-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-lr-expected.txt	2016-07-27 10:07:19 UTC (rev 203771)
@@ -0,0 +1,54 @@
+This test checks that grid items alignment works as expected with VERTICAL-LR vs HORIZONTAL-TB orthogonal flows.
+
+Direction: LTR vs LTR
+
+end
+center
+left
+right
+PASS
+
+s-end
+start
+default
+s-start
+PASS
+Direction: RTL vs LTR
+
+end
+center
+left
+right
+PASS
+
+s-end
+start
+default
+s-start
+PASS
+Direction: LTR vs RTL
+
+end
+center
+left
+right
+PASS
+
+s-end
+start
+default
+s-start
+PASS
+Direction: RTL vs RTL
+
+end
+center
+left
+right
+PASS
+
+s-end
+start
+default
+s-start
+PASS

Added: trunk/LayoutTests/fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-lr.html (0 => 203771)


--- trunk/LayoutTests/fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-lr.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-lr.html	2016-07-27 10:07:19 UTC (rev 203771)
@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<link href="" rel="stylesheet">
+<link href="" rel="stylesheet">
+<link href="" rel="stylesheet">
+<script src=""
+<style>
+body {
+    margin: 0;
+}
+.container {
+    position: relative;
+}
+.grid {
+    grid-template-columns: 100px 100px;
+    grid-template-rows: 150px 150px;
+    font-size: 10px;
+}
+.item {
+   width: 50px;
+   height: 20px;
+}
+</style>
+<body _onload_="checkLayout('.grid')">
+
+<p>This test checks that grid items alignment works as expected with VERTICAL-LR vs HORIZONTAL-TB orthogonal flows.</p>
+
+<p>Direction: LTR vs LTR</p>
+<div class="container">
+    <div class="grid fit-content verticalLR directionLTR">
+        <div class="item firstRowFirstColumn   horizontalTB selfEnd"    data-offset-x="100" data-offset-y="80">end</div>
+        <div class="item firstRowSecondColumn  horizontalTB selfCenter" data-offset-x="50"  data-offset-y="140">center</div>
+        <div class="item secondRowFirstColumn  horizontalTB selfLeft"   data-offset-x="150" data-offset-y="0">left</div>
+        <div class="item secondRowSecondColumn horizontalTB selfRight"  data-offset-x="150" data-offset-y="180">right</div>
+    </div>
+</div>
+<br>
+<div class="container">
+    <div class="grid fit-content verticalLR directionLTR">
+        <div class="item firstRowFirstColumn   horizontalTB selfSelfEnd"   data-offset-x="100" data-offset-y="80">s-end</div>
+        <div class="item firstRowSecondColumn  horizontalTB selfStart"     data-offset-x="0"   data-offset-y="100">start</div>
+        <div class="item secondRowFirstColumn  horizontalTB"               data-offset-x="150" data-offset-y="0">default</div>
+        <div class="item secondRowSecondColumn horizontalTB selfSelfStart" data-offset-x="150" data-offset-y="100">s-start</div>
+    </div>
+</div>
+
+<p>Direction: RTL vs LTR</p>
+<div class="container">
+    <div class="grid fit-content verticalLR directionRTL">
+        <div class="item firstRowFirstColumn   directionLTR horizontalTB selfEnd"    data-offset-x="100" data-offset-y="100">end</div>
+        <div class="item firstRowSecondColumn  directionLTR horizontalTB selfCenter" data-offset-x="50"  data-offset-y="40">center</div>
+        <div class="item secondRowFirstColumn  directionLTR horizontalTB selfLeft"   data-offset-x="150" data-offset-y="100">left</div>
+        <div class="item secondRowSecondColumn directionLTR horizontalTB selfRight"  data-offset-x="150" data-offset-y="80">right</div>
+    </div>
+</div>
+<br>
+<div class="container">
+    <div class="grid fit-content verticalLR directionRTL">
+        <div class="item firstRowFirstColumn   directionLTR horizontalTB selfSelfEnd"   data-offset-x="100" data-offset-y="180">s-end</div>
+        <div class="item firstRowSecondColumn  directionLTR horizontalTB selfStart"     data-offset-x="0"   data-offset-y="80">start</div>
+        <div class="item secondRowFirstColumn  directionLTR horizontalTB"               data-offset-x="150" data-offset-y="180">default</div>
+        <div class="item secondRowSecondColumn directionLTR horizontalTB selfSelfStart" data-offset-x="150" data-offset-y="0">s-start</div>
+    </div>
+</div>
+
+<p>Direction: LTR vs RTL</p>
+<div class="container">
+    <div class="grid fit-content verticalLR directionLTR">
+        <div class="item firstRowFirstColumn   directionRTL horizontalTB selfEnd"    data-offset-x="100" data-offset-y="80">end</div>
+        <div class="item firstRowSecondColumn  directionRTL horizontalTB selfCenter" data-offset-x="50"  data-offset-y="140">center</div>
+        <div class="item secondRowFirstColumn  directionRTL horizontalTB selfLeft"   data-offset-x="150" data-offset-y="0">left</div>
+        <div class="item secondRowSecondColumn directionRTL horizontalTB selfRight"  data-offset-x="150" data-offset-y="180">right</div>
+    </div>
+</div>
+<br>
+<div class="container">
+    <div class="grid fit-content verticalLR directionLTR">
+        <div class="item firstRowFirstColumn   directionRTL horizontalTB selfSelfEnd"   data-offset-x="0"   data-offset-y="80">s-end</div>
+        <div class="item firstRowSecondColumn  directionRTL horizontalTB selfStart"     data-offset-x="0"   data-offset-y="100">start</div>
+        <div class="item secondRowFirstColumn  directionRTL horizontalTB"               data-offset-x="150" data-offset-y="0">default</div>
+        <div class="item secondRowSecondColumn directionRTL horizontalTB selfSelfStart" data-offset-x="250" data-offset-y="100">s-start</div>
+    </div>
+</div>
+
+<p>Direction: RTL vs RTL</p>
+<div class="container">
+    <div class="grid fit-content verticalLR directionRTL">
+        <div class="item firstRowFirstColumn   horizontalTB selfEnd"    data-offset-x="100" data-offset-y="100">end</div>
+        <div class="item firstRowSecondColumn  horizontalTB selfCenter" data-offset-x="50"  data-offset-y="40">center</div>
+        <div class="item secondRowFirstColumn  horizontalTB selfLeft"   data-offset-x="150" data-offset-y="100">left</div>
+        <div class="item secondRowSecondColumn horizontalTB selfRight"  data-offset-x="150" data-offset-y="80">right</div>
+    </div>
+</div>
+<br>
+<div class="container">
+    <div class="grid fit-content verticalLR directionRTL">
+        <div class="item firstRowFirstColumn   horizontalTB selfSelfEnd"   data-offset-x="0"   data-offset-y="180">s-end</div>
+        <div class="item firstRowSecondColumn  horizontalTB selfStart"     data-offset-x="0"   data-offset-y="80">start</div>
+        <div class="item secondRowFirstColumn  horizontalTB"               data-offset-x="150" data-offset-y="180">default</div>
+        <div class="item secondRowSecondColumn horizontalTB selfSelfStart" data-offset-x="250" data-offset-y="0">s-start</div>
+    </div>
+</div>
+</body>

Added: trunk/LayoutTests/fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-rl-expected.txt (0 => 203771)


--- trunk/LayoutTests/fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-rl-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-rl-expected.txt	2016-07-27 10:07:19 UTC (rev 203771)
@@ -0,0 +1,54 @@
+This test checks that grid items alignment works as expected with VERTICAL-RL vs HORIZONTAL-TB orthogonal flows.
+
+Direction: LTR vs LTR
+
+end
+center
+left
+right
+PASS
+
+s-end
+start
+default
+s-start
+PASS
+Direction: RTL vs LTR
+
+end
+center
+left
+right
+PASS
+
+s-end
+start
+default
+s-start
+PASS
+Direction: LTR vs RTL
+
+end
+center
+left
+right
+PASS
+
+s-end
+start
+default
+s-start
+PASS
+Direction: RTL vs RTL
+
+end
+center
+left
+right
+PASS
+
+s-end
+start
+default
+s-start
+PASS

Added: trunk/LayoutTests/fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-rl.html (0 => 203771)


--- trunk/LayoutTests/fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-rl.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-rl.html	2016-07-27 10:07:19 UTC (rev 203771)
@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<link href="" rel="stylesheet">
+<link href="" rel="stylesheet">
+<link href="" rel="stylesheet">
+<script src=""
+<style>
+body {
+    margin: 0;
+}
+.container {
+    position: relative;
+}
+.grid {
+    grid-template-columns: 100px 100px;
+    grid-template-rows: 150px 150px;
+    font-size: 10px;
+}
+.item {
+   width: 50px;
+   height: 20px;
+}
+</style>
+<body _onload_="checkLayout('.grid')">
+
+<p>This test checks that grid items alignment works as expected with VERTICAL-RL vs HORIZONTAL-TB orthogonal flows.</p>
+
+<p>Direction: LTR vs LTR</p>
+<div class="container">
+    <div class="grid fit-content verticalRL directionLTR">
+        <div class="item firstRowFirstColumn   horizontalTB selfEnd"    data-offset-x="150" data-offset-y="80">end</div>
+        <div class="item firstRowSecondColumn  horizontalTB selfCenter" data-offset-x="200" data-offset-y="140">center</div>
+        <div class="item secondRowFirstColumn  horizontalTB selfLeft"   data-offset-x="100" data-offset-y="0">left</div>
+        <div class="item secondRowSecondColumn horizontalTB selfRight"  data-offset-x="100" data-offset-y="180">right</div>
+    </div>
+</div>
+<br>
+<div class="container">
+    <div class="grid fit-content verticalRL directionLTR">
+        <div class="item firstRowFirstColumn   horizontalTB selfSelfEnd"   data-offset-x="250" data-offset-y="80">s-end</div>
+        <div class="item firstRowSecondColumn  horizontalTB selfStart"     data-offset-x="250" data-offset-y="100">start</div>
+        <div class="item secondRowFirstColumn  horizontalTB"               data-offset-x="100" data-offset-y="0">default</div>
+        <div class="item secondRowSecondColumn horizontalTB selfSelfStart" data-offset-x="0"   data-offset-y="100">s-start</div>
+    </div>
+</div>
+
+<p>Direction: RTL vs LTR</p>
+<div class="container">
+    <div class="grid fit-content verticalRL directionRTL">
+        <div class="item firstRowFirstColumn   directionLTR horizontalTB selfEnd"    data-offset-x="150" data-offset-y="100">end</div>
+        <div class="item firstRowSecondColumn  directionLTR horizontalTB selfCenter" data-offset-x="200" data-offset-y="40">center</div>
+        <div class="item secondRowFirstColumn  directionLTR horizontalTB selfLeft"   data-offset-x="100" data-offset-y="100">left</div>
+        <div class="item secondRowSecondColumn directionLTR horizontalTB selfRight"  data-offset-x="100" data-offset-y="80">right</div>
+    </div>
+</div>
+<br>
+<div class="container">
+    <div class="grid fit-content verticalRL directionRTL">
+        <div class="item firstRowFirstColumn   directionLTR horizontalTB selfSelfEnd"   data-offset-x="250" data-offset-y="180">s-end</div>
+        <div class="item firstRowSecondColumn  directionLTR horizontalTB selfStart"     data-offset-x="250" data-offset-y="80">start</div>
+        <div class="item secondRowFirstColumn  directionLTR horizontalTB"               data-offset-x="100" data-offset-y="180">default</div>
+        <div class="item secondRowSecondColumn directionLTR horizontalTB selfSelfStart" data-offset-x="0"   data-offset-y="0">s-start</div>
+    </div>
+</div>
+
+<p>Direction: LTR vs RTL</p>
+<div class="container">
+    <div class="grid fit-content verticalRL directionLTR">
+        <div class="item firstRowFirstColumn   directionRTL horizontalTB selfEnd"    data-offset-x="150" data-offset-y="80">end</div>
+        <div class="item firstRowSecondColumn  directionRTL horizontalTB selfCenter" data-offset-x="200" data-offset-y="140">center</div>
+        <div class="item secondRowFirstColumn  directionRTL horizontalTB selfLeft"   data-offset-x="100" data-offset-y="0">left</div>
+        <div class="item secondRowSecondColumn directionRTL horizontalTB selfRight"  data-offset-x="100" data-offset-y="180">right</div>
+    </div>
+</div>
+<br>
+<div class="container">
+    <div class="grid fit-content verticalRL directionLTR">
+        <div class="item firstRowFirstColumn   directionRTL horizontalTB selfSelfEnd"   data-offset-x="150" data-offset-y="80">s-end</div>
+        <div class="item firstRowSecondColumn  directionRTL horizontalTB selfStart"     data-offset-x="250" data-offset-y="100">start</div>
+        <div class="item secondRowFirstColumn  directionRTL horizontalTB"               data-offset-x="100" data-offset-y="0">default</div>
+        <div class="item secondRowSecondColumn directionRTL horizontalTB selfSelfStart" data-offset-x="100" data-offset-y="100">s-start</div>
+    </div>
+</div>
+
+<p>Direction: RTL vs RTL</p>
+<div class="container">
+    <div class="grid fit-content verticalRL directionRTL">
+        <div class="item firstRowFirstColumn   horizontalTB selfEnd"    data-offset-x="150" data-offset-y="100">end</div>
+        <div class="item firstRowSecondColumn  horizontalTB selfCenter" data-offset-x="200" data-offset-y="40">center</div>
+        <div class="item secondRowFirstColumn  horizontalTB selfLeft"   data-offset-x="100" data-offset-y="100">left</div>
+        <div class="item secondRowSecondColumn horizontalTB selfRight"  data-offset-x="100" data-offset-y="80">right</div>
+    </div>
+</div>
+<br>
+<div class="container">
+    <div class="grid fit-content verticalRL directionRTL">
+        <div class="item firstRowFirstColumn   horizontalTB selfSelfEnd"   data-offset-x="150" data-offset-y="180">s-end</div>
+        <div class="item firstRowSecondColumn  horizontalTB selfStart"     data-offset-x="250" data-offset-y="80">start</div>
+        <div class="item secondRowFirstColumn  horizontalTB"               data-offset-x="100" data-offset-y="180">default</div>
+        <div class="item secondRowSecondColumn horizontalTB selfSelfStart" data-offset-x="100" data-offset-y="0">s-start</div>
+    </div>
+</div>
+
+</body>

Added: trunk/LayoutTests/fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows.html (0 => 203771)


--- trunk/LayoutTests/fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows.html	2016-07-27 10:07:19 UTC (rev 203771)
@@ -0,0 +1,162 @@
+<!DOCTYPE html>
+<link href="" rel="stylesheet">
+<link href="" rel="stylesheet">
+<link href="" rel="stylesheet">
+<script src=""
+<style>
+body {
+    margin: 0;
+}
+.container {
+    position: relative;
+}
+.grid {
+    grid-template-columns: 100px 100px;
+    grid-template-rows: 150px 150px;
+    font-size: 10px;
+}
+.item {
+   width: 20px;
+   height: 50px;
+}
+</style>
+<body _onload_="checkLayout('.grid')">
+<div id="log"></div>
+<p>This test checks that grid items alignment works as expected with HORIZONTAL-TB vs VERTICAL-RL orthogonal flows.</p>
+
+<p>Orthogonal flows: HORIZONTAL-TB vs VERTICAL-RL</p>
+<p>Direction: LTR vs LTR</p>
+<div class="container">
+    <div class="grid fit-content directionLTR">
+        <div class="item firstRowFirstColumn   verticalRL selfEnd"    data-offset-x="80"  data-offset-y="100">end</div>
+        <div class="item firstRowSecondColumn  verticalRL selfCenter" data-offset-x="140" data-offset-y="50">center</div>
+        <div class="item secondRowFirstColumn  verticalRL selfLeft"   data-offset-x="0"   data-offset-y="150">left</div>
+        <div class="item secondRowSecondColumn verticalRL selfRight"  data-offset-x="180" data-offset-y="150">right</div>
+    </div>
+</div>
+<br>
+<div class="container">
+    <div class="grid fit-content directionLTR">
+        <div class="item firstRowFirstColumn   verticalRL selfSelfEnd"   data-offset-x="0"   data-offset-y="100">s-end</div>
+        <div class="item firstRowSecondColumn  verticalRL selfStart"     data-offset-x="100" data-offset-y="0">start</div>
+        <div class="item secondRowFirstColumn  verticalRL"               data-offset-x="0"   data-offset-y="150">default</div>
+        <div class="item secondRowSecondColumn verticalRL selfSelfStart" data-offset-x="180" data-offset-y="150">s-start</div>
+    </div>
+</div>
+
+<p>Direction: RTL vs LTR</p>
+<div class="container">
+    <div class="grid fit-content directionRTL">
+        <div class="item firstRowFirstColumn   directionLTR verticalRL selfEnd"    data-offset-x="100" data-offset-y="100">end</div>
+        <div class="item firstRowSecondColumn  directionLTR verticalRL selfCenter" data-offset-x="40"  data-offset-y="50">center</div>
+        <div class="item secondRowFirstColumn  directionLTR verticalRL selfLeft"   data-offset-x="100" data-offset-y="150">left</div>
+        <div class="item secondRowSecondColumn directionLTR verticalRL selfRight"  data-offset-x="80"  data-offset-y="150">right</div>
+    </div>
+</div>
+<br>
+<div class="container">
+    <div class="grid fit-content directionRTL">
+        <div class="item firstRowFirstColumn   directionLTR verticalRL selfSelfEnd"   data-offset-x="100" data-offset-y="100">s-end</div>
+        <div class="item firstRowSecondColumn  directionLTR verticalRL selfStart"     data-offset-x="80"  data-offset-y="0">start</div>
+        <div class="item secondRowFirstColumn  directionLTR verticalRL"               data-offset-x="180" data-offset-y="150">default</div>
+        <div class="item secondRowSecondColumn directionLTR verticalRL selfSelfStart" data-offset-x="80"  data-offset-y="150">s-start</div>
+    </div>
+</div>
+
+<p>Direction: LTR vs RTL</p>
+<div class="container">
+    <div class="grid fit-content directionLTR">
+        <div class="item firstRowFirstColumn   directionRTL verticalRL selfEnd"    data-offset-x="80"  data-offset-y="100">end</div>
+        <div class="item firstRowSecondColumn  directionRTL verticalRL selfCenter" data-offset-x="140" data-offset-y="50">center</div>
+        <div class="item secondRowFirstColumn  directionRTL verticalRL selfLeft"   data-offset-x="0"   data-offset-y="150">left</div>
+        <div class="item secondRowSecondColumn directionRTL verticalRL selfRight"  data-offset-x="180" data-offset-y="150">right</div>
+    </div>
+</div>
+<br>
+<div class="container">
+    <div class="grid fit-content directionLTR">
+        <div class="item firstRowFirstColumn   directionRTL verticalRL selfSelfEnd"   data-offset-x="0"  data-offset-y="0">s-end</div>
+        <div class="item firstRowSecondColumn  directionRTL verticalRL selfStart"     data-offset-x="100" data-offset-y="0">start</div>
+        <div class="item secondRowFirstColumn  directionRTL verticalRL"               data-offset-x="0"   data-offset-y="150">default</div>
+        <div class="item secondRowSecondColumn directionRTL verticalRL selfSelfStart" data-offset-x="180" data-offset-y="250">s-start</div>
+    </div>
+</div>
+
+<p>Direction: RTL vs RTL</p>
+<div class="container">
+    <div class="grid fit-content directionRTL">
+        <div class="item firstRowFirstColumn   verticalRL selfEnd"    data-offset-x="100" data-offset-y="100">end</div>
+        <div class="item firstRowSecondColumn  verticalRL selfCenter" data-offset-x="40"  data-offset-y="50">center</div>
+        <div class="item secondRowFirstColumn  verticalRL selfLeft"   data-offset-x="100" data-offset-y="150">left</div>
+        <div class="item secondRowSecondColumn verticalRL selfRight"  data-offset-x="80"  data-offset-y="150">right</div>
+    </div>
+</div>
+<br>
+<div class="container">
+    <div class="grid fit-content directionRTL">
+        <div class="item firstRowFirstColumn   verticalRL selfSelfEnd"   data-offset-x="100" data-offset-y="0">s-end</div>
+        <div class="item firstRowSecondColumn  verticalRL selfStart"     data-offset-x="80"  data-offset-y="0">start</div>
+        <div class="item secondRowFirstColumn  verticalRL"               data-offset-x="180" data-offset-y="150">default</div>
+        <div class="item secondRowSecondColumn verticalRL selfSelfStart" data-offset-x="80"  data-offset-y="250">s-start</div>
+    </div>
+</div>
+
+<!-- HORIZONTAL-TB vs VERTICAL-LR -->
+<p>Orthogonal flows: HORIZONTAL-TB vs VERTICAL-LR</p>
+<p>Direction: LTR vs LTR</p>
+<div class="container">
+    <div class="grid fit-content drectionLTR">
+        <div class="item firstRowFirstColumn   verticalLR selfEnd"    data-offset-x="80"  data-offset-y="100">end</div>
+        <div class="item firstRowSecondColumn  verticalLR selfCenter" data-offset-x="140" data-offset-y="50">center</div>
+        <div class="item secondRowFirstColumn  verticalLR selfLeft"   data-offset-x="0"   data-offset-y="150">left</div>
+        <div class="item secondRowSecondColumn verticalLR selfRight"  data-offset-x="180" data-offset-y="150">right</div>
+    </div>
+</div>
+<br>
+<div class="container">
+    <div class="grid fit-content drectionLTR">
+        <div class="item firstRowFirstColumn   verticalLR selfSelfEnd"   data-offset-x="80"   data-offset-y="100">s-end</div>
+        <div class="item firstRowSecondColumn  verticalLR selfStart"     data-offset-x="100" data-offset-y="0">start</div>
+        <div class="item secondRowFirstColumn  verticalLR"               data-offset-x="0"   data-offset-y="150">default</div>
+        <div class="item secondRowSecondColumn verticalLR selfSelfStart" data-offset-x="100" data-offset-y="150">s-start</div>
+    </div>
+</div>
+
+<p>Direction: RTL vs LTR</p>
+<div class="container">
+    <div class="grid fit-content directionRTL">
+        <div class="item firstRowFirstColumn   directionLTR verticalLR selfEnd"    data-offset-x="100" data-offset-y="100">end</div>
+        <div class="item firstRowSecondColumn  directionLTR verticalLR selfCenter" data-offset-x="40"  data-offset-y="50">center</div>
+        <div class="item secondRowFirstColumn  directionLTR verticalLR selfLeft"   data-offset-x="100"   data-offset-y="150">left</div>
+        <div class="item secondRowSecondColumn directionLTR verticalLR selfRight"  data-offset-x="80"   data-offset-y="150">right</div>
+    </div>
+</div>
+<br>
+<div class="container">
+    <div class="grid fit-content directionRTL">
+        <div class="item firstRowFirstColumn   directionLTR verticalLR selfSelfEnd"   data-offset-x="180" data-offset-y="100">s-end</div>
+        <div class="item firstRowSecondColumn  directionLTR verticalLR selfStart"     data-offset-x="80"  data-offset-y="0">start</div>
+        <div class="item secondRowFirstColumn  directionLTR verticalLR"               data-offset-x="180" data-offset-y="150">default</div>
+        <div class="item secondRowSecondColumn directionLTR verticalLR selfSelfStart" data-offset-x="0"   data-offset-y="150">s-start</div>
+    </div>
+</div>
+
+<p>Direction: RTL vs RTL</p>
+<div class="container">
+    <div class="grid fit-content directionRTL">
+        <div class="item firstRowFirstColumn   verticalLR selfEnd"    data-offset-x="100" data-offset-y="100">end</div>
+        <div class="item firstRowSecondColumn  verticalLR selfCenter" data-offset-x="40"  data-offset-y="50">center</div>
+        <div class="item secondRowFirstColumn  verticalLR selfLeft"   data-offset-x="100" data-offset-y="150">left</div>
+        <div class="item secondRowSecondColumn verticalLR selfRight"  data-offset-x="80"  data-offset-y="150">right</div>
+    </div>
+</div>
+<br>
+<div class="container">
+    <div class="grid fit-content directionRTL">
+        <div class="item firstRowFirstColumn   verticalLR selfSelfEnd"   data-offset-x="180" data-offset-y="0">s-end</div>
+        <div class="item firstRowSecondColumn  verticalLR selfStart"     data-offset-x="80"  data-offset-y="0">start</div>
+        <div class="item secondRowFirstColumn  verticalLR"               data-offset-x="180" data-offset-y="150">default</div>
+        <div class="item secondRowSecondColumn verticalLR selfSelfStart" data-offset-x="0"  data-offset-y="250">s-start</div>
+    </div>
+</div>
+</body>

Modified: trunk/LayoutTests/fast/css-grid-layout/resources/grid-alignment.css (203770 => 203771)


--- trunk/LayoutTests/fast/css-grid-layout/resources/grid-alignment.css	2016-07-27 07:42:16 UTC (rev 203770)
+++ trunk/LayoutTests/fast/css-grid-layout/resources/grid-alignment.css	2016-07-27 10:07:19 UTC (rev 203771)
@@ -40,6 +40,10 @@
 .alignContentRight { align-content: right; }
 .alignContentFlexStart { align-content: flex-start; }
 .alignContentFlexEnd { align-content: flex-end; }
+.alignContentSpaceBetween { align-content: space-between; }
+.alignContentSpaceAround { align-content: space-around; }
+.alignContentSpaceEvenly { align-content: space-evenly; }
+.alignContentStretch { align-content: stretch; }
 
 /* justify-self */
 .justifySelfAuto { justify-self: auto; }
@@ -91,6 +95,7 @@
     align-items: start;
     justify-items: start;
 }
+
 .itemsCenter {
     align-items: center;
     justify-items: center;
@@ -121,16 +126,39 @@
     justify-items: self-end;
 }
 
-.stretch {
-    align-self: stretch;
-    justify-self: stretch;
-}
-
 /* Both align-self and justify-self */
 .selfStretch {
     align-self: stretch;
     justify-self: stretch;
 }
+.selfStart {
+    align-self: start;
+    justify-self: start;
+}
+.selfEnd {
+    align-self: end;
+    justify-self: end;
+}
+.selfCenter {
+    align-self: center;
+    justify-self: center;
+}
+.selfRight {
+    align-self: right;
+    justify-self: right;
+}
+.selfLeft {
+    align-self: left;
+    justify-self: left;
+}
+.selfSelfStart {
+    align-self: self-start;
+    justify-self: self-start;
+}
+.selfSelfEnd {
+    align-self: self-end;
+    justify-self: self-end;
+}
 
 /* Both align-content and justify-content */
 .contentStart {

Modified: trunk/Source/WebCore/ChangeLog (203770 => 203771)


--- trunk/Source/WebCore/ChangeLog	2016-07-27 07:42:16 UTC (rev 203770)
+++ trunk/Source/WebCore/ChangeLog	2016-07-27 10:07:19 UTC (rev 203771)
@@ -1,3 +1,31 @@
+2016-07-27  Javier Fernandez  <[email protected]>
+
+        [css-grid] Handle alignment with orthogonal flows
+        https://bugs.webkit.org/show_bug.cgi?id=159295
+
+        Reviewed by Darin Adler.
+
+        Now that grid sizing and positioning issues wrt orthogonal flows have
+        been clarified in the last spec draft, we can adapt now our alignment
+        logic to work with orthogonal flows.
+
+        Even though basic alignment would work with orthogonal flows with
+        this patch, we still doesn't allow stretching in that case. I'll provide a
+        patch for that feature since it's a complex logic and better have an
+        isolated change.
+
+        Tests: fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-lr.html
+               fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows-vertical-rl.html
+               fast/css-grid-layout/grid-item-alignment-with-orthogonal-flows.html
+
+        * rendering/RenderGrid.cpp:
+        (WebCore::computeOverflowAlignmentOffset): Using 'size' instead of 'breadth' as concept.
+        (WebCore::RenderGrid::columnAxisPositionForChild): Dealing with orthogonal flow cases.
+        (WebCore::RenderGrid::rowAxisPositionForChild): Dealing with orthogonal flow cases.
+        (WebCore::RenderGrid::columnAxisOffsetForChild): Using 'size' instead of 'breadth' as concept.
+        (WebCore::RenderGrid::rowAxisOffsetForChild): Using 'size' instead of 'breadth' as concept.
+        (WebCore::RenderGrid::findChildLogicalPosition): Dealing with orthogonal flow cases.
+
 2016-07-26  Youenn Fablet  <[email protected]>
 
         [Fetch API] Response constructor should be able to take a ReadableStream as body

Modified: trunk/Source/WebCore/rendering/RenderGrid.cpp (203770 => 203771)


--- trunk/Source/WebCore/rendering/RenderGrid.cpp	2016-07-27 07:42:16 UTC (rev 203770)
+++ trunk/Source/WebCore/rendering/RenderGrid.cpp	2016-07-27 10:07:19 UTC (rev 203771)
@@ -2112,9 +2112,9 @@
     offsetBetweenTracks = offset.distributionOffset;
 }
 
-static inline LayoutUnit computeOverflowAlignmentOffset(OverflowAlignment overflow, LayoutUnit trackBreadth, LayoutUnit childBreadth)
+static LayoutUnit computeOverflowAlignmentOffset(OverflowAlignment overflow, LayoutUnit trackSize, LayoutUnit childSize)
 {
-    LayoutUnit offset = trackBreadth - childBreadth;
+    LayoutUnit offset = trackSize - childSize;
     switch (overflow) {
     case OverflowAlignmentSafe:
         // If overflow is 'safe', we have to make sure we don't overflow the 'start'
@@ -2263,34 +2263,51 @@
 GridAxisPosition RenderGrid::columnAxisPositionForChild(const RenderBox& child) const
 {
     bool hasSameWritingMode = child.style().writingMode() == style().writingMode();
+    bool childIsLTR = child.style().isLeftToRightDirection();
 
     switch (child.style().resolvedAlignSelf(style(), selfAlignmentNormalBehavior).position()) {
     case ItemPositionSelfStart:
-        // If orthogonal writing-modes, this computes to 'start'.
-        // FIXME: grid track sizing and positioning do not support orthogonal modes yet.
-        // self-start is based on the child's block axis direction. That's why we need to check against the grid container's block flow.
-        return (isOrthogonalChild(child) || hasSameWritingMode) ? GridAxisStart : GridAxisEnd;
+        // FIXME: Should we implement this logic in a generic utility function ?
+        // Aligns the alignment subject to be flush with the edge of the alignment container
+        // corresponding to the alignment subject's 'start' side in the column axis.
+        if (isOrthogonalChild(child)) {
+            // If orthogonal writing-modes, self-start will be based on the child's inline-axis
+            // direction (inline-start), because it's the one parallel to the column axis.
+            if (style().isFlippedBlocksWritingMode())
+                return childIsLTR ? GridAxisEnd : GridAxisStart;
+            return childIsLTR ? GridAxisStart : GridAxisEnd;
+        }
+        // self-start is based on the child's block-flow direction. That's why we need to check against the grid container's block-flow direction.
+        return hasSameWritingMode ? GridAxisStart : GridAxisEnd;
     case ItemPositionSelfEnd:
-        // If orthogonal writing-modes, this computes to 'end'.
-        // FIXME: grid track sizing and positioning do not support orthogonal modes yet.
-        // self-end is based on the child's block axis direction. That's why we need to check against the grid container's block flow.
-        return (isOrthogonalChild(child) || hasSameWritingMode) ? GridAxisEnd : GridAxisStart;
+        // FIXME: Should we implement this logic in a generic utility function ?
+        // Aligns the alignment subject to be flush with the edge of the alignment container
+        // corresponding to the alignment subject's 'end' side in the column axis.
+        if (isOrthogonalChild(child)) {
+            // If orthogonal writing-modes, self-end will be based on the child's inline-axis
+            // direction, (inline-end) because it's the one parallel to the column axis.
+            if (style().isFlippedBlocksWritingMode())
+                return childIsLTR ? GridAxisStart : GridAxisEnd;
+            return childIsLTR ? GridAxisEnd : GridAxisStart;
+        }
+        // self-end is based on the child's block-flow direction. That's why we need to check against the grid container's block-flow direction.
+        return hasSameWritingMode ? GridAxisEnd : GridAxisStart;
     case ItemPositionLeft:
-        // The alignment axis (column axis) and the inline axis are parallell in
-        // orthogonal writing mode. Otherwise this this is equivalent to 'start'.
-        // FIXME: grid track sizing and positioning do not support orthogonal modes yet.
+        // Aligns the alignment subject to be flush with the alignment container's 'line-left' edge.
+        // The alignment axis (column axis) is always orthogonal to the inline axis, hence this value behaves as 'start'.
         return GridAxisStart;
     case ItemPositionRight:
-        // The alignment axis (column axis) and the inline axis are parallell in
-        // orthogonal writing mode. Otherwise this this is equivalent to 'start'.
-        // FIXME: grid track sizing and positioning do not support orthogonal modes yet.
-        return isOrthogonalChild(child) ? GridAxisEnd : GridAxisStart;
+        // Aligns the alignment subject to be flush with the alignment container's 'line-right' edge.
+        // The alignment axis (column axis) is always orthogonal to the inline axis, hence this value behaves as 'start'.
+        return GridAxisStart;
     case ItemPositionCenter:
         return GridAxisCenter;
     case ItemPositionFlexStart: // Only used in flex layout, otherwise equivalent to 'start'.
+        // Aligns the alignment subject to be flush with the alignment container's 'start' edge (block-start) in the column axis.
     case ItemPositionStart:
         return GridAxisStart;
     case ItemPositionFlexEnd: // Only used in flex layout, otherwise equivalent to 'end'.
+        // Aligns the alignment subject to be flush with the alignment container's 'end' edge (block-end) in the column axis.
     case ItemPositionEnd:
         return GridAxisEnd;
     case ItemPositionStretch:
@@ -2311,28 +2328,51 @@
 GridAxisPosition RenderGrid::rowAxisPositionForChild(const RenderBox& child) const
 {
     bool hasSameDirection = child.style().direction() == style().direction();
-    bool isLTR = style().isLeftToRightDirection();
+    bool gridIsLTR = style().isLeftToRightDirection();
 
     switch (child.style().resolvedJustifySelf(style(), selfAlignmentNormalBehavior).position()) {
     case ItemPositionSelfStart:
-        // For orthogonal writing-modes, this computes to 'start'
-        // FIXME: grid track sizing and positioning do not support orthogonal modes yet.
-        // self-start is based on the child's direction. That's why we need to check against the grid container's direction.
-        return (isOrthogonalChild(child) || hasSameDirection) ? GridAxisStart : GridAxisEnd;
+        // FIXME: Should we implement this logic in a generic utility function ?
+        // Aligns the alignment subject to be flush with the edge of the alignment container
+        // corresponding to the alignment subject's 'start' side in the row axis.
+        if (isOrthogonalChild(child)) {
+            // If orthogonal writing-modes, self-start will be based on the child's block-axis
+            // direction, because it's the one parallel to the row axis.
+            if (child.style().isFlippedBlocksWritingMode())
+                return gridIsLTR ? GridAxisEnd : GridAxisStart;
+            return gridIsLTR ? GridAxisStart : GridAxisEnd;
+        }
+        // self-start is based on the child's inline-flow direction. That's why we need to check against the grid container's direction.
+        return hasSameDirection ? GridAxisStart : GridAxisEnd;
     case ItemPositionSelfEnd:
-        // For orthogonal writing-modes, this computes to 'start'
-        // FIXME: grid track sizing and positioning do not support orthogonal modes yet.
-        return (isOrthogonalChild(child) || hasSameDirection) ? GridAxisEnd : GridAxisStart;
+        // FIXME: Should we implement this logic in a generic utility function ?
+        // Aligns the alignment subject to be flush with the edge of the alignment container
+        // corresponding to the alignment subject's 'end' side in the row axis.
+        if (isOrthogonalChild(child)) {
+            // If orthogonal writing-modes, self-end will be based on the child's block-axis
+            // direction, because it's the one parallel to the row axis.
+            if (child.style().isFlippedBlocksWritingMode())
+                return gridIsLTR ? GridAxisStart : GridAxisEnd;
+            return gridIsLTR ? GridAxisEnd : GridAxisStart;
+        }
+        // self-end is based on the child's inline-flow direction. That's why we need to check against the grid container's direction.
+        return hasSameDirection ? GridAxisEnd : GridAxisStart;
     case ItemPositionLeft:
-        return isLTR ? GridAxisStart : GridAxisEnd;
+        // Aligns the alignment subject to be flush with the alignment container's 'line-left' edge.
+        // We want the physical 'left' side, so we have to take account, container's inline-flow direction.
+        return gridIsLTR ? GridAxisStart : GridAxisEnd;
     case ItemPositionRight:
-        return isLTR ? GridAxisEnd : GridAxisStart;
+        // Aligns the alignment subject to be flush with the alignment container's 'line-right' edge.
+        // We want the physical 'right' side, so we have to take account, container's inline-flow direction.
+        return gridIsLTR ? GridAxisEnd : GridAxisStart;
     case ItemPositionCenter:
         return GridAxisCenter;
     case ItemPositionFlexStart: // Only used in flex layout, otherwise equivalent to 'start'.
+        // Aligns the alignment subject to be flush with the alignment container's 'start' edge (inline-start) in the row axis.
     case ItemPositionStart:
         return GridAxisStart;
     case ItemPositionFlexEnd: // Only used in flex layout, otherwise equivalent to 'end'.
+        // Aligns the alignment subject to be flush with the alignment container's 'end' edge (inline-end) in the row axis.
     case ItemPositionEnd:
         return GridAxisEnd;
     case ItemPositionStretch:
@@ -2371,9 +2411,9 @@
         // (this does not have to be done for the last track as there are no more m_rowPositions after it).
         if (childEndLine < m_rowPositions.size() - 1)
             endOfRow -= gridGapForDirection(ForRows) + m_offsetBetweenRows;
-        LayoutUnit childBreadth = child.logicalHeight() + child.marginLogicalHeight();
+        LayoutUnit columnAxisChildSize = isOrthogonalChild(child) ? child.logicalWidth() + child.marginLogicalWidth() : child.logicalHeight() + child.marginLogicalHeight();
         auto overflow = child.style().resolvedAlignSelf(style(), selfAlignmentNormalBehavior).overflow();
-        LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(overflow, endOfRow - startOfRow, childBreadth);
+        LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(overflow, endOfRow - startOfRow, columnAxisChildSize);
         return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPosition : offsetFromStartPosition / 2);
     }
     }
@@ -2404,9 +2444,9 @@
         // (this does not have to be done for the last track as there are no more m_columnPositions after it).
         if (childEndLine < m_columnPositions.size() - 1)
             endOfColumn -= gridGapForDirection(ForColumns) + m_offsetBetweenColumns;
-        LayoutUnit childBreadth = child.logicalWidth() + child.marginLogicalWidth();
+        LayoutUnit rowAxisChildSize = isOrthogonalChild(child) ? child.logicalHeight() + child.marginLogicalHeight() : child.logicalWidth() + child.marginLogicalWidth();
         auto overflow = child.style().resolvedJustifySelf(style(), selfAlignmentNormalBehavior).overflow();
-        LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(overflow, endOfColumn - startOfColumn, childBreadth);
+        LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(overflow, endOfColumn - startOfColumn, rowAxisChildSize);
         return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPosition : offsetFromStartPosition / 2);
     }
     }
@@ -2532,7 +2572,7 @@
     // We stored m_columnPositions's data ignoring the direction, hence we might need now
     // to translate positions from RTL to LTR, as it's more convenient for painting.
     if (!style().isLeftToRightDirection())
-        rowAxisOffset = translateRTLCoordinate(rowAxisOffset) - child.logicalWidth();
+        rowAxisOffset = translateRTLCoordinate(rowAxisOffset) - (isOrthogonalChild(child) ? child.logicalHeight()  : child.logicalWidth());
 
     // "In the positioning phase [...] calculations are performed according to the writing mode
     // of the containing block of the box establishing the orthogonal flow." However, the
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to