* Keydown event handler. * @param {Object} event
(event)
| 493 | * @param {Object} event |
| 494 | */ |
| 495 | function keydown(event) { |
| 496 | let target = event.target; |
| 497 | let modifier = |
| 498 | event.ctrlKey || |
| 499 | event.altKey || |
| 500 | event.metaKey || |
| 501 | (event.shiftKey && event.keyCode !== key.spacebar); |
| 502 | // our own tracked active element could've been removed from the DOM |
| 503 | if (!document.contains(activeElement)) { |
| 504 | activeElement = document.activeElement; |
| 505 | } |
| 506 | // do nothing if user is editing text |
| 507 | // or using a modifier key (except shift) |
| 508 | // or in a dropdown |
| 509 | // or inside interactive elements |
| 510 | let inputNodeNames = /^(textarea|select|embed|object)$/i; |
| 511 | let buttonTypes = /^(button|submit|radio|checkbox|file|color|image)$/i; |
| 512 | if ( |
| 513 | event.defaultPrevented || |
| 514 | inputNodeNames.test(target.nodeName) || |
| 515 | (isNodeName(target, "input") && !buttonTypes.test(target.type)) || |
| 516 | isNodeName(activeElement, "video") || |
| 517 | isInsideYoutubeVideo(event) || |
| 518 | target.isContentEditable || |
| 519 | modifier |
| 520 | ) { |
| 521 | return true; |
| 522 | } |
| 523 | // [spacebar] should trigger button press, leave it alone |
| 524 | if ( |
| 525 | (isNodeName(target, "button") || |
| 526 | (isNodeName(target, "input") && buttonTypes.test(target.type))) && |
| 527 | event.keyCode === key.spacebar |
| 528 | ) { |
| 529 | return true; |
| 530 | } |
| 531 | // [arrwow keys] on radio buttons should be left alone |
| 532 | if ( |
| 533 | isNodeName(target, "input") && |
| 534 | target.type == "radio" && |
| 535 | arrowKeys[event.keyCode] |
| 536 | ) { |
| 537 | return true; |
| 538 | } |
| 539 | let xOnly = event.keyCode == key.left || event.keyCode == key.right; |
| 540 | let overflowing = overflowingAncestor(activeElement, xOnly); |
| 541 | if (!overflowing) { |
| 542 | // iframes seem to eat key events, which we need to propagate up |
| 543 | // if the iframe has nothing overflowing to scroll |
| 544 | return isFrame ? parent.keydown(event) : true; |
| 545 | } |
| 546 | let clientHeight = overflowing.clientHeight; |
| 547 | let shift, |
| 548 | x = 0, |
| 549 | y = 0; |
| 550 | if (overflowing == document.body) { |
| 551 | clientHeight = window.innerHeight; |
| 552 | } |
nothing calls this directly
no test coverage detected