<html>
  <head><title>OSR Test</title></head>
  <style>
  .red_hover:hover {color:red;}
  #li { width: 530px; }
  body {background:rgba(255, 0, 0, 0.5); }
  input {-webkit-appearance: none; }
  #LI11select {width: 75px;}
  #LI11select option { background-color: cyan; }
  .dropdiv {
    width:50px;
    height:50px;
    border:1px solid #aaaaaa;
    float: left;
  }
  #dragdiv {
    width: 30px;
    height: 30px;
    background-color: green;
    margin: 10px;
  }
  #draghere {
    position: relative;
    z-index: -1;
    top: 7px;
    left: 7px;
    opacity: 0.4;
  }
  #touchdiv, #pointerdiv {
    width: 100px;
    height: 50px;
    background-color: red;
    float: left;
    margin-left: 10px;
  }
  </style>
  <script>
  function getElement(id) { return document.getElementById(id); }
  function makeH1Red() { getElement('LI00').style.color='red'; }
  function makeH1Black() { getElement('LI00').style.color='black'; }
  function navigate() { location.href='?k='+getElement('editbox').value; }
  function load() {
    var elems = [];
    var param = { type: 'ElementBounds', elems: elems };

    elems.push(getElementBounds('LI00'));
    elems.push(getElementBounds('LI01'));
    elems.push(getElementBounds('LI02'));
    elems.push(getElementBounds('LI03'));
    elems.push(getElementBounds('LI04'));
    elems.push(getElementBounds('LI05'));
    elems.push(getElementBounds('LI06'));
    elems.push(getElementBounds('LI07'));
    elems.push(getElementBounds('LI08'));
    elems.push(getElementBounds('LI09'));
    elems.push(getElementBounds('LI10'));
    elems.push(getElementBounds('LI11'));
    elems.push(getElementBounds('LI11select'));
    elems.push(getElementBounds('email'));
    elems.push(getElementBounds('quickmenu'));
    elems.push(getElementBounds('editbox'));
    elems.push(getElementBounds('btnnavigate'));
    elems.push(getElementBounds('dropdiv'));
    elems.push(getElementBounds('dragdiv'));
    elems.push(getElementBounds('touchdiv'));
    elems.push(getElementBounds('pointerdiv'));

    if (window.testQuery)
      window.testQuery({request: JSON.stringify(param)});

    fillDropDown();
  }

  function fillDropDown() {
    var select = document.getElementById('LI11select');
    for (var i = 1; i < 21; i++)
      select.options.add(new Option('Option ' + i, i));
  }

  function getElementBounds(id) {
    var element = document.getElementById(id);
    var bounds = element.getBoundingClientRect();
    return {
      id: id,
      x: Math.floor(bounds.x),
      y: Math.floor(bounds.y),
      width: Math.floor(bounds.width),
      height: Math.floor(bounds.height)
    };
  }

  function onEventTest(event) {
    var param = 'osr' + event.type;

    if (event.type == "click")
      param += event.button;

    // Results in a call to the OnQuery method in os_rendering_unittest.cc.
    if (window.testQuery)
      window.testQuery({request: param});
  }

  function onFocusTest(ev) {
    if (window.testQuery)
      window.testQuery({request: "osrfocus" + ev.target.id});
  }

  function allowDrop(ev) {
    ev.preventDefault();
  }

  function drag(ev) {
    ev.dataTransfer.setData("Text",ev.target.id);
  }

  function drop(ev) {
    var data=ev.dataTransfer.getData("Text");
    ev.target.innerHTML = '';
    var dragged = document.getElementById(data);
    dragged.setAttribute('draggable', 'false');
    ev.target.appendChild(dragged);
    if (window.testQuery)
      window.testQuery({request: "osrdrop"});
  }

  function selectText(ev) {
    var element = ev.target;
    var selection = window.getSelection();
    var range = document.createRange();
    range.selectNodeContents(element);
    selection.removeAllRanges();
    selection.addRange(range);
  }

  function onTouchEvent(ev) {
    var param = 'osr' + ev.type;
    // For Touch start also include touch points.
    if (event.type == "touchstart")
      param += ev.touches.length;
    // For Touch Move include the touches that changed.
    if (event.type == "touchmove")
      param += ev.changedTouches.length;

    // Results in a call to the OnQuery method in os_rendering_unittest.cc.
    if (window.testQuery)
      window.testQuery({request: param});
  }

  function onPointerEvent(ev) {
    var param = 'osr' +  ev.type + ' ' + ev.pointerType;
    if (window.testQuery)
      window.testQuery({request: param});
  }

  </script>
  <body onfocus='onEventTest(event)' onblur='onEventTest(event)' onload='load();'>
  <h1 id='LI00' onclick="onEventTest(event)">
    OSR Testing h1 - Focus and blur
    <select id='LI11select'>
      <option value='0'>Default</option>
    </select>
    this page and will get this red black
  </h1>
  <ol>
  <li id='LI01'>OnPaint should be called each time a page loads</li>
  <li id='LI02' style='cursor:pointer;'><span>Move mouse
      to require an OnCursorChange call</span></li>
  <li id='LI03' onmousemove="onEventTest(event)"><span>Hover will color this with
      red. Will trigger OnPaint once on enter and once on leave</span></li>
  <li id='LI04'>Right clicking will show contextual menu and will request
      GetScreenPoint</li>
  <li id='LI05'>IsWindowRenderingDisabled should be true</li>
  <li id='LI06'>WasResized should trigger full repaint if size changes.
      </li>
  <li id='LI07'>Invalidate should trigger OnPaint once</li>
  <li id='LI08'>Click and write here with SendKeyEvent to trigger repaints:
      <input id='editbox' type='text' value='' size="5" onfocus="onFocusTest(event)"></li>
  <li id='LI09'>Click here with SendMouseClickEvent to navigate:
      <input id='btnnavigate' type='button' onclick='navigate()'
      value='Click here to navigate' /></li>
  <li id='LI10' title='EXPECTED_TOOLTIP'>Mouse over this element will
      trigger show a tooltip</li>
  <li id='LI11' onclick='selectText(event)'>SELECTED_TEXT_RANGE</li>
  <li><input id='email' type='text' size=10 inputmode='email'></li>
  <li id="quickmenu">Long touch press should trigger quick menu</li>
  </ol>

  <div class="dropdiv" id="dropdiv" ondrop="drop(event)" ondragover="allowDrop(event)">
    <span id="draghere">Drag here</span>
  </div>
  <div class="dropdiv">
    <div id="dragdiv" draggable="true" ondragstart="drag(event)"></div>
  </div>
  <div id="touchdiv" ontouchstart="onTouchEvent(event)" ontouchend="onTouchEvent(event)" ontouchmove="onTouchEvent(event)" ontouchcancel="onTouchEvent(event)">
  </div>
  <div id="pointerdiv" onpointerdown="onPointerEvent(event)" onpointerup="onPointerEvent(event)" onpointermove="onPointerEvent(event)" onpointercancel="onPointerEvent(event)">
  </div>
  <br />
  <br />
  <br />
  <br />
  <br />
  <br />
  </body>
</html>
