<!doctype html>
<title>getSelection() tests</title>
<div id=log></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script>
"use strict";

// TODO: Figure out more places where defaultView is or is not guaranteed to be
// null, and test whether getSelection() is null.
//
// TODO: Figure out a good way to test display: none iframes.

test(function() {
    // Sanity checks like this are to flag known browser bugs with clearer
    // error messages, instead of throwing inscrutable exceptions.
    assert_true("Selection" in window,
        "Sanity check: window must have Selection property");

    assert_true(window.getSelection() instanceof Selection);
}, "window.getSelection() instanceof Selection");

test(function() {
    assert_equals(window.getSelection(), window.getSelection());
}, "window.getSelection() === window.getSelection()");

test(function() {
    assert_true("Selection" in window,
        "Sanity check: window must have Selection property");
    // This sanity check (which occurs a number of times below, too) is because
    // document.getSelection() is supposed to return null if defaultView is
    // null, so we need to figure out whether defaultView is null or not before
    // we can make correct assertions about getSelection().
    assert_not_equals(document.defaultView, null,
        "Sanity check: document.defaultView must not be null");

    assert_equals(typeof document.getSelection(), "object",
        "document.getSelection() must be an object");
    assert_true(document.getSelection() instanceof Selection);
}, "document.getSelection() instanceof Selection");

test(function() {
    assert_not_equals(document.defaultView, null,
        "Sanity check: document.defaultView must not be null");
    assert_equals(document.getSelection(), document.getSelection());
}, "document.getSelection() === document.getSelection()");

test(function() {
    assert_not_equals(document.defaultView, null,
        "Sanity check: document.defaultView must not be null");
    assert_equals(window.getSelection(), document.getSelection());
}, "window.getSelection() === document.getSelection()");

// "Each selection is associated with a single range, which may be null and is
// initially null."
//
// "The rangeCount attribute must return 0 if the context object's range is
// null, otherwise 1."
test(function() {
    assert_equals(window.getSelection().rangeCount, 0,
        "window.getSelection().rangeCount must initially be 0");
    assert_equals(typeof document.getSelection(), "object",
        "Sanity check: document.getSelection() must be an object");
    assert_equals(document.getSelection().rangeCount, 0,
        "document.getSelection().rangeCount must initially be 0");
}, "Selection's range must initially be null");

test(function() {
    var doc = document.implementation.createHTMLDocument("");
    assert_equals(doc.defaultView, null,
        "Sanity check: defaultView of created HTML document must be null");
    assert_equals(doc.getSelection(), null);
}, "getSelection() on HTML document with null defaultView must be null");

test(function() {
    var xmlDoc = document.implementation.createDocument(null, "", null);

    assert_true("getSelection" in xmlDoc, "XML document must have getSelection()");

    assert_equals(xmlDoc.defaultView, null,
        "Sanity check: defaultView of created XML document must be null");
    assert_equals(xmlDoc.getSelection(), null);
}, "getSelection() on XML document with null defaultView must be null");


// Run a bunch of iframe tests, once immediately after the iframe is appended
// to the document and once onload.  This makes a difference, because browsers
// differ (at the time of this writing) in whether they load about:blank in
// iframes synchronously or not.  Per the HTML spec, there must be a browsing
// context associated with the iframe as soon as it's appended to the document,
// so there should be a selection too.
var iframe = document.createElement("iframe");
add_completion_callback(function() {
    document.body.removeChild(iframe);
});

var testDescs = [];
var testFuncs = [];
testDescs.push("window.getSelection() instanceof Selection in an iframe");
testFuncs.push(function() {
    assert_true("Selection" in iframe.contentWindow,
        "Sanity check: window must have Selection property");
    assert_not_equals(iframe.contentWindow.document.defaultView, null,
        "Sanity check: document.defaultView must not be null");
    assert_not_equals(iframe.contentWindow.getSelection(), null,
        "window.getSelection() must not be null");
    assert_true(iframe.contentWindow.getSelection() instanceof iframe.contentWindow.Selection);
});

testDescs.push("document.getSelection() instanceof Selection in an iframe");
testFuncs.push(function() {
    assert_true("Selection" in iframe.contentWindow,
        "Sanity check: window must have Selection property");
    assert_not_equals(iframe.contentDocument.defaultView, null,
        "Sanity check: document.defaultView must not be null");
    assert_not_equals(iframe.contentDocument.getSelection(), null,
        "document.getSelection() must not be null");
    assert_equals(typeof iframe.contentDocument.getSelection(), "object",
        "document.getSelection() must be an object");
    assert_true(iframe.contentDocument.getSelection() instanceof iframe.contentWindow.Selection);
});

testDescs.push("window.getSelection() === document.getSelection() in an iframe");
testFuncs.push(function() {
    assert_not_equals(iframe.contentDocument.defaultView, null,
        "Sanity check: document.defaultView must not be null");
    assert_equals(iframe.contentWindow.getSelection(), iframe.contentDocument.getSelection());
});

testDescs.push("getSelection() inside and outside iframe must return different objects");
testFuncs.push(function() {
    assert_not_equals(iframe.contentWindow.getSelection(), getSelection());
});

testDescs.push("getSelection() on HTML document with null defaultView must be null inside an iframe");
testFuncs.push(function() {
    var doc = iframe.contentDocument.implementation.createHTMLDocument("");
    assert_equals(doc.defaultView, null,
        "Sanity check: defaultView of created HTML document must be null");
    assert_equals(doc.getSelection(), null);
});

var asyncTests = [];
testDescs.forEach(function(desc) {
    asyncTests.push(async_test(desc + " onload"));
});

iframe.onload = function() {
    asyncTests.forEach(function(t, i) {
        t.step(testFuncs[i]);
        t.done();
    });
};

document.body.appendChild(iframe);

testDescs.forEach(function(desc, i) {
    test(testFuncs[i], desc + " immediately after appendChild");
});
</script>
