<!DOCTYPE html>
<!--
Copyright (c) 2014 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->

<link rel="import" href="/base/event.html">
<link rel="import" href="/ui/base/hotkey_controller.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  var KeyEventManager = tr.b.KeyEventManager;

  function newKeyEvent(eventType, dict) {
    var e = new tr.b.Event(eventType, true, true);
    if (dict.keyCode === undefined)
      throw new Error('keyCode required');
    e.keyCode = dict.keyCode;
    return e;
  }

  test('simpleHotkeyManager', function() {
    var rootElement = document.createElement('div');
    document.body.appendChild(rootElement);
    try {
      var elementShadow = rootElement.createShadowRoot();

      var hkc = document.createElement('tv-ui-b-hotkey-controller');
      elementShadow.appendChild(hkc);

      var subElement = document.createElement('div');
      elementShadow.appendChild(subElement);

      assert.equal(tr.b.getHotkeyControllerForElement(subElement), hkc);

      var didGetCalled = false;
      hkc.addHotKey(new tr.ui.b.HotKey({
        eventType: 'keydown',
        keyCode: 73, useCapture: true,
        callback: function() {
          didGetCalled = true;
        }
      }));

      // Ensure it is called when events target the root element.
      var e = newKeyEvent('keydown', {keyCode: 73});
      rootElement.dispatchEvent(e);
      assert.isTrue(didGetCalled);

      // Ensure it is still called when we target the sub element.
      didGetCalled = false;
      var e = newKeyEvent('keydown', {keyCode: 73});
      subElement.dispatchEvent(e);
      assert.isTrue(didGetCalled);

    } finally {
      document.body.removeChild(rootElement);
    }
  });

  test('nestedHotkeyController', function() {
    var rootElement = document.createElement('div');
    document.body.appendChild(rootElement);
    try {
      var elementShadow = rootElement.createShadowRoot();

      var hkc = document.createElement('tv-ui-b-hotkey-controller');
      elementShadow.appendChild(hkc);

      var subElement = document.createElement('div');
      elementShadow.appendChild(subElement);
      assert.equal(tr.b.getHotkeyControllerForElement(elementShadow), hkc);

      var subHKC = document.createElement('tv-ui-b-hotkey-controller');
      subElement.appendChild(subHKC);

      assert.equal(tr.b.getHotkeyControllerForElement(subElement), subHKC);

      var didGetCalled = false;
      subHKC.addHotKey(new tr.ui.b.HotKey({
        eventType: 'keydown',
        keyCode: 73, useCapture: true,
        callback: function() {
          didGetCalled = true;
        }
      }));

      // Ensure it is called when events target the root element.
      var e = newKeyEvent('keydown', {keyCode: 73});
      rootElement.dispatchEvent(e);
      assert.isTrue(didGetCalled);
    } finally {
      document.body.removeChild(rootElement);
    }
  });

  test('inputInsideHKC', function() {
    var rootElement = document.createElement('div');
    document.body.appendChild(rootElement);
    try {
      var elementShadow = rootElement.createShadowRoot();

      var hkc = document.createElement('tv-ui-b-hotkey-controller');
      elementShadow.appendChild(hkc);

      var inputEl = document.createElement('input');
      elementShadow.appendChild(inputEl);

      var didGetCalled = false;
      hkc.addHotKey(new tr.ui.b.HotKey({
        eventType: 'keypress',
        keyCode: 'a'.charCodeAt(0), useCapture: false,
        callback: function() {
          console.log('a was pressed');
          didGetCalled = true;
        }
      }));

      // Ensure it is called when events target the root element.
      didGetCalled = false;
      var e = newKeyEvent('keypress', {keyCode: 'a'.charCodeAt(0)});
      rootElement.dispatchEvent(e);
      assert.isTrue(didGetCalled);

      // Handler should NOT be called when events target the input element.
      didGetCalled = false;
      var e = newKeyEvent('keypress', {keyCode: 'a'.charCodeAt(0)});
      inputEl.dispatchEvent(e);
      assert.isFalse(didGetCalled);
    } finally {
      document.body.removeChild(rootElement);
    }
  });

});
</script>
