<!DOCTYPE html>
<html>
<head>
<title>Selections in hidden elements</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
</head>
<body>
<style>
container, my-text {
    display: block;
}

.hide {
    position:relative;
    overflow:hidden;
    height:0px;
    width:10px;
}
.select {
    height:11px;
    width:1px;
    padding:0px;
    border:1px solid blue;
    box-sizing:content-box;
    overflow:hidden;
}
.abs {
    position: absolute;
}
.borderBox {
    box-sizing:border-box;
}
</style>
<container>
<textarea class=select>test text</textarea>
<my-text class=select>test text</my-text>
</container>
<script>
function checkSelectable(element, expected)
{
    var selection = document.getSelection();
    if (element.select)
        element.select();
    else
        selection.selectAllChildren(element);

    var selectionText = selection.toString();
    if (expected)
        assert_equals(selectionText, "test text");
    else
        assert_equals(selectionText, "");
}

var textarea = document.querySelector("textarea");
var myText = document.querySelector("my-text");

test(function () {
    checkSelectable(textarea, true);
}, "Selecting in barely visible textarea");

test(function () {
    checkSelectable(myText, true);
}, "Selecting in barely visible div");

document.querySelector("container").classList.add("hide");

test(function () {
    checkSelectable(textarea, false);
}, "Selecting in textarea hidden by container");

test(function () {
    checkSelectable(myText, false);
}, "Selecting in div hidden by container");

textarea.classList.add("abs");
myText.classList.add("abs");

test(function () {
    checkSelectable(textarea, true);
}, "Selecting in absolute positioned textarea hidden by container");

test(function () {
    checkSelectable(myText, true);
}, "Selecting in absolute positioned div hidden by container");

textarea.classList.add("borderBox");
myText.classList.add("borderBox");

test(function () {
    checkSelectable(textarea, true);
}, "Selecting in absolute positioned zero content width textarea hidden by container (quirk behavior)");

test(function () {
    checkSelectable(myText, false);
}, "Selecting in absolute positioned zero content width div hidden by container");

</script>
</body>
</html>
