<!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/key_event_manager.html">
<script>
'use strict';

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

  function withElementAttachedToChild(element, callback) {
    document.body.appendChild(element);
    try {
      callback();
    } finally {
      document.body.removeChild(element);
    }
  }


  test('simpleDispatch', function() {
    var kem = KeyEventManager.instance;
    var div = document.createElement('div');

    var fireCount = 0;
    kem.addListener('keydown', function(e) {
      fireCount++;
    }, div);

    // Send an event while its attached to the document.
    withElementAttachedToChild(div, function() {
      var ret = kem.dispatchFakeEvent('keydown', {keyCode: 73});
      assert.isUndefined(ret);
      assert.equal(fireCount, 1);
    });
    fireCount = 0;

    // Send an event while it is detached.
    var ret = kem.dispatchFakeEvent('keydown', {keyCode: 73});
    assert.isUndefined(ret);
    assert.equal(fireCount, 0);
  });

  test('preventDefault', function() {
    var kem = KeyEventManager.instance;
    var div = document.createElement('div');

    var fireCount = 0;
    kem.addListener('keydown', function(e) {
      fireCount++;
      e.preventDefault();
    }, div);

    withElementAttachedToChild(div, function() {
      var ret = kem.dispatchFakeEvent('keydown', {keyCode: 73});
      assert.isFalse(ret);
      assert.equal(fireCount, 1);
    });

  });

  test('stopPropagation', function() {
    var kem = KeyEventManager.instance;
    var div1 = document.createElement('div');
    var div2 = document.createElement('div');

    var didFire = false;
    kem.addListener('keydown', function(e) {
      e.stopPropagation();
    }, div1);
    kem.addListener('keydown', function(e) {
      throw new Error('Should never get called');
    }, div2);

    withElementAttachedToChild(div1, function() {
      withElementAttachedToChild(div2, function() {
        var ret = kem.dispatchFakeEvent('keydown', {keyCode: 73});
        assert.isUndefined(ret);
      });
    });
  });

  test('removeListener', function() {
    var kem = KeyEventManager.instance;
    var div = document.createElement('div');

    var handlerFired = false;
    function handler(e) {
      handlerFired = true;
    }
    kem.addListener('keydown', handler, div);
    kem.removeListener('keydown', handler, div);
    assert.equal('', div.className);

    withElementAttachedToChild(div, function() {
      var ret = kem.dispatchFakeEvent('keydown', {keyCode: 73});
      assert.isFalse(handlerFired);
    });
  });

  test('removeOneListener', function() {
    var kem = KeyEventManager.instance;
    var div = document.createElement('div');

    var handlerAFired = false;
    function handlerA(e) {
      handlerAFired = true;
    }
    var handlerBFired = false;
    function handlerB(e) {
      handlerBFired = true;
    }
    kem.addListener('keydown', handlerA, div);
    kem.addListener('keydown', handlerB, div);
    kem.removeListener('keydown', handlerA, div);
    assert.isTrue(div.classList.contains('key-event-manager-target'));

    withElementAttachedToChild(div, function() {
      var ret = kem.dispatchFakeEvent('keydown', {keyCode: 73});
      assert.isFalse(handlerAFired);
      assert.isTrue(handlerBFired);
    });
  });


});
</script>
