<!doctype html>
<html>
<head>
  <title>Remove a Touch Target</title>
  <style>
  body {
      margin: 0;
      padding: 0;
  }

  .container {
      position: absolute;
      top: 10px;
      left: 10px;
      width: 50px;
      height: 50px;
      border: 1px solid green;
  }

  .target {
      width: 40px;
      height: 40px;
      background-color: red;
  }

  #results {
    position: absolute;
    top: 100px;
  }
  </style>
  <script src="resources/misc-touch-helpers.js"></script>
  <script>

    var seenTouch = false;

    function targetTouched(event) {
        logTouch(event);
        if (!seenTouch) {
            seenTouch = true;
            debug("Now remove the element from its parent and attempt to touch it again. This touch should not register.");
            var target = document.querySelector(".target");
            target.parentNode.removeChild(target);
            tapSoon(20, 20);
            // Wait 50ms to see if the touch was registered. If it was, then we'll be exiting below.
            setTimeout(function () {
                debug("PASSED. We did not see a second touch.");
                if (window.testRunner)
                    testRunner.notifyDone();
            }, 50);
        } else {
            debug("FAILED. We saw a second touch.");
            if (window.testRunner)
                testRunner.notifyDone();
        }
    }

    function init() {
        var target = document.querySelector(".target");
        target.addEventListener("touchstart", targetTouched, false);
        debug("Should see only one touch at 20,20");
        tapSoon(20, 20);
    }

    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }

    window.addEventListener("load", init, false);
</script>
</head>
<body>
  <div class="container">
    <div class="target">
    </div>
  </div>
  <div id="results">
  </div>
</body>
</html>
