/*
 * Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 * for details. All rights reserved. Use of this source code is governed by a
 * BSD-style license that can be found in the LICENSE file.
 */
/**
 * @description This test makes sure that focusable elements in canvas fallback
 * content are focusable.
 */
import "dart:html";
import "dart:math" as Math;
import "../../testcommon.dart";
import "../../../Utils/async_utils.dart";

main() {
  document.body.setInnerHtml('''
      <div>
        <a id="link1" href="#">Link</a>
        <button id="button1">Button</button>
        <input id="text1" type="text">
        <input id="checkbox1" type="checkbox">
        <input id="radio1" type="radio">
        <input id="slider1" type="range">
        <input id="submit1" type="submit">
        <select id="combobox1"><option>1<option>2</select>
        <select id="listbox1" multiple><option>1<option>2</select>
        <textarea id="textarea1"></textarea>
        <div id="focusable1" tabindex="0">Focusable</div>
      </div>

      <canvas id="myCanvas" width="300" height="300">
        <a id="link2" href="#">Link</a>
        <button id="button2">Button</button>
        <input id="text2" type="text">
        <input id="checkbox2" type="checkbox">
        <input id="radio2" type="radio">
        <input id="slider2" type="range">
        <input id="submit2" type="submit">
        <select id="combobox2"><option>1<option>2</select>
        <select id="listbox2" multiple><option>1<option>2</select>
        <textarea id="textarea2"></textarea>
        <div id="focusable2" tabindex="0">Focusable</div>
      </canvas>

      <canvas hidden id="hiddenCanvas" width="300" height="300">
        <a id="linkInHiddenCanvas" href="#">Link</a>
      </canvas>

      <div id="console"></div>
      ''', treeSanitizer: new NullTreeSanitizer());


  var element;

  checkFocusable(id) {
    debug(id + " should be focusable.");
    element = document.getElementById(id);
    element.focus();
    shouldBe(document.activeElement, element);
    debug("");
  }

  checkFocusable("link1");
  checkFocusable("button1");
  checkFocusable("text1");
  checkFocusable("checkbox1");
  checkFocusable("radio1");
  checkFocusable("slider1");
  checkFocusable("submit1");
  checkFocusable("combobox1");
  checkFocusable("listbox1");
  checkFocusable("textarea1");
  checkFocusable("focusable1");

  checkFocusable("link2");
  checkFocusable("button2");
  checkFocusable("text2");
  checkFocusable("checkbox2");
  checkFocusable("radio2");
  checkFocusable("slider2");
  checkFocusable("submit2");
  checkFocusable("combobox2");
  checkFocusable("listbox2");
  checkFocusable("textarea2");
  checkFocusable("focusable2");

  var previousFocusedElement;

  checkNotFocusable(id) {
    debug(id + " should not be focusable.");
    previousFocusedElement = document.activeElement;
    element = document.getElementById(id);
    element.focus();
    shouldBe(document.activeElement, previousFocusedElement);
    debug("");
  }

  checkNotFocusable("linkInHiddenCanvas");
}
