Skip to content

Commit 585f1df

Browse files
authored
fix(click/dblClick): prevent blur when clicking the same element (testing-library#265)
1 parent a0cbe27 commit 585f1df

File tree

3 files changed

+34
-10
lines changed

3 files changed

+34
-10
lines changed

__tests__/react/click.js

+9
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,15 @@ describe("userEvent.click", () => {
408408
expect(onSubmit).not.toHaveBeenCalled();
409409
});
410410

411+
it("should not fire blur on current element if is the same as previous", () => {
412+
const onBlur = jest.fn();
413+
const { getByText } = render(<button onBlur={onBlur}>Blur</button>);
414+
userEvent.click(getByText("Blur"));
415+
expect(onBlur).not.toHaveBeenCalled();
416+
userEvent.click(getByText("Blur"));
417+
expect(onBlur).not.toHaveBeenCalled();
418+
});
419+
411420
it.each(["input", "textarea"])(
412421
"should not give focus for <%s> when mouseDown is prevented",
413422
(type) => {

__tests__/react/dblclick.js

+9
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,15 @@ describe("userEvent.dblClick", () => {
105105
]);
106106
});
107107

108+
it("should not fire blur on current element if is the same as previous", () => {
109+
const onBlur = jest.fn();
110+
const { getByText } = render(<button onBlur={onBlur}>Blur</button>);
111+
userEvent.dblClick(getByText("Blur"));
112+
expect(onBlur).not.toHaveBeenCalled();
113+
userEvent.dblClick(getByText("Blur"));
114+
expect(onBlur).not.toHaveBeenCalled();
115+
});
116+
108117
it("should not blur when mousedown prevents default", () => {
109118
let events = [];
110119
const eventsHandler = jest.fn((evt) => events.push(evt.type));

src/index.js

+16-10
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,13 @@ function clickBooleanElement(element) {
4444
function clickElement(element, previousElement, init) {
4545
fireEvent.mouseOver(element);
4646
fireEvent.mouseMove(element);
47+
const wasAnotherElementFocused =
48+
previousElement !== element.ownerDocument.body &&
49+
previousElement !== element;
4750
const continueDefaultHandling = fireEvent.mouseDown(element);
4851
if (continueDefaultHandling) {
49-
previousElement && previousElement.blur();
50-
element.focus();
52+
wasAnotherElementFocused && previousElement.blur();
53+
previousElement !== element && element.focus();
5154
}
5255
fireEvent.mouseUp(element);
5356
fireEvent.click(element, init);
@@ -59,10 +62,13 @@ function clickElement(element, previousElement, init) {
5962
function dblClickElement(element, previousElement) {
6063
fireEvent.mouseOver(element);
6164
fireEvent.mouseMove(element);
65+
const wasAnotherElementFocused =
66+
previousElement !== element.ownerDocument.body &&
67+
previousElement !== element;
6268
const continueDefaultHandling = fireEvent.mouseDown(element);
6369
if (continueDefaultHandling) {
64-
previousElement && previousElement.blur();
65-
element.focus();
70+
wasAnotherElementFocused && previousElement.blur();
71+
previousElement !== element && element.focus();
6672
}
6773
fireEvent.mouseUp(element);
6874
fireEvent.click(element);
@@ -106,21 +112,21 @@ function fireChangeEvent(event) {
106112
}
107113

108114
const Keys = {
109-
Backspace: { keyCode: 8, code: "Backspace", key: "Backspace" }
115+
Backspace: { keyCode: 8, code: "Backspace", key: "Backspace" },
110116
};
111117

112118
function backspace(element) {
113119
const eventOptions = {
114120
key: Keys.Backspace.key,
115121
keyCode: Keys.Backspace.keyCode,
116-
which: Keys.Backspace.keyCode
122+
which: Keys.Backspace.keyCode,
117123
};
118124
fireEvent.keyDown(element, eventOptions);
119125
fireEvent.keyUp(element, eventOptions);
120126

121127
if (!element.readOnly) {
122128
fireEvent.input(element, {
123-
inputType: "deleteContentBackward"
129+
inputType: "deleteContentBackward",
124130
});
125131
element.value = ""; // when we add special keys to API, will need to respect selected range
126132
}
@@ -152,7 +158,7 @@ const userEvent = {
152158
break;
153159
}
154160
default:
155-
clickElement(element, wasAnotherElementFocused && focusedElement, init);
161+
clickElement(element, focusedElement, init);
156162
}
157163
},
158164

@@ -172,7 +178,7 @@ const userEvent = {
172178
break;
173179
}
174180
default:
175-
dblClickElement(element, wasAnotherElementFocused && focusedElement);
181+
dblClickElement(element, focusedElement);
176182
}
177183
},
178184

@@ -185,7 +191,7 @@ const userEvent = {
185191
fireEvent.mouseLeave(focusedElement);
186192
}
187193

188-
clickElement(element, wasAnotherElementFocused && focusedElement);
194+
clickElement(element, focusedElement);
189195

190196
const valArray = Array.isArray(values) ? values : [values];
191197
const selectedOptions = Array.from(

0 commit comments

Comments
 (0)