| <!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="/tracing/base/event.html"> |
| <link rel="import" href="/tracing/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'); |
| Polymer.dom(document.body).appendChild(rootElement); |
| try { |
| var elementShadow = rootElement.createShadowRoot(); |
| |
| var hkc = document.createElement('tv-ui-b-hotkey-controller'); |
| Polymer.dom(elementShadow).appendChild(hkc); |
| |
| var subElement = document.createElement('div'); |
| Polymer.dom(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 { |
| Polymer.dom(document.body).removeChild(rootElement); |
| } |
| }); |
| |
| test('nestedHotkeyController', function() { |
| var rootElement = document.createElement('div'); |
| Polymer.dom(document.body).appendChild(rootElement); |
| try { |
| var elementShadow = rootElement.createShadowRoot(); |
| |
| var hkc = document.createElement('tv-ui-b-hotkey-controller'); |
| Polymer.dom(elementShadow).appendChild(hkc); |
| |
| var subElement = document.createElement('div'); |
| Polymer.dom(elementShadow).appendChild(subElement); |
| assert.equal(tr.b.getHotkeyControllerForElement(elementShadow), hkc); |
| |
| var subHKC = document.createElement('tv-ui-b-hotkey-controller'); |
| Polymer.dom(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 { |
| Polymer.dom(document.body).removeChild(rootElement); |
| } |
| }); |
| |
| test('inputInsideHKC', function() { |
| var rootElement = document.createElement('div'); |
| Polymer.dom(document.body).appendChild(rootElement); |
| try { |
| var elementShadow = rootElement.createShadowRoot(); |
| |
| var hkc = document.createElement('tv-ui-b-hotkey-controller'); |
| Polymer.dom(elementShadow).appendChild(hkc); |
| |
| var inputEl = document.createElement('input'); |
| Polymer.dom(elementShadow).appendChild(inputEl); |
| |
| var didGetCalled = false; |
| hkc.addHotKey(new tr.ui.b.HotKey({ |
| eventType: 'keypress', |
| keyCode: 'a'.charCodeAt(0), useCapture: false, |
| callback: function() { |
| 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 { |
| Polymer.dom(document.body).removeChild(rootElement); |
| } |
| }); |
| |
| }); |
| </script> |