From fe739c28830bbea3588190d7425ba9624621f6a5 Mon Sep 17 00:00:00 2001 From: Nate Hunzaker Date: Tue, 8 Mar 2016 08:13:10 -0500 Subject: [PATCH 1/4] Disabled inputs should not respond to clicks in IE This commit migrates over the disabled property behavior from ReactDOMButton into a general purpose disabled event filter. It also applies that behavior to inputs, selects, and textareas. --- .../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 0000000000000..06ab2dc9dc9a4 --- /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 (props.hasOwnProperty(key) && !disableableMouseListenerNames[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 bf32c4560052b..961a1ebebcf2b 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