<!doctype html>
<meta charset="utf-8">
<script src='/resources/testharness.js'></script>
<script src='/resources/testharnessreport.js'></script>
<link rel='stylesheet' href='support/base.css' />
<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
<link rel="help" href="https://drafts.csswg.org/css-tables-3/#visibility-collapse-cell-rendering">
<style>
table {
    border-spacing: 0;
    border-collapse: collapse;
}
table td {
    border: 1px solid blue;
    padding: 5px;
}
</style>
<main>
    <h1>Visibility collapse</h1>
    <a href="https://drafts.csswg.org/css-tables-3/#visibility-collapse-cell-rendering">Spec</a>
    <p>
    Setting a row to visibility:collapse changes table height but not width.
    </p>
    <table id="one">
    	<tr id="firstRowRef">
    		<td rowspan="5" id="spanningCellRef">B<br>B<br>B<br>B<br>B</td>
            <td>first row</td>
    	</tr>
    	<tr id="secondRowRef">
    		<td>aaaa</td>
    	</tr>
    	<tr>
    		<td>bbbb</td>
    	</tr>
    	<tr id="fourthRowRef">
    		<td>cccc</td>
    	</tr>
    	<tr id="fifthRowRef">
    		<td>dddd</td>
    	</tr>
    </table>
    In the bottom table, a row is dynamically collapsed, made visible, and collapsed again.
    <table id="two">
        <tr id="firstRow">
            <td rowspan="5" id="spanningCell">B<br>B<br>B<br>B<br>B</td>
            <td>first row</td>
        </tr>
        <tr id="secondRow">
            <td>aaaa</td>
        </tr>
        <tr id="thirdRow">
            <td>bbbb</td>
        </tr>
        <tr id="fourthRow">
            <td>cccc</td>
        </tr>
        <tr id="fifthRow">
            <td>dddd</td>
        </tr>
    </table>
</main>

<script>
    function runTests() {
        for (i = 0; i< tests.length; i++) {
            test(function()
                {
                    assert_equals.apply(this, tests[i]);
                },
                tests[i][2]);
        };
    }
    document.getElementById("thirdRow").style.visibility = "collapse";
    tests = [
        [
            document.getElementById('two').offsetWidth,
            document.getElementById('one').offsetWidth,
            "spanning row visibility:collapse doesn't change table width"
        ],
        [
        	document.getElementById('firstRow').offsetHeight,
            document.getElementById('firstRowRef').offsetHeight,
            "when third row is collapsed, first row stays the same height"
        ],
        [
        	document.getElementById('secondRow').offsetHeight,
            document.getElementById('secondRowRef').offsetHeight,
            "when third row is collapsed, second row stays the same height"
        ],
        [   document.getElementById('thirdRow').offsetHeight,
            0,
            "third row visibility:collapse makes row height 0"
        ],
       	[
       		document.getElementById('fourthRow').offsetHeight,
            document.getElementById('fourthRowRef').offsetHeight,
            "when third row is collapsed, fourth row stays the same height"
        ],
        [
            document.getElementById('spanningCell').offsetHeight,
            document.getElementById('firstRow').offsetHeight +
            document.getElementById('secondRow').offsetHeight +
            document.getElementById('fourthRow').offsetHeight +
            document.getElementById('fifthRow').offsetHeight,
            "spanning cell shrinks to sum of remaining three rows' height"
        ]];
    runTests();
    document.getElementById("thirdRow").style.visibility = "visible";
    tests = [
        [
            document.getElementById('firstRow').offsetHeight,
            document.getElementById('firstRowRef').offsetHeight,
            "when third row is visible, first row stays the same height"
        ],
        [
            document.getElementById('secondRow').offsetHeight,
            document.getElementById('secondRowRef').offsetHeight,
            "when third row is visible, second row stays the same height"
        ],
        [   document.getElementById('thirdRow').offsetHeight,
            document.getElementById('secondRowRef').offsetHeight,
            "when third row is visible, third row stays the same height"
        ],
        [
            document.getElementById('fourthRow').offsetHeight,
            document.getElementById('fourthRowRef').offsetHeight,
            "when third row is visible, fourth row stays the same height"
        ],
        [
            document.getElementById('fifthRow').offsetHeight,
            document.getElementById('fifthRowRef').offsetHeight,
            "when third row is visible, fifth row stays the same height"
        ],
        [
            document.getElementById('spanningCell').offsetHeight,
            document.getElementById('spanningCellRef').offsetHeight,
            "when third row is visible, spanning cell stays the same height"
        ]];
    runTests();
    document.getElementById("thirdRow").style.visibility = "collapse";
    tests = [
        [
            document.getElementById('two').offsetWidth,
            document.getElementById('one').offsetWidth,
            "(2nd collapse) spanning row visibility:collapse doesn't change table width"
        ],
        [
            document.getElementById('firstRow').offsetHeight,
            document.getElementById('firstRowRef').offsetHeight,
            "when third row is collapsed again, first row stays the same height"
        ],
        [
            document.getElementById('secondRow').offsetHeight,
            document.getElementById('secondRowRef').offsetHeight,
            "when third row is collapsed again, second row stays the same height"
        ],
        [   document.getElementById('thirdRow').offsetHeight,
            0,
            "(2nd collapse) third row visibility:collapse makes row height 0"
        ],
        [
            document.getElementById('fourthRow').offsetHeight,
            document.getElementById('fourthRowRef').offsetHeight,
            "when third row is collapsed again, fourth row stays the same height"
        ],
        [
            document.getElementById('spanningCell').offsetHeight,
            document.getElementById('firstRow').offsetHeight +
            document.getElementById('secondRow').offsetHeight +
            document.getElementById('fourthRow').offsetHeight +
            document.getElementById('fifthRow').offsetHeight,
            "(2nd collapse) spanning cell shrinks to sum of remaining three rows' height"
        ]];
    runTests();
</script>
</html>
