You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
4.5 KiB
131 lines
4.5 KiB
"use strict"; |
|
|
|
Object.defineProperty(exports, "__esModule", { |
|
value: true |
|
}); |
|
exports.preKeyupBehavior = exports.preKeydownBehavior = exports.postKeyupBehavior = exports.keyupBehavior = exports.keypressBehavior = exports.keydownBehavior = void 0; |
|
|
|
var _dom = require("@testing-library/dom"); |
|
|
|
var _utils = require("../../utils"); |
|
|
|
var _getEventProps = require("../getEventProps"); |
|
|
|
var _shared = require("../shared"); |
|
|
|
/** |
|
* This file should contain behavior for functional keys as described here: |
|
* https://w3c.github.io/uievents-code/#key-alphanumeric-functional |
|
*/ |
|
const modifierKeys = { |
|
Alt: 'alt', |
|
Control: 'ctrl', |
|
Shift: 'shift', |
|
Meta: 'meta' |
|
}; |
|
const preKeydownBehavior = [// modifierKeys switch on the modifier BEFORE the keydown event |
|
...Object.entries(modifierKeys).map(([key, modKey]) => ({ |
|
matches: keyDef => keyDef.key === key, |
|
handle: (keyDef, element, options, state) => { |
|
state.modifiers[modKey] = true; |
|
} |
|
})), // AltGraph produces an extra keydown for Control |
|
// The modifier does not change |
|
{ |
|
matches: keyDef => keyDef.key === 'AltGraph', |
|
handle: (keyDef, element, options, state) => { |
|
var _options$keyboardMap$; |
|
|
|
const ctrlKeyDef = (_options$keyboardMap$ = options.keyboardMap.find(k => k.key === 'Control')) != null ? _options$keyboardMap$ : |
|
/* istanbul ignore next */ |
|
{ |
|
key: 'Control', |
|
code: 'Control' |
|
}; |
|
|
|
_dom.fireEvent.keyDown(element, (0, _getEventProps.getKeyEventProps)(ctrlKeyDef, state)); |
|
} |
|
}]; |
|
exports.preKeydownBehavior = preKeydownBehavior; |
|
const keydownBehavior = [{ |
|
matches: keyDef => keyDef.key === 'CapsLock', |
|
handle: (keyDef, element, options, state) => { |
|
state.modifiers.caps = !state.modifiers.caps; |
|
} |
|
}, { |
|
matches: (keyDef, element) => keyDef.key === 'Backspace' && (0, _utils.isEditable)(element) && !(0, _utils.isCursorAtStart)(element), |
|
handle: (keyDef, element, options, state) => { |
|
const { |
|
newValue, |
|
newSelectionStart |
|
} = (0, _utils.calculateNewValue)('', element, state.carryValue, undefined, 'backward'); |
|
(0, _shared.fireInputEvent)(element, { |
|
newValue, |
|
newSelectionStart, |
|
eventOverrides: { |
|
inputType: 'deleteContentBackward' |
|
} |
|
}); |
|
(0, _shared.carryValue)(element, state, newValue); |
|
} |
|
}]; |
|
exports.keydownBehavior = keydownBehavior; |
|
const keypressBehavior = [{ |
|
matches: (keyDef, element) => keyDef.key === 'Enter' && (0, _utils.isElementType)(element, 'input') && ['checkbox', 'radio'].includes(element.type), |
|
handle: (keyDef, element) => { |
|
const form = element.form; |
|
|
|
if ((0, _utils.hasFormSubmit)(form)) { |
|
_dom.fireEvent.submit(form); |
|
} |
|
} |
|
}, { |
|
matches: (keyDef, element) => keyDef.key === 'Enter' && ((0, _utils.isClickableInput)(element) || // Links with href defined should handle Enter the same as a click |
|
(0, _utils.isElementType)(element, 'a') && Boolean(element.href)), |
|
handle: (keyDef, element, options, state) => { |
|
_dom.fireEvent.click(element, (0, _getEventProps.getMouseEventProps)(state)); |
|
} |
|
}, { |
|
matches: (keyDef, element) => keyDef.key === 'Enter' && (0, _utils.isElementType)(element, 'input'), |
|
handle: (keyDef, element) => { |
|
const form = element.form; |
|
|
|
if (form && (form.querySelectorAll('input').length === 1 || (0, _utils.hasFormSubmit)(form))) { |
|
_dom.fireEvent.submit(form); |
|
} |
|
} |
|
}]; |
|
exports.keypressBehavior = keypressBehavior; |
|
const preKeyupBehavior = [// modifierKeys switch off the modifier BEFORE the keyup event |
|
...Object.entries(modifierKeys).map(([key, modKey]) => ({ |
|
matches: keyDef => keyDef.key === key, |
|
handle: (keyDef, element, options, state) => { |
|
state.modifiers[modKey] = false; |
|
} |
|
}))]; |
|
exports.preKeyupBehavior = preKeyupBehavior; |
|
const keyupBehavior = [{ |
|
matches: (keyDef, element) => keyDef.key === ' ' && (0, _utils.isClickableInput)(element), |
|
handle: (keyDef, element, options, state) => { |
|
_dom.fireEvent.click(element, (0, _getEventProps.getMouseEventProps)(state)); |
|
} |
|
}]; |
|
exports.keyupBehavior = keyupBehavior; |
|
const postKeyupBehavior = [// AltGraph produces an extra keyup for Control |
|
// The modifier does not change |
|
{ |
|
matches: keyDef => keyDef.key === 'AltGraph', |
|
handle: (keyDef, element, options, state) => { |
|
var _options$keyboardMap$2; |
|
|
|
const ctrlKeyDef = (_options$keyboardMap$2 = options.keyboardMap.find(k => k.key === 'Control')) != null ? _options$keyboardMap$2 : |
|
/* istanbul ignore next */ |
|
{ |
|
key: 'Control', |
|
code: 'Control' |
|
}; |
|
|
|
_dom.fireEvent.keyUp(element, (0, _getEventProps.getKeyEventProps)(ctrlKeyDef, state)); |
|
} |
|
}]; |
|
exports.postKeyupBehavior = postKeyupBehavior; |