|  | <!DOCTYPE html> | 
|  | <link rel="help" href="https://drafts.csswg.org/css-align/#distribution-block"> | 
|  | <script src="/resources/testharness.js"></script> | 
|  | <script src="/resources/testharnessreport.js"></script> | 
|  |  | 
|  | <style> | 
|  | @import "/fonts/ahem.css"; | 
|  | body { | 
|  | font: 10px/1 Ahem; | 
|  | } | 
|  |  | 
|  | td { | 
|  | padding: 0; | 
|  | height: 50px; | 
|  | } | 
|  |  | 
|  | td:nth-child(2) { | 
|  | font-size: 20px; | 
|  | } | 
|  |  | 
|  | .valign-top td { | 
|  | vertical-align: top; | 
|  | } | 
|  | .valign-middle td { | 
|  | vertical-align: middle; | 
|  | } | 
|  | .valign-bottom td { | 
|  | vertical-align: bottom; | 
|  | } | 
|  | .valign-middle-short td { | 
|  | vertical-align: middle; | 
|  | height: 10px; | 
|  | } | 
|  | .valign-bottom-short td { | 
|  | vertical-align: bottom; | 
|  | height: 10px; | 
|  | } | 
|  | .valign-baseline td { | 
|  | vertical-align: baseline; | 
|  | } | 
|  |  | 
|  | .alignc-start td { | 
|  | align-content: start; | 
|  | } | 
|  | .alignc-center td { | 
|  | align-content: unsafe center; | 
|  | } | 
|  | .alignc-end td { | 
|  | align-content: unsafe end; | 
|  | } | 
|  | .alignc-center-short td { | 
|  | align-content: unsafe center; | 
|  | height: 10px; | 
|  | } | 
|  | .alignc-end-short td { | 
|  | align-content: unsafe end; | 
|  | height: 10px; | 
|  | } | 
|  | .alignc-baseline td { | 
|  | align-content: baseline; | 
|  | } | 
|  |  | 
|  | .alignc-safe-center td { | 
|  | align-content: safe center; | 
|  | } | 
|  | .alignc-safe-end td { | 
|  | align-content: safe end; | 
|  | } | 
|  | .alignc-safe-center-short td { | 
|  | align-content: safe center; | 
|  | height: 10px; | 
|  | } | 
|  | .alignc-safe-end-short td { | 
|  | align-content: safe end; | 
|  | height: 10px; | 
|  | } | 
|  | </style> | 
|  |  | 
|  | <table border="0" id="ref" class="valign-baseline"> | 
|  | <tr> | 
|  | <td><div class="content1">first<br>second</div></td> | 
|  | <td><div class="content2">first<br>second</div></td> | 
|  | <td><div class="content3">first<br>second<br>third</div></td> | 
|  | </tr> | 
|  | </table> | 
|  |  | 
|  | <table border="0" id="target" class="alignc-baseline"> | 
|  | <tr> | 
|  | <td><div class="content1">first<br>second</div></td> | 
|  | <td><div class="content2">first<br>second</div></td> | 
|  | <td><div class="content3">first<br>second<br>third</div></td> | 
|  | </tr> | 
|  | </table> | 
|  |  | 
|  | <script> | 
|  | function testEquivalence(target, ref) { | 
|  | assert_equals(target.querySelector('.content1').offsetTop, | 
|  | ref.querySelector('.content1').offsetTop, 'The first cell content top'); | 
|  | assert_equals(target.querySelector('.content2').offsetTop, | 
|  | ref.querySelector('.content2').offsetTop, 'The second cell content top'); | 
|  | assert_equals(target.querySelector('.content3').offsetTop, | 
|  | ref.querySelector('.content3').offsetTop, 'The third cell conten topt'); | 
|  | } | 
|  |  | 
|  | const ref = document.querySelector('#ref'); | 
|  | const target = document.querySelector('#target'); | 
|  | const TALL = 50; | 
|  | // *-short specifies `height: 10px`, but cells ignore it, and the actual height | 
|  | // is the maximum content height in the row. | 
|  | const SHORT = 40; | 
|  | const C1HEIGHT = 10 * 2; | 
|  |  | 
|  | test(() => { | 
|  | ref.className = 'valign-top'; | 
|  | target.className = 'alignc-start'; | 
|  | testEquivalence(target, ref); | 
|  | assert_equals(target.querySelector('.content1').offsetTop, 0); | 
|  | }, 'vertical-align:top and align-content:start are equivalent'); | 
|  |  | 
|  | test(() => { | 
|  | ref.className = 'valign-middle'; | 
|  | target.className = 'alignc-center'; | 
|  | testEquivalence(target, ref); | 
|  | assert_equals(target.querySelector('.content1').offsetTop, (TALL - C1HEIGHT) / 2); | 
|  |  | 
|  | ref.className = 'valign-middle-short'; | 
|  | target.className = 'alignc-center-short'; | 
|  | testEquivalence(target, ref); | 
|  | assert_equals(target.querySelector('.content1').offsetTop, (SHORT - C1HEIGHT) / 2); | 
|  | }, 'vertical-align:middle and `align-content:unsafe center` are equivalent'); | 
|  |  | 
|  | test(() => { | 
|  | ref.className = 'valign-bottom'; | 
|  | target.className = 'alignc-end'; | 
|  | testEquivalence(target, ref); | 
|  | assert_equals(target.querySelector('.content1').offsetTop, TALL - C1HEIGHT); | 
|  |  | 
|  | ref.className = 'valign-bottom-short'; | 
|  | target.className = 'alignc-end-short'; | 
|  | testEquivalence(target, ref); | 
|  | assert_equals(target.querySelector('.content1').offsetTop, SHORT - C1HEIGHT); | 
|  | }, 'vertical-align:bottom and `align-content:unsafe end` are equivalent'); | 
|  |  | 
|  | test(() => { | 
|  | ref.className = 'valign-baseline'; | 
|  | target.className = 'alignc-baseline'; | 
|  | testEquivalence(target, ref); | 
|  | }, 'vertical-align:baseline and align-content:baseline are equivalent'); | 
|  |  | 
|  | test(() => { | 
|  | ref.className = 'valign-middle'; | 
|  | target.className = 'alignc-safe-center'; | 
|  | testEquivalence(target, ref); | 
|  | assert_equals(target.querySelector('.content1').offsetTop, (TALL - C1HEIGHT) / 2); | 
|  | }, 'vertical-align:middle and `align-content:safe center` are equivalent if the container is tall'); | 
|  |  | 
|  | test(() => { | 
|  | ref.className = 'valign-bottom'; | 
|  | target.className = 'alignc-safe-end'; | 
|  | testEquivalence(target, ref); | 
|  | assert_equals(target.querySelector('.content1').offsetTop, TALL - C1HEIGHT); | 
|  | }, 'vertical-align:bottom and `align-content:safe end` are equivalent if the container is tall'); | 
|  |  | 
|  | test(() => { | 
|  | ref.className = 'alignc-center-short'; | 
|  | target.className = 'alignc-safe-center-short'; | 
|  | testEquivalence(target, ref); | 
|  | }, '`align-content:safe center` is equivalent to `unsafe center` even if the specified `height` is short'); | 
|  |  | 
|  | test(() => { | 
|  | ref.className = 'alignc-end-short'; | 
|  | target.className = 'alignc-safe-end-short'; | 
|  | }, '`align-content:safe end` is equivalent to `unsafe end` even if the specified `height` is short'); | 
|  | </script> |