Fix onMouseEnter is fired on disabled buttons (#17675)
Alfredo Granja committed
Feb 4, 2020 at 08:56 UTC
812277dab6b449596288825d59184dfc1acdf370
2 files changed
+16
packages/legacy-events/EventPluginHub.js
+1
@@ -45,6 +45,7 @@ function shouldPreventMouseEvent(name, type, props) {
45
case 'onMouseMoveCapture':
46
case 'onMouseUp':
47
case 'onMouseUpCapture':
48
+ case 'onMouseEnter':
49
return !!(props.disabled && isInteractive(type));
50
default:
51
return false;
packages/react-dom/src/__tests__/ReactBrowserEventEmitter-test.internal.js
+15
@@ -37,6 +37,7 @@ const ON_MOUSE_ENTER_KEY = 'onMouseEnter';
37
let GRANDPARENT;
38
let PARENT;
39
let CHILD;
40
+let BUTTON;
41
42
let getListener;
43
let putListener;
@@ -71,6 +72,7 @@ describe('ReactBrowserEventEmitter', () => {
72
let GRANDPARENT_PROPS = {};
73
let PARENT_PROPS = {};
74
let CHILD_PROPS = {};
75
+ let BUTTON_PROPS = {};
76
77
function Child(props) {
78
return <div ref={c => (CHILD = c)} {...props} />;
@@ -87,6 +89,7 @@ describe('ReactBrowserEventEmitter', () => {
89
<div ref={c => (GRANDPARENT = c)} {...GRANDPARENT_PROPS}>
90
<div ref={c => (PARENT = c)} {...PARENT_PROPS}>
91
<ChildWrapper {...CHILD_PROPS} />
92
+ <button disabled={true} ref={c => (BUTTON = c)} {...BUTTON_PROPS} />
93
</div>
94
</div>,
95
container,
@@ -110,6 +113,9 @@ describe('ReactBrowserEventEmitter', () => {
113
case GRANDPARENT:
114
GRANDPARENT_PROPS[eventName] = listener;
115
break;
116
+ case BUTTON:
117
+ BUTTON_PROPS[eventName] = listener;
118
+ break;
119
}
120
// Rerender with new event listeners
121
renderTree();
@@ -125,6 +131,9 @@ describe('ReactBrowserEventEmitter', () => {
131
case GRANDPARENT:
132
GRANDPARENT_PROPS = {};
133
break;
134
+ case BUTTON:
135
+ BUTTON_PROPS = {};
136
+ break;
137
}
138
renderTree();
139
};
@@ -149,6 +158,12 @@ describe('ReactBrowserEventEmitter', () => {
158
expect(listener).toEqual(LISTENER);
159
});
160
161
+ it('should not retrieve listeners on a disabled interactive element', () => {
162
+ putListener(BUTTON, ON_MOUSE_ENTER_KEY, recordID.bind(null, BUTTON));
163
+ const listener = getListener(BUTTON, ON_MOUSE_ENTER_KEY);
164
+ expect(listener).toBe(null);
165
+ });
166
+
167
it('should clear all handlers when asked to', () => {
168
registerSimpleTestHandler();
169
deleteAllListeners(CHILD);