diff --git a/src/__tests__/keyboard/plugin/character.ts b/src/__tests__/keyboard/plugin/character.ts
index 095acea1..fc85af18 100644
--- a/src/__tests__/keyboard/plugin/character.ts
+++ b/src/__tests__/keyboard/plugin/character.ts
@@ -2,18 +2,26 @@ import userEvent from 'index'
import {setup} from '__tests__/helpers/utils'
test('type [Enter] in textarea', () => {
- const {element} = setup(``)
+ const {element, getEvents} = setup(``)
- userEvent.type(element as HTMLTextAreaElement, 'oo[Enter]bar')
+ userEvent.type(
+ element as HTMLTextAreaElement,
+ 'oo[Enter]bar[ShiftLeft>][Enter]baz',
+ )
- expect(element).toHaveValue('foo\nbar')
+ expect(element).toHaveValue('foo\nbar\nbaz')
+ expect(getEvents('input')[2]).toHaveProperty('inputType', 'insertLineBreak')
+ expect(getEvents('input')[6]).toHaveProperty('inputType', 'insertLineBreak')
})
test('type [Enter] in contenteditable', () => {
- const {element} = setup(`
f
`)
+ const {element, getEvents} = setup(`f
`)
+ ;(element as HTMLDivElement).focus()
- userEvent.type(element as HTMLTextAreaElement, 'oo[Enter]bar')
+ userEvent.keyboard('oo[Enter]bar[ShiftLeft>][Enter]baz')
- expect(element).toHaveTextContent('foo bar')
- expect(element?.firstChild).toHaveProperty('nodeValue', 'foo\nbar')
+ expect(element).toHaveTextContent('foo bar baz')
+ expect(element?.firstChild).toHaveProperty('nodeValue', 'foo\nbar\nbaz')
+ expect(getEvents('input')[2]).toHaveProperty('inputType', 'insertParagraph')
+ expect(getEvents('input')[6]).toHaveProperty('inputType', 'insertLineBreak')
})
diff --git a/src/keyboard/plugins/character.ts b/src/keyboard/plugins/character.ts
index 31d523d6..f8ca9856 100644
--- a/src/keyboard/plugins/character.ts
+++ b/src/keyboard/plugins/character.ts
@@ -165,17 +165,22 @@ export const keypressBehavior: behaviorPlugin[] = [
keyDef.key === 'Enter' &&
(isInstanceOfElement(element, 'HTMLTextAreaElement') ||
isContentEditable(element)),
- handle: (keyDef, element) => {
+ handle: (keyDef, element, options, state) => {
const {newValue, newSelectionStart} = calculateNewValue(
'\n',
element as HTMLElement,
)
+ const inputType =
+ isContentEditable(element) && !state.modifiers.shift
+ ? 'insertParagraph'
+ : 'insertLineBreak'
+
fireInputEventIfNeeded({
newValue,
newSelectionStart,
eventOverrides: {
- inputType: 'insertLineBreak',
+ inputType,
},
currentElement: () => element,
})
diff --git a/src/utils/edit/getSelectionRange.ts b/src/utils/edit/getSelectionRange.ts
index 7d8476f6..6094001a 100644
--- a/src/utils/edit/getSelectionRange.ts
+++ b/src/utils/edit/getSelectionRange.ts
@@ -8,10 +8,9 @@ export function getSelectionRange(
} {
if (isContentEditable(element)) {
const selection = element.ownerDocument.getSelection()
- const range = selection?.getRangeAt(0)
- // istanbul ignore else
- if (range) {
+ if (selection?.rangeCount) {
+ const range = selection.getRangeAt(0)
return {
selectionStart: range.startOffset,
selectionEnd: range.endOffset,