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.
67 lines
2.2 KiB
67 lines
2.2 KiB
"use strict"; |
|
|
|
Object.defineProperty(exports, "__esModule", { |
|
value: true |
|
}); |
|
exports.paste = paste; |
|
|
|
var _dom = require("@testing-library/dom"); |
|
|
|
var _utils = require("./utils"); |
|
|
|
function isSupportedElement(element) { |
|
return (0, _utils.isElementType)(element, 'input') && Boolean(_utils.editableInputTypes[element.type]) || (0, _utils.isElementType)(element, 'textarea'); |
|
} |
|
|
|
function paste(element, text, init, { |
|
initialSelectionStart, |
|
initialSelectionEnd |
|
} = {}) { |
|
// TODO: implement for contenteditable |
|
if (!isSupportedElement(element)) { |
|
throw new TypeError(`The given ${element.tagName} element is currently unsupported. |
|
A PR extending this implementation would be very much welcome at https://github.com/testing-library/user-event`); |
|
} |
|
|
|
if ((0, _utils.isDisabled)(element)) { |
|
return; |
|
} |
|
|
|
(0, _utils.eventWrapper)(() => element.focus()); // by default, a new element has it's selection start and end at 0 |
|
// but most of the time when people call "paste", they expect it to paste |
|
// at the end of the current input value. So, if the selection start |
|
// and end are both the default of 0, then we'll go ahead and change |
|
// them to the length of the current value. |
|
// the only time it would make sense to pass the initialSelectionStart or |
|
// initialSelectionEnd is if you have an input with a value and want to |
|
// explicitely start typing with the cursor at 0. Not super common. |
|
|
|
if (element.selectionStart === 0 && element.selectionEnd === 0) { |
|
(0, _utils.setSelectionRange)(element, initialSelectionStart != null ? initialSelectionStart : element.value.length, initialSelectionEnd != null ? initialSelectionEnd : element.value.length); |
|
} |
|
|
|
_dom.fireEvent.paste(element, init); |
|
|
|
if (element.readOnly) { |
|
return; |
|
} |
|
|
|
text = text.substr(0, (0, _utils.getSpaceUntilMaxLength)(element)); |
|
const { |
|
newValue, |
|
newSelectionStart |
|
} = (0, _utils.calculateNewValue)(text, element); |
|
|
|
_dom.fireEvent.input(element, { |
|
inputType: 'insertFromPaste', |
|
target: { |
|
value: newValue |
|
} |
|
}); |
|
|
|
(0, _utils.setSelectionRange)(element, // TODO: investigate why the selection caused by invalid parameters was expected |
|
{ |
|
newSelectionStart, |
|
selectionEnd: newSelectionStart |
|
}, {}); |
|
} |