<script>
if (window.testRunner)
     testRunner.dumpEditingCallbacks();
</script>

<script>
function log(str) {
    var li = document.createElement("li");
    li.appendChild(document.createTextNode(str));
    var console = document.getElementById("console");
    console.appendChild(li);
}

function assert(bool) {
    if (!bool)
        log("Failure");
    else
        log("Success");
}
</script>
<p>This tests the endpoints of a DOM Range object made from a selection around certain types elements.  These endpoints shouldn't be at offsets inside nodes that aren't containers or text nodes.</p>
<div id="test">Hello <img src="../resources/abe.png"><object width="100"></object>world!<br>Hello World!</div>
<ul id="console"></ul>

<script>
var s = window.getSelection();
var e = document.getElementById("test");
var r;

if (window.testRunner)
    window.testRunner.dumpAsText();

// The textnode
s.setBaseAndExtent(e, 0, e, 1);
r = s.getRangeAt(0);
assert(r.startContainer == e.childNodes[0]);
assert(r.startOffset == 0);
assert(r.endContainer == e.childNodes[0]);
assert(r.endOffset == r.endContainer.length);

// The image
s.setBaseAndExtent(e, 1, e, 2);
r = s.getRangeAt(0);
assert(r.startContainer == e);
assert(r.startOffset == 1);
assert(r.endContainer == e);
assert(r.endOffset == 2);

// The <object>
s.setBaseAndExtent(e, 2, e, 3);
r = s.getRangeAt(0);
assert(r.startContainer == e);
assert(r.startOffset == 2);
assert(r.endContainer == e);
assert(r.endOffset == 3);

// The <br>
s.setBaseAndExtent(e, 4, e, 5);
r = s.getRangeAt(0);
assert(r.startContainer == e);
assert(r.startOffset == 4);
assert(r.endContainer == e);
assert(r.endOffset == 5);

</script>
