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.

176 lines
4.8 KiB

2 years ago
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.click = click;
exports.dblClick = dblClick;
var _dom = require("@testing-library/dom");
var _utils = require("./utils");
var _hover = require("./hover");
var _blur = require("./blur");
var _focus = require("./focus");
function getPreviouslyFocusedElement(element) {
const focusedElement = element.ownerDocument.activeElement;
const wasAnotherElementFocused = focusedElement && focusedElement !== element.ownerDocument.body && focusedElement !== element;
return wasAnotherElementFocused ? focusedElement : null;
}
function clickLabel(label, init, {
clickCount
}) {
if ((0, _utils.isLabelWithInternallyDisabledControl)(label)) return;
_dom.fireEvent.pointerDown(label, init);
_dom.fireEvent.mouseDown(label, (0, _utils.getMouseEventOptions)('mousedown', init, clickCount));
_dom.fireEvent.pointerUp(label, init);
_dom.fireEvent.mouseUp(label, (0, _utils.getMouseEventOptions)('mouseup', init, clickCount));
fireClick(label, (0, _utils.getMouseEventOptions)('click', init, clickCount)); // clicking the label will trigger a click of the label.control
// however, it will not focus the label.control so we have to do it
// ourselves.
if (label.control) (0, _focus.focus)(label.control);
}
function clickBooleanElement(element, init, {
clickCount
}) {
_dom.fireEvent.pointerDown(element, init);
if (!element.disabled) {
_dom.fireEvent.mouseDown(element, (0, _utils.getMouseEventOptions)('mousedown', init, clickCount));
}
(0, _focus.focus)(element);
_dom.fireEvent.pointerUp(element, init);
if (!element.disabled) {
_dom.fireEvent.mouseUp(element, (0, _utils.getMouseEventOptions)('mouseup', init, clickCount));
fireClick(element, (0, _utils.getMouseEventOptions)('click', init, clickCount));
}
}
function clickElement(element, init, {
clickCount
}) {
const previousElement = getPreviouslyFocusedElement(element);
_dom.fireEvent.pointerDown(element, init);
if (!(0, _utils.isDisabled)(element)) {
const continueDefaultHandling = _dom.fireEvent.mouseDown(element, (0, _utils.getMouseEventOptions)('mousedown', init, clickCount));
if (continueDefaultHandling) {
const closestFocusable = findClosest(element, _utils.isFocusable);
if (previousElement && !closestFocusable) {
(0, _blur.blur)(previousElement);
} else if (closestFocusable) {
(0, _focus.focus)(closestFocusable);
}
}
}
_dom.fireEvent.pointerUp(element, init);
if (!(0, _utils.isDisabled)(element)) {
_dom.fireEvent.mouseUp(element, (0, _utils.getMouseEventOptions)('mouseup', init, clickCount));
fireClick(element, (0, _utils.getMouseEventOptions)('click', init, clickCount));
const parentLabel = element.closest('label');
if (parentLabel != null && parentLabel.control) (0, _focus.focus)(parentLabel.control);
}
}
function findClosest(element, callback) {
let el = element;
do {
if (callback(el)) {
return el;
}
el = el.parentElement;
} while (el && el !== element.ownerDocument.body);
return undefined;
}
function click(element, init, {
skipHover = false,
clickCount = 0,
skipPointerEventsCheck = false
} = {}) {
if (!skipPointerEventsCheck && !(0, _utils.hasPointerEvents)(element)) {
throw new Error('unable to click element as it has or inherits pointer-events set to "none".');
} // We just checked for `pointerEvents`. We can always skip this one in `hover`.
if (!skipHover) (0, _hover.hover)(element, init, {
skipPointerEventsCheck: true
});
if ((0, _utils.isElementType)(element, 'label')) {
clickLabel(element, init, {
clickCount
});
} else if ((0, _utils.isElementType)(element, 'input')) {
if (element.type === 'checkbox' || element.type === 'radio') {
clickBooleanElement(element, init, {
clickCount
});
} else {
clickElement(element, init, {
clickCount
});
}
} else {
clickElement(element, init, {
clickCount
});
}
}
function fireClick(element, mouseEventOptions) {
if (mouseEventOptions.button === 2) {
_dom.fireEvent.contextMenu(element, mouseEventOptions);
} else {
_dom.fireEvent.click(element, mouseEventOptions);
}
}
function dblClick(element, init, {
skipPointerEventsCheck = false
} = {}) {
if (!skipPointerEventsCheck && !(0, _utils.hasPointerEvents)(element)) {
throw new Error('unable to double-click element as it has or inherits pointer-events set to "none".');
}
(0, _hover.hover)(element, init, {
skipPointerEventsCheck
});
click(element, init, {
skipHover: true,
clickCount: 0,
skipPointerEventsCheck
});
click(element, init, {
skipHover: true,
clickCount: 1,
skipPointerEventsCheck
});
_dom.fireEvent.dblClick(element, (0, _utils.getMouseEventOptions)('dblclick', init, 2));
}