From 3655e30adbae73cd803b3daae32e03059b6f0149 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Thu, 14 Apr 2016 19:40:21 +0100 Subject: [PATCH] Merge pull request #6215 from nhunzaker/nh-fix-disabled-inputs Disabled inputs should not respond to clicks in IE (cherry picked from commit 36e4fe54a801a325d30359653e588e9705e7532b) --- .../dom/client/wrappers/DisabledInputUtils.js | 50 ++++++++ .../dom/client/wrappers/ReactDOMButton.js | 30 +---- .../dom/client/wrappers/ReactDOMInput.js | 3 +- .../dom/client/wrappers/ReactDOMSelect.js | 3 +- .../dom/client/wrappers/ReactDOMTextarea.js | 3 +- .../__tests__/DisabledInputUtil-test.js | 108 ++++++++++++++++++ .../wrappers/__tests__/ReactDOMButton-test.js | 93 --------------- 7 files changed, 166 insertions(+), 124 deletions(-) create mode 100644 src/renderers/dom/client/wrappers/DisabledInputUtils.js create mode 100644 src/renderers/dom/client/wrappers/__tests__/DisabledInputUtil-test.js delete mode 100644 src/renderers/dom/client/wrappers/__tests__/ReactDOMButton-test.js diff --git a/src/renderers/dom/client/wrappers/DisabledInputUtils.js b/src/renderers/dom/client/wrappers/DisabledInputUtils.js new file mode 100644 index 0000000000..37f8028351 --- /dev/null +++ b/src/renderers/dom/client/wrappers/DisabledInputUtils.js @@ -0,0 +1,50 @@ +/** + * Copyright 2013-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule DisabledInputUtils + */ + +'use strict'; + +var disableableMouseListenerNames = { + onClick: true, + onDoubleClick: true, + onMouseDown: true, + onMouseMove: true, + onMouseUp: true, + + onClickCapture: true, + onDoubleClickCapture: true, + onMouseDownCapture: true, + onMouseMoveCapture: true, + onMouseUpCapture: true, +}; + +/** + * Implements a native component that does not receive mouse events + * when `disabled` is set. + */ +var DisabledInputUtils = { + getNativeProps: function(inst, props) { + if (!props.disabled) { + return props; + } + + // Copy the props, except the mouse listeners + var nativeProps = {}; + for (var key in props) { + if (!disableableMouseListenerNames[key] && props.hasOwnProperty(key)) { + nativeProps[key] = props[key]; + } + } + + return nativeProps; + }, +}; + +module.exports = DisabledInputUtils; diff --git a/src/renderers/dom/client/wrappers/ReactDOMButton.js b/src/renderers/dom/client/wrappers/ReactDOMButton.js index bf32c45600..961a1ebebc 100644 --- a/src/renderers/dom/client/wrappers/ReactDOMButton.js +++ b/src/renderers/dom/client/wrappers/ReactDOMButton.js @@ -11,40 +11,14 @@ 'use strict'; -var mouseListenerNames = { - onClick: true, - onDoubleClick: true, - onMouseDown: true, - onMouseMove: true, - onMouseUp: true, - - onClickCapture: true, - onDoubleClickCapture: true, - onMouseDownCapture: true, - onMouseMoveCapture: true, - onMouseUpCapture: true, -}; +var DisabledInputUtils = require('DisabledInputUtils'); /** * Implements a