diff --git a/src/__tests__/fireEvent.test.js b/src/__tests__/fireEvent.test.js
index a8f1ac43d..90cb60e06 100644
--- a/src/__tests__/fireEvent.test.js
+++ b/src/__tests__/fireEvent.test.js
@@ -234,6 +234,83 @@ test('should not fire on non-editable TextInput with nested Text', () => {
expect(onChangeTextMock).not.toHaveBeenCalled();
});
+test('should not fire on none pointerEvents View', () => {
+ const handlePress = jest.fn();
+
+ const screen = render(
+
+
+ Trigger
+
+
+ );
+
+ fireEvent.press(screen.getByText('Trigger'));
+ expect(handlePress).not.toHaveBeenCalled();
+});
+
+test('should not fire on box-only pointerEvents View', () => {
+ const handlePress = jest.fn();
+
+ const screen = render(
+
+
+ Trigger
+
+
+ );
+
+ fireEvent.press(screen.getByText('Trigger'));
+ expect(handlePress).not.toHaveBeenCalled();
+});
+
+test('should fire on box-none pointerEvents View', () => {
+ const handlePress = jest.fn();
+
+ const screen = render(
+
+
+ Trigger
+
+
+ );
+
+ fireEvent.press(screen.getByText('Trigger'));
+ expect(handlePress).toHaveBeenCalled();
+});
+
+test('should fire on auto pointerEvents View', () => {
+ const handlePress = jest.fn();
+
+ const screen = render(
+
+
+ Trigger
+
+
+ );
+
+ fireEvent.press(screen.getByText('Trigger'));
+ expect(handlePress).toHaveBeenCalled();
+});
+
+test('should not fire on box-only pointerEvents View with nested elements', () => {
+ const handlePress = jest.fn();
+
+ const screen = render(
+
+
+
+ Trigger
+
+
+
+ );
+
+ fireEvent.press(screen.getByText('Trigger'));
+ expect(handlePress).not.toHaveBeenCalled();
+});
+
test('should pass event up on disabled TouchableOpacity', () => {
const handleInnerPress = jest.fn();
const handleOuterPress = jest.fn();
diff --git a/src/fireEvent.js b/src/fireEvent.js
index dcc49d81c..18c938e7d 100644
--- a/src/fireEvent.js
+++ b/src/fireEvent.js
@@ -17,11 +17,29 @@ const isTouchResponder = (element?: ReactTestInstance) => {
return !!element?.props.onStartShouldSetResponder || isTextInput(element);
};
+const isPointerEventEnabled = (
+ element?: ReactTestInstance,
+ isParent?: boolean
+) => {
+ const parentCondition = isParent
+ ? element?.props.pointerEvents === 'box-only'
+ : element?.props.pointerEvents === 'box-none';
+
+ if (element?.props.pointerEvents === 'none' || parentCondition) {
+ return false;
+ }
+
+ if (!element?.parent) return true;
+
+ return isPointerEventEnabled(element.parent, true);
+};
+
const isEventEnabled = (
element?: ReactTestInstance,
touchResponder?: ReactTestInstance
) => {
if (isTextInput(element)) return element?.props.editable !== false;
+ if (!isPointerEventEnabled(element)) return false;
const touchStart = touchResponder?.props.onStartShouldSetResponder?.();
const touchMove = touchResponder?.props.onMoveShouldSetResponder?.();