functional.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.preKeyupBehavior = exports.preKeydownBehavior = exports.postKeyupBehavior = exports.keyupBehavior = exports.keypressBehavior = exports.keydownBehavior = void 0;
  6. var _dom = require("@testing-library/dom");
  7. var _utils = require("../../utils");
  8. var _getEventProps = require("../getEventProps");
  9. var _shared = require("../shared");
  10. /**
  11. * This file should contain behavior for functional keys as described here:
  12. * https://w3c.github.io/uievents-code/#key-alphanumeric-functional
  13. */
  14. const modifierKeys = {
  15. Alt: 'alt',
  16. Control: 'ctrl',
  17. Shift: 'shift',
  18. Meta: 'meta'
  19. };
  20. const preKeydownBehavior = [// modifierKeys switch on the modifier BEFORE the keydown event
  21. ...Object.entries(modifierKeys).map(([key, modKey]) => ({
  22. matches: keyDef => keyDef.key === key,
  23. handle: (keyDef, element, options, state) => {
  24. state.modifiers[modKey] = true;
  25. }
  26. })), // AltGraph produces an extra keydown for Control
  27. // The modifier does not change
  28. {
  29. matches: keyDef => keyDef.key === 'AltGraph',
  30. handle: (keyDef, element, options, state) => {
  31. var _options$keyboardMap$;
  32. const ctrlKeyDef = (_options$keyboardMap$ = options.keyboardMap.find(k => k.key === 'Control')) != null ? _options$keyboardMap$ :
  33. /* istanbul ignore next */
  34. {
  35. key: 'Control',
  36. code: 'Control'
  37. };
  38. _dom.fireEvent.keyDown(element, (0, _getEventProps.getKeyEventProps)(ctrlKeyDef, state));
  39. }
  40. }];
  41. exports.preKeydownBehavior = preKeydownBehavior;
  42. const keydownBehavior = [{
  43. matches: keyDef => keyDef.key === 'CapsLock',
  44. handle: (keyDef, element, options, state) => {
  45. state.modifiers.caps = !state.modifiers.caps;
  46. }
  47. }, {
  48. matches: (keyDef, element) => keyDef.key === 'Backspace' && (0, _utils.isEditable)(element) && !(0, _utils.isCursorAtStart)(element),
  49. handle: (keyDef, element, options, state) => {
  50. const {
  51. newValue,
  52. newSelectionStart
  53. } = (0, _utils.calculateNewValue)('', element, state.carryValue, undefined, 'backward');
  54. (0, _shared.fireInputEvent)(element, {
  55. newValue,
  56. newSelectionStart,
  57. eventOverrides: {
  58. inputType: 'deleteContentBackward'
  59. }
  60. });
  61. (0, _shared.carryValue)(element, state, newValue);
  62. }
  63. }];
  64. exports.keydownBehavior = keydownBehavior;
  65. const keypressBehavior = [{
  66. matches: (keyDef, element) => keyDef.key === 'Enter' && (0, _utils.isElementType)(element, 'input') && ['checkbox', 'radio'].includes(element.type),
  67. handle: (keyDef, element) => {
  68. const form = element.form;
  69. if ((0, _utils.hasFormSubmit)(form)) {
  70. _dom.fireEvent.submit(form);
  71. }
  72. }
  73. }, {
  74. matches: (keyDef, element) => keyDef.key === 'Enter' && ((0, _utils.isClickableInput)(element) || // Links with href defined should handle Enter the same as a click
  75. (0, _utils.isElementType)(element, 'a') && Boolean(element.href)),
  76. handle: (keyDef, element, options, state) => {
  77. _dom.fireEvent.click(element, (0, _getEventProps.getMouseEventProps)(state));
  78. }
  79. }, {
  80. matches: (keyDef, element) => keyDef.key === 'Enter' && (0, _utils.isElementType)(element, 'input'),
  81. handle: (keyDef, element) => {
  82. const form = element.form;
  83. if (form && (form.querySelectorAll('input').length === 1 || (0, _utils.hasFormSubmit)(form))) {
  84. _dom.fireEvent.submit(form);
  85. }
  86. }
  87. }];
  88. exports.keypressBehavior = keypressBehavior;
  89. const preKeyupBehavior = [// modifierKeys switch off the modifier BEFORE the keyup event
  90. ...Object.entries(modifierKeys).map(([key, modKey]) => ({
  91. matches: keyDef => keyDef.key === key,
  92. handle: (keyDef, element, options, state) => {
  93. state.modifiers[modKey] = false;
  94. }
  95. }))];
  96. exports.preKeyupBehavior = preKeyupBehavior;
  97. const keyupBehavior = [{
  98. matches: (keyDef, element) => keyDef.key === ' ' && (0, _utils.isClickableInput)(element),
  99. handle: (keyDef, element, options, state) => {
  100. _dom.fireEvent.click(element, (0, _getEventProps.getMouseEventProps)(state));
  101. }
  102. }];
  103. exports.keyupBehavior = keyupBehavior;
  104. const postKeyupBehavior = [// AltGraph produces an extra keyup for Control
  105. // The modifier does not change
  106. {
  107. matches: keyDef => keyDef.key === 'AltGraph',
  108. handle: (keyDef, element, options, state) => {
  109. var _options$keyboardMap$2;
  110. const ctrlKeyDef = (_options$keyboardMap$2 = options.keyboardMap.find(k => k.key === 'Control')) != null ? _options$keyboardMap$2 :
  111. /* istanbul ignore next */
  112. {
  113. key: 'Control',
  114. code: 'Control'
  115. };
  116. _dom.fireEvent.keyUp(element, (0, _getEventProps.getKeyEventProps)(ctrlKeyDef, state));
  117. }
  118. }];
  119. exports.postKeyupBehavior = postKeyupBehavior;