<html>
<script src="/resources/testharness.js" type="text/javascript"></script>
<script src="/resources/testharnessreport.js" type="text/javascript"></script>
<style type="text/css">
    body {
        border:1px solid black;
        width:200px;
        height:40px;

        padding-bottom:50px;
        padding-right:40px;
    }
    #elemSimple {
        background:yellow;
        width:60px;
        height:30px;
    }
    #elemOverflow {
        background:yellow;
        width:250px;
        height:150px;
    }
</style>
<body id="thebody">
    <div id="thediv"></div>
</body>
<script>
// Testing for html body element's scroll- x, y, width, height behaviour in quirks mode
// https://drafts.csswg.org/cssom-view/#potentially-scrollable
// https://drafts.csswg.org/cssom-view/#dom-element-scrollheight
test(function() {
    // can i get the div element?
    var thediv = document.getElementById("thediv");
    assert_equals(thediv.id, "thediv");
    // can i get the body element?
    var thebody = document.getElementById("thebody");
    assert_equals(thebody.id, "thebody");
}, "Ensure that body element is loaded.")

test(function() {
    document.body.style.overflowY = "hidden";
    assert_equals(document.body.style.overflowY, "hidden", "Could not set document.body.style.overflowY to 'hidden'.");
    document.body.style.overflowY = "scroll";
    assert_equals(document.body.style.overflowY, "scroll", "Could not set document.body.style.overflowY to 'scroll'.");
    document.documentElement.style.overflowY = "scroll";
    assert_equals(document.documentElement.style.overflowY, "scroll", "Could not set document.documentElement.style.overflow to 'scroll'.");
    document.documentElement.style.overflowY = "";
    document.body.style.overflowY = "";
}, "Ensure that style.overflowY can be set properly.")

test(function() {
    assert_equals(document.compatMode, "BackCompat", "Should be in quirks mode.");
}, "document.compatMode should be BackCompat in quirks.")

test(function() {
    var thebody = document.getElementById("thebody");
    assert_equals(thebody.id, "thebody");
    assert_equals(document.scrollingElement, thebody,
                  "scrollingElement in quirks mode should default to body element.");
}, "document.scrollingElement should be body element in quirks.")

test(function() {
    document.documentElement.style.overflowY = "scroll";
    assert_equals(document.documentElement.style.overflowY, "scroll", "Could not set document.documentElement.style.overflowY to 'scroll'.");

    var thebody = document.getElementById("thebody");
    assert_equals(thebody.id, "thebody");
    thebody.style.overflowY="scroll";
    assert_equals(document.body.style.overflowY, "scroll", "Could not set document.body.style.overflowY to 'scroll'.");
    // Body and document now both have overflow != visible
    // => body `potentially scrollable`

    // In quirks, when body is not `potentially scrollable`
    //    document.scrollingElment returns the body, otherwise null
    // https://drafts.csswg.org/cssom-view/#dom-document-scrollingelement
    assert_equals(document.scrollingElement, null,
                  "In quirks, we would expect null here (because of potentially scrollable body)");
}, "scrollingElement in quirks should be null when body is potentially scrollable.")

test(function() {
    document.documentElement.style.overflowY = "visible";
    assert_equals(document.documentElement.style.overflowY, "visible");
    assert_equals(document.scrollingElement, document.body);

    document.documentElement.style.overflowY = "scroll";
    assert_equals(document.documentElement.style.overflowY, "scroll");
    document.body.style.overflowY = "visible";
    assert_equals(document.body.style.overflowY, "visible");
    assert_equals(document.scrollingElement, document.body);

    document.documentElement.style.overflowY = "visible";
    assert_equals(document.documentElement.style.overflowY, "visible");
    assert_equals(document.scrollingElement, document.body);
}, "scrollingElement in quirks should be body if any of document and body has a visible overflow.")

// no overflow property set to `visible` => pot. scrollable
test(function() {
    document.body.style.overflowY = "scroll";
    assert_equals(document.body.style.overflowY, "scroll");
    document.documentElement.style.overflowY = "scroll";
    assert_equals(document.documentElement.style.overflowY, "scroll");

    assert_greater_than(window.innerHeight, 400, "Window not large enough for valid test run.");
    assert_not_equals(document.body.scrollHeight, window.innerHeight);

    var elem = document.getElementById("thediv");
    elem.style.height = "170px";
    assert_equals(elem.style.height, "170px");

    oldScrollHeight =  document.body.scrollHeight;
    elem.style.height = "190px";
    assert_equals(elem.style.height, "190px");
    assert_equals(document.body.scrollHeight, oldScrollHeight+20);
}, "When body potentially scrollable, document.body.scrollHeight changes when changing the height of the body content in quirks.")

// any use of `visible` => not potentially scrollable
function testNotPotScrollable (document_overflow, body_overflow) {
    document.body.style.overflowY = body_overflow;
    assert_equals(document.body.style.overflowY, body_overflow);
    document.documentElement.style.overflowY = document_overflow;
    assert_equals(document.documentElement.style.overflowY, document_overflow);

    assert_greater_than(window.innerHeight, 400, "Window not large enough for valid test run.");
    assert_equals(document.body.scrollHeight, window.innerHeight);

    var elem = document.getElementById("thediv");
    elem.style.height = "170px";
    assert_equals(elem.style.height, "170px");
    assert_equals(window.innerHeight, document.body.scrollHeight);

    oldScrollHeight =  document.body.scrollHeight;
    elem.style.height = "190px";
    assert_equals(elem.style.height, "190px");
    assert_equals(window.innerHeight, document.body.scrollHeight);
    assert_equals(document.body.scrollHeight, oldScrollHeight);
}

tests = [["visible", "scroll"], ["scroll", "visible"], ["visible", "visible"]];
for (var i = 0; i < tests.length; i++) {
    test( function () {
        testNotPotScrollable (tests[i][0], tests[i][1]);
    }, "When body not potentially scrollable, document.body.scrollHeight always equals window.innerHeight in quirks. (cond. "+tests[i][0]+", "+tests[i][1]+")")
}
</script>
</html>
