auto margins on flexbox should allocate space in the cross direction
[WebKit-https.git] / LayoutTests / css3 / flexbox / flex-align.html
1 <!DOCTYPE html>
2 <html>
3 <style>
4 body {
5     margin: 0;
6 }
7 .flexbox {
8     width: 600px;
9     display: -webkit-flex;
10     background-color: #aaa;
11     position: relative;
12 }
13 .flexbox > div {
14     border: 0;
15 }
16
17 .flexbox :nth-child(1) {
18     background-color: blue;
19 }
20 .flexbox :nth-child(2) {
21     background-color: green;
22 }
23 .flexbox :nth-child(3) {
24     background-color: red;
25 }
26 .flexbox :nth-child(4) {
27     background-color: yellow;
28 }
29 .flexbox :nth-child(5) {
30     background-color: purple;
31 }
32 .flexbox :nth-child(6) {
33     background-color: orange;
34 }
35 .flexbox :nth-child(7) {
36     background-color: lime;
37 }
38 .flexbox :nth-child(8) {
39     background-color: lightblue;
40 }
41 .flexbox :nth-child(9) {
42     background-color: darkred;
43 }
44 .flexbox :nth-child(10) {
45     background-color: gold;
46 }
47 .flexbox :nth-child(11) {
48     background-color: salmon;
49 }
50 </style>
51 <script>
52 if (window.layoutTestController)
53     layoutTestController.dumpAsText();
54 </script>
55 <script src="resources/flexbox.js"></script>
56 <body onload="checkFlexBoxen()">
57
58 <!-- stretch is the default flex-align so these flexitems should all have the same height. -->
59 <div class="flexbox">
60   <div data-expected-height="100" style="-webkit-flex: 1 0 0;"></div>
61   <div data-expected-height="100" style="-webkit-flex: 1 0 0; height: 100px"></div>
62   <div data-expected-height="100" style="-webkit-flex: 1 0 0;"></div>
63 </div>
64
65 <div class="flexbox">
66   <div data-expected-height="60"  data-offset-y="0" style="-webkit-flex: 1 0 0; height: 60px;"></div>
67   <div data-expected-height="120" data-offset-y="0" style="-webkit-flex: 1 0 0;"></div>
68   <div data-expected-height="60"  data-offset-y="30" style="-webkit-flex: 1 0 0; height: 60px; margin: auto 0;"></div>
69   <div data-expected-height="0" data-offset-y="120" style="-webkit-flex: 1 0 0; margin: auto 0 0;"></div>
70   <div data-expected-height="0" data-offset-y="60" style="-webkit-flex: 1 0 0; margin: auto 0;"></div>
71   <div data-expected-height="100" data-offset-y="10" style="-webkit-flex: 1 0 0; height: 100px; margin: 10px 0;"></div>
72   <div data-expected-height="50" data-offset-y="20" style="-webkit-flex: 1 0 0; height: 50px; margin: 20px 0 10px;"></div>
73   <div data-expected-height="90" data-offset-y="20" style="-webkit-flex: 1 0 0; margin: 20px 0 10px;"></div>
74   <div data-expected-height="120" data-offset-y="0" style="-webkit-flex: 1 0 0;">
75     <!-- Since no parent has a fixed height, this div shrink-wraps. -->
76     <div data-expected-height="0" style="height: 100%; background-color:black"></div>
77   </div>
78 </div>
79
80 <div class="flexbox" style="-webkit-flex-align: start">
81     <div data-expected-height="0" data-offset-y="0" style="-webkit-flex: 1 0 0;"></div>
82     <div data-expected-height="100" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 100px;"></div>
83 </div>
84
85 <div class="flexbox" style="-webkit-flex-align: end">
86     <div data-expected-height="0" data-offset-y="100" style="-webkit-flex: 1 0 0;"></div>
87     <div data-expected-height="100" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 100px;"></div>
88 </div>
89
90 <div class="flexbox" style="-webkit-flex-align: center">
91     <div data-expected-height="0" data-offset-y="50" style="-webkit-flex: 1 0 0;"></div>
92     <div data-expected-height="100" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 100px;"></div>
93 </div>
94
95 <div class="flexbox" style="-webkit-flex-align: baseline">
96     <div style="-webkit-flex: 1 0 0;"><div style="display:inline-block;"></div></div>
97     <div data-expected-height="100" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 100px;"></div>
98 </div>
99
100 <div class="flexbox" style="-webkit-flex-align: stretch">
101     <div data-expected-height="100" data-offset-y="0" style="-webkit-flex: 1 0 0;"></div>
102     <div data-expected-height="100" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 100px;"></div>
103 </div>
104
105 <div class="flexbox" style="-webkit-flex-align: start">
106     <div data-expected-height="100" data-offset-y="0" style="-webkit-flex-item-align: auto; -webkit-flex: 1 0 0; height: 100px;"></div>
107     <div data-expected-height="0" data-offset-y="0" style="-webkit-flex-item-align: auto; -webkit-flex: 1 0 0;"></div>
108     <div data-expected-height="0" data-offset-y="0" style="-webkit-flex-item-align: start; -webkit-flex: 1 0 0;"></div>
109     <div data-expected-height="0" data-offset-y="100" style="-webkit-flex-item-align: end; -webkit-flex: 1 0 0;"></div>
110     <div data-expected-height="0" data-offset-y="50" style="-webkit-flex-item-align: center; -webkit-flex: 1 0 0;"></div>
111     <div data-offset-y="20" style="-webkit-flex-item-align: baseline; -webkit-flex: 1 0 0;"><div style="display:inline-block;"></div></div>
112     <div data-offset-y="20" style="-webkit-flex-item-align: baseline; -webkit-flex: 1 0 0; margin: 20px;"><div style="display:inline-block;"></div></div>
113     <div data-offset-y="50" style="-webkit-flex-item-align: baseline; -webkit-flex: 1 0 0; margin: auto 0;"></div>
114     <div data-offset-y="30" style="-webkit-flex-item-align: baseline; -webkit-flex: 1 0 0; margin: 30px 0 auto;"><div style="display:inline-block;"></div></div>
115     <div data-offset-y="80" style="-webkit-flex-item-align: baseline; -webkit-flex: 1 0 0; margin: auto 0 20px;"></div>
116     <div data-expected-height="100" data-offset-y="0" style="-webkit-flex-item-align: stretch; -webkit-flex: 1 0 0;"></div>
117 </div>
118
119 <div class="flexbox" style="-webkit-flex-align: end">
120     <div data-expected-height="100" data-offset-y="0" style="-webkit-flex-item-align: auto; -webkit-flex: 1 0 0; height: 100px;"></div>
121     <div data-expected-height="0" data-offset-y="100" style="-webkit-flex-item-align: auto; -webkit-flex: 1 0 0;"></div>
122     <div data-expected-height="0" data-offset-y="0" style="-webkit-flex-item-align: start; -webkit-flex: 1 0 0;"></div>
123     <div data-expected-height="0" data-offset-y="100" style="-webkit-flex-item-align: end; -webkit-flex: 1 0 0;"></div>
124     <div data-expected-height="0" data-offset-y="50" style="-webkit-flex-item-align: center; -webkit-flex: 1 0 0;"></div>
125     <div data-offset-y="20" style="-webkit-flex-item-align: baseline; -webkit-flex: 1 0 0;"><div style="display:inline-block;"></div></div>
126     <div data-offset-y="20" style="-webkit-flex-item-align: baseline; -webkit-flex: 1 0 0; margin: 20px;"><div style="display:inline-block;"></div></div>
127     <div data-expected-height="100" data-offset-y="0" style="-webkit-flex-item-align: stretch; -webkit-flex: 1 0 0;"></div>
128 </div>
129
130 <div class="flexbox" style="-webkit-flex-align: center">
131     <div data-expected-height="100" data-offset-y="0" style="-webkit-flex-item-align: auto; -webkit-flex: 1 0 0; height: 100px;"></div>
132     <div data-expected-height="0" data-offset-y="50" style="-webkit-flex-item-align: auto; -webkit-flex: 1 0 0;"></div>
133     <div data-expected-height="0" data-offset-y="0" style="-webkit-flex-item-align: start; -webkit-flex: 1 0 0;"></div>
134     <div data-expected-height="0" data-offset-y="100" style="-webkit-flex-item-align: end; -webkit-flex: 1 0 0;"></div>
135     <div data-expected-height="0" data-offset-y="50" style="-webkit-flex-item-align: center; -webkit-flex: 1 0 0;"></div>
136     <div data-offset-y="20" style="-webkit-flex-item-align: baseline; -webkit-flex: 1 0 0;"><div style="display:inline-block;"></div></div>
137     <div data-offset-y="20" style="-webkit-flex-item-align: baseline; -webkit-flex: 1 0 0; margin: 20px;"><div style="display:inline-block;"></div></div>
138     <div data-expected-height="100" data-offset-y="0" style="-webkit-flex-item-align: stretch; -webkit-flex: 1 0 0;"></div>
139 </div>
140
141 <div class="flexbox" style="-webkit-flex-align: baseline">
142     <div data-expected-height="100" data-offset-y="0" style="-webkit-flex-item-align: start; -webkit-flex: 1 0 0; height: 100px;"></div>
143     <div data-offset-y="20" style="-webkit-flex-item-align: auto; -webkit-flex: 1 0 0;"><div style="display:inline-block;"></div></div>
144     <div data-expected-height="0" data-offset-y="0" style="-webkit-flex-item-align: start; -webkit-flex: 1 0 0;"></div>
145     <div data-expected-height="0" data-offset-y="100" style="-webkit-flex-item-align: end; -webkit-flex: 1 0 0;"></div>
146     <div data-expected-height="0" data-offset-y="50" style="-webkit-flex-item-align: center; -webkit-flex: 1 0 0;"></div>
147     <div data-offset-y="20" style="-webkit-flex-item-align: baseline; -webkit-flex: 1 0 0;"><div style="display:inline-block;"></div></div>
148     <div data-offset-y="20" style="-webkit-flex-item-align: baseline; -webkit-flex: 1 0 0; margin: 20px;"><div style="display:inline-block;"></div></div>
149     <div data-expected-height="100" data-offset-y="0" style="-webkit-flex-item-align: stretch; -webkit-flex: 1 0 0;"></div>
150 </div>
151
152 <div class="flexbox" style="-webkit-flex-align: stretch">
153     <div data-expected-height="100" data-offset-y="0" style="-webkit-flex-item-align: auto; -webkit-flex: 1 0 0; height: 100px;"></div>
154     <div data-expected-height="100" data-offset-y="0" style="-webkit-flex-item-align: auto; -webkit-flex: 1 0 0;"></div>
155     <div data-expected-height="0" data-offset-y="0" style="-webkit-flex-item-align: start; -webkit-flex: 1 0 0;"></div>
156     <div data-expected-height="0" data-offset-y="100" style="-webkit-flex-item-align: end; -webkit-flex: 1 0 0;"></div>
157     <div data-expected-height="0" data-offset-y="50" style="-webkit-flex-item-align: center; -webkit-flex: 1 0 0;"></div>
158     <div data-offset-y="20" style="-webkit-flex-item-align: baseline; -webkit-flex: 1 0 0;"><div style="display:inline-block;"></div></div>
159     <div data-offset-y="20" style="-webkit-flex-item-align: baseline; -webkit-flex: 1 0 0; margin: 20px;"><div style="display:inline-block;"></div></div>
160     <div data-expected-height="100" data-offset-y="0" style="-webkit-flex-item-align: stretch; -webkit-flex: 1 0 0;"></div>
161 </div>
162
163 <div class="flexbox" style="height: 100px;">
164   <div data-expected-height="50"  data-offset-y="0" style="-webkit-flex: 1 0 0; height: 50px;"></div>
165   <div data-expected-height="100" data-offset-y="0" style="-webkit-flex: 1 0 0;"></div>
166   <div data-expected-height="100" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 100%;">
167     <div data-expected-height="100" style="height: 100%; background-color:black"></div>
168   </div>
169 </div>
170
171 <div class="flexbox" style="height: 100px;">
172   <div data-expected-height="50"  data-offset-y="0" style="-webkit-flex: 1 0 0; height: 50px;"></div>
173   <div data-expected-height="100" data-offset-y="0" style="-webkit-flex: 1 0 0;"></div>
174 </div>
175
176 <div class="flexbox">
177   <div data-expected-height="50" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 50px;"></div>
178   <div data-expected-height="70" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 70px;"></div>
179   <div data-expected-height="50" data-offset-y="50" style="-webkit-flex: 1 0 0; height: 50px; margin: auto 0 0;"></div>
180   <div data-expected-height="70" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 70px; margin: 0 0 auto"></div>
181   <div data-expected-height="70" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 70px;"></div>
182   <div data-expected-height="100" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 100px;"></div>
183 </div>
184
185 <div class="flexbox">
186   <div data-expected-height="0" data-offset-y="0" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: start;"></div>
187   <div data-expected-height="50" data-offset-y="0" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: start; height: 50px;"></div>
188   <div data-expected-height="50" data-offset-y="25" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: start; height: 50px; margin: auto 0"></div>
189   <div data-expected-height="50" data-offset-y="50" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: start; height: 50px; margin: auto 0 0"></div>
190   <div data-expected-height="50" data-offset-y="0" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: start; height: 50px; margin: 0 0 auto"></div>
191   <div data-expected-height="50" data-offset-y="25" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: start; height: 50px; margin: 25px 0"></div>
192   <div data-expected-height="50" data-offset-y="20" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: start; height: 50px; margin: 20px 0 10px;"></div>
193   <div data-expected-height="100" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 100px;"></div>
194 </div>
195
196 <div class="flexbox">
197   <div data-expected-height="0" data-offset-y="100" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: end;"></div>
198   <div data-expected-height="50" data-offset-y="50" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: end; height: 50px;"></div>
199   <div data-expected-height="50" data-offset-y="25" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: end; height: 50px; margin: auto 0"></div>
200   <div data-expected-height="50" data-offset-y="50" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: end; height: 50px; margin: auto 0 0"></div>
201   <div data-expected-height="50" data-offset-y="0" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: end; height: 50px; margin: 0 0 auto"></div>
202   <div data-expected-height="50" data-offset-y="25" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: end; height: 50px; margin: 25px 0"></div>
203   <div data-expected-height="50" data-offset-y="40" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: end; height: 50px; margin: 20px 0 10px;"></div>
204   <div data-expected-height="100" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 100px;"></div>
205 </div>
206
207 <div class="flexbox">
208   <div data-expected-height="0" data-offset-y="50" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: center;"></div>
209   <div data-expected-height="50" data-offset-y="25" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: center; height: 50px;"></div>
210   <div data-expected-height="50" data-offset-y="25" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: center; height: 50px; margin: auto 0"></div>
211   <div data-expected-height="50" data-offset-y="50" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: center; height: 50px; margin: auto 0 0"></div>
212   <div data-expected-height="50" data-offset-y="0" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: center; height: 50px; margin: 0 0 auto"></div>
213   <div data-expected-height="50" data-offset-y="0" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: center; height: 50px; margin: 0 0 auto"></div>
214   <div data-expected-height="50" data-offset-y="25" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: center; height: 50px; margin: 25px 0"></div>
215   <div data-expected-height="50" data-offset-y="30" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: center; height: 50px; margin: 20px 0 10px;"></div>
216   <div data-expected-height="100" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 100px;"></div>
217 </div>
218
219 <div class="flexbox">
220   <div data-expected-height="50" data-offset-y="0" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: start; height: 50px; -webkit-writing-mode: vertical-rl;"></div>
221   <div data-expected-height="50" data-offset-y="25" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: center; height: 50px; -webkit-writing-mode: vertical-rl;"></div>
222   <div data-expected-height="50" data-offset-y="50" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: end; height: 50px; -webkit-writing-mode: vertical-rl;"></div>
223   <div data-expected-height="50" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 50px; -webkit-writing-mode: vertical-rl;"></div>
224   <div data-expected-height="50" data-offset-y="25" style="-webkit-flex: 1 0 0; height: 50px; margin: auto 0; -webkit-writing-mode: vertical-rl;"></div>
225   <div data-expected-height="100" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 100px; -webkit-writing-mode: vertical-rl;"></div>
226 </div>
227
228 <div class="flexbox">
229   <div data-expected-height="50" data-offset-y="0" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: start; height: 50px;"></div>
230   <div data-expected-height="50" data-offset-y="25" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: center; height: 50px;"></div>
231   <div data-expected-height="50" data-offset-y="50" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: end; height: 50px;"></div>
232   <div data-expected-height="50" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 50px;"></div>
233   <div data-expected-height="50" data-offset-y="25" style="-webkit-flex: 1 0 0; height: 50px; margin: auto 0"></div>
234   <div data-expected-height="100" data-offset-y="0" style="-webkit-flex: 1 0 0;"></div>
235   <div data-expected-height="100" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 100px;"></div>
236 </div>
237
238 <div class="flexbox">
239   <div data-expected-height="20" data-offset-y="20" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: baseline; height: 20px;"></div>
240   <!-- FIXME: This looks like it might be positioned 10 pixels too high due the margin-bottom. All the boxes should have their bottoms aligned I think. -->
241   <div data-expected-height="10" data-offset-y="20" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: baseline; height: 10px; margin: 20px 0 10px;"></div>
242   <div data-expected-height="10" data-offset-y="30" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: baseline; height: 10px; margin: 20px 0 0;"></div>
243   <div data-expected-height="100" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 100px;"></div>
244 </div>
245
246 <div class="flexbox" style="max-height: 20px">
247   <div data-expected-height="40" data-offset-y="-10" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: center; height: 40px;"></div>
248   <div data-expected-height="40" data-offset-y="-20" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: end; height: 40px;"></div>
249   <div data-expected-height="40" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 40px;"></div>
250   <div data-expected-height="20" data-offset-y="0" style="-webkit-flex: 1 0 0;"></div>
251 </div>
252
253 <div class="flexbox">
254   <div id="baseline1" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: baseline;">ahem</div>
255   <div id="baseline2" data-offset-y="0" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: baseline;"><img src="../../fast/replaced/resources/1x1-blue.png" style="height: 50px;"></div>
256   <div data-expected-height="50" data-offset-y="25" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: center;"><img src="../../fast/replaced/resources/1x1-blue.png" style="height: 50px; vertical-align: middle"></div>
257   <div id="baseline3" data-expected-height="50" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: baseline;"><img src="../../fast/replaced/resources/1x1-blue.png" style="height: 50px; vertical-align: middle"></div>
258   <div data-expected-height="100" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 100px;"></div>
259 </div>
260
261 <div class="flexbox">
262   <div id="baseline4" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: baseline;">ahem</div>
263   <div id="baseline5" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: baseline;"><br><img src="../../fast/replaced/resources/1x1-blue.png" style="height: 50px;"></div>
264   <div data-expected-height="50" data-offset-y="0" style="-webkit-flex: 1 0 0; -webkit-flex-item-align: baseline;"><img src="../../fast/replaced/resources/1x1-blue.png" style="height: 50px; vertical-align: middle"></div>
265   <div data-expected-height="100" data-offset-y="0" style="-webkit-flex: 1 0 0; height: 100px;"></div>
266 </div>
267
268 <div id="results"></div>
269
270 <script>
271 function additionalBaselineChecks()
272 {
273     var baseline1 = document.getElementById("baseline1");
274     var baseline2 = document.getElementById("baseline2");
275     var baseline3 = document.getElementById("baseline3");
276     logIfFalse(baseline1.offsetTop + baseline1.offsetHeight == baseline2.offsetTop + baseline2.offsetHeight,
277                "baseline1 and baseline2 should have the same baseline.");
278     logIfFalse(baseline3.offsetTop < 25,
279                "baseline3 should be above the center flex-item-aligned item.");
280
281     var baseline4 = document.getElementById("baseline4");
282     var baseline5 = document.getElementById("baseline5");
283     logIfFalse(baseline4.offsetTop == baseline5.offsetTop,
284                "baseline4 and baseline5 should be top aligned with each other.");
285     logIfFalse(baseline4.offsetTop > 0,
286                "baseline4 and baseline5 should be below baseline6.");
287 }
288
289 function logIfFalse(condition, msg)
290 {
291     if (!condition)
292         document.getElementById("results").innerText += msg;
293 }
294
295 additionalBaselineChecks();
296 </script>
297
298 </body>
299 </html>