<!doctype html>
<title>Range test iframe</title>
<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
<meta name=timeout content=long>
<body onload=run()>
<script src=../common.js></script>
<script>
"use strict";

// This script only exists because we want to evaluate the range endpoints
// in each iframe using that iframe's local variables set up by common.js.  It
// just creates the range and does nothing else.  The data is returned via
// window.testRange, and if an exception is thrown, it's put in
// window.unexpectedException.
window.unexpectedException = null;

function run() {
  try {
    window.unexpectedException = null;

    if (typeof window.testNodeInput != "undefined") {
      window.testNode = eval(window.testNodeInput);
    }

    var rangeEndpoints;
    if (typeof window.testRangeInput == "undefined") {
      // Use the hash (old way of doing things, bad because it requires
      // navigation)
      if (location.hash == "") {
        return;
      }
      rangeEndpoints = eval(location.hash.substr(1));
    } else {
      // Get the variable directly off the window, faster and can be done
      // synchronously
      rangeEndpoints = eval(window.testRangeInput);
    }

    var range;
    if (rangeEndpoints == "detached") {
      range = document.createRange();
      range.detach();
    } else {
      range = ownerDocument(rangeEndpoints[0]).createRange();
      range.setStart(rangeEndpoints[0], rangeEndpoints[1]);
      range.setEnd(rangeEndpoints[2], rangeEndpoints[3]);
    }

    window.testRange = range;
  } catch(e) {
    window.unexpectedException = e;
  }
}

testDiv.style.display = "none";
</script>
