<!DOCTYPE html>
<title>cssom-view - elementsFromPoint</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
  .size {
    width:60px;
    height:60px;
  }
  .overlay {
    position:absolute;
    top:69px;
    pointer-events:none;
  }
  .purple {
    background-color: rebeccapurple;
  }
  .yellow {
    background-color: yellow;
  }
  .teal {
    background-color: teal;
  }
  .pink {
    background-color: pink;
  }
</style>
<body>
  <div id='purple' class="size purple" >&nbsp;</div>
  <div id='yellow' class="size yellow">&nbsp;</div>
  <div id='teal' class="size overlay teal">&nbsp;</div>
  <iframe id=iframe-1 src="iframe.html" style='display:none;position:absolute; left:300px;'></iframe>
  <iframe id=iframe-2 src="iframe.html" width="" height=""></iframe>
  <iframe id=iframe-3 width="" height=""></iframe>
  <svg id=squiggle xmlns="http://www.w3.org/2000/svg" height="98" width="500" viewBox="0 0 581 98">
    <path stroke-dashoffset="0.00" stroke-dasharray="" d="M62.9 14.9c-25-7.74-56.6 4.8-60.4 24.3-3.73 19.6 21.6 35 39.6 37.6 42.8 6.2 72.9-53.4 116-58.9 65-18.2 191 101 215 28.8 5-16.7-7-49.1-34-44-34 11.5-31 46.5-14 69.3 9.38 12.6 24.2 20.6 39.8 22.9 91.4 9.05 102-98.9 176-86.7 18.8 3.81 33 17.3 36.7 34.6 2.01 10.2.124 21.1-5.18 30.1" stroke="#000" stroke-width="4.3" fill="none">
    </path>
  </svg>
  <svg id=svg-transform width="180" height="140"
  xmlns="http://www.w3.org/2000/svg"
  xmlns:xlink="http://www.w3.org/1999/xlink">

  <!--  Now we add a text element and apply rotate and translate to both  -->
  <rect x="50" y="50" height="60" width="60" style="stroke:#000; fill: #0086B2" transform="translate(30) rotate(45 50 50)"></rect>
  <text x="60" y="105" transform="translate(30) rotate(45 50 50)"> Hello! </text>

</svg>
  <div id='pink' class='size pink' style='transform: translate(10px)'>&nbsp;</div>
  <div id='anotherteal' class='size teal' style='pointer-events:none'>Another teal</div>
  <script>
    setup({explicit_done:true});
    window.onload = function () {
      test(function () {
              assert_array_equals(document.elementsFromPoint(-1, -1), [],
                "both co-ordinates passed in are negative so should have returned a []");
              assert_array_equals(document.elementsFromPoint(-1, -1), [],
                "x co-ordinates passed in are negative so should have returned a []");
              assert_array_equals(document.elementsFromPoint(-1, -1), [],
                "y co-ordinates passed in are negative so should have returned a []");
                  }, "Negative co-ordinates");

      test(function () {
              var viewportX = window.innerWidth;
              var viewportY = window.innerHeight;
              assert_array_equals(document.elementsFromPoint(viewportX + 100, 10), [],
                "X co-ordinates larger than viewport so should have returned a []");
              assert_array_equals(document.elementsFromPoint(10, viewportY + 100), [],
                "Y co-ordinates larger than viewport so should have returned a []");
              assert_array_equals(document.elementsFromPoint(viewportX + 100, viewportY + 100), [],
                "X, Y co-ordinates larger than viewport so should have returned a []");
      }, "co-ordinates larger than the viewport");

      test(function () {
              var viewportX = window.frames[1].innerWidth;
              var viewportY = window.frames[1].innerHeight;
              var iframeRect = document.getElementById('iframe-2').getBoundingClientRect();
              assert_array_equals([], window.frames[1].document.elementsFromPoint(iframeRect.right + viewportX + 100, 10),
                "X co-ordinates larger than viewport so should have returned a []");
              assert_array_equals([], window.frames[1].document.elementsFromPoint(10, iframeRect.bottom + viewportY + 100),
                "Y co-ordinates larger than viewport so should have returned a []");
              assert_array_equals([], window.frames[1].document.elementsFromPoint(iframeRect.right + viewportX + 100,
                                                                                  iframeRect.bottom + viewportY + 100),
                "X, Y co-ordinates larger than viewport so should have returned a []");
      }, "co-ordinates larger than the viewport from in iframe");

      test(function () {
              assert_array_equals(document.elementsFromPoint(10, 10),
                                  [document.getElementById('purple'), document.body, document.querySelector('html')],
                                  "Should have returned a sequence with `[purple element, document.body, html]`");
            }, "Return first element that is the target for hit testing");

      test(function () {
              assert_array_equals(document.elementsFromPoint(10, 80),
                                  [document.getElementById('yellow'), document.body, document.querySelector('html')],
                "Should have returned a sequence with `[yellow element, document.body, html]`");
            }, "First element to get mouse events with pointer-events css");

      test(function () {
             var svg = document.getElementById('squiggle');
             var svgRect = svg.getBoundingClientRect();
             assert_array_equals(document.elementsFromPoint(svgRect.left + Math.round(svgRect.width/2),
                                                            svgRect.top + Math.round(svgRect.height/2)),
                           [svg, document.body, document.querySelector('html')],
                           "Should have returned a sequence with [svg, body, html]");
      }, "SVG element at x,y");

      test(function () {
              var svg = document.getElementById('svg-transform');
              var svgRect = svg.getBoundingClientRect();
              assert_array_equals(document.elementsFromPoint(svgRect.left + Math.round(svgRect.width/2),
                                                             svgRect.top + Math.round(svgRect.height/2)),
                            [svg.querySelector("rect"), svg, document.body, document.querySelector('html')],
                            "Should have returned [svg rect, svg, body, html]");

              var pink = document.getElementById('pink');
              var pinkRect = pink.getBoundingClientRect();
              assert_array_equals(document.elementsFromPoint(pinkRect.left + Math.round(pinkRect.width/2),
                                                             pinkRect.top + Math.round(pinkRect.height/2)),
                            [pink, document.body, document.querySelector('html')],
                            "Should have returned a sequence with [pink, body, html]");

      }, "transformed element at x,y");

      test(function () {
            var anotherteal = document.getElementById('anotherteal');
            var anothertealRect = anotherteal.getBoundingClientRect();
            assert_array_equals(document.elementsFromPoint(anothertealRect.left + Math.round(anothertealRect.width/2),
                                                           anothertealRect.top + Math.round(anothertealRect.height/2)),
                          [document.body, document.querySelector('html')],
                          "Should have returned the sequence [body, html]");

            var doc = frames[1].document;
            assert_array_equals([doc.querySelector('html')], doc.elementsFromPoint(0, 100),
                                "Should have returned the sequence [html]")

            var doc = frames[2].document;
            doc.removeChild(doc.documentElement);
            assert_array_equals(doc.elementsFromPoint(0, 0), [],
                          "Should have returned [] as no root element");

      }, "no hit target at x,y");

      test(function () {
            var doc = document.implementation.createHTMLDocument('foo');
            assert_array_equals(doc.elementsFromPoint(0, 0), [],
                          "Should have returned []")
      }, "No viewport available");
      done();
    }
 </script>
