Change:
The same in Chrome 35.0.1916.153. It's OK in Chrome Canary 38.0.2082.0 canary (64-bit).
This is actually an - we've the workarounds to make sure disabled s actually behave correctly here. This holds for all disabled inputs it seems.

Discussion:
<ins> /** * 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; </ins>

'use strict'; <del> var mouseListenerNames = { onClick: true, onDoubleClick: true, onMouseDown: true, onMouseMove: true, onMouseUp: true, onClickCapture: true, onDoubleClickCapture: true, onMouseDownCapture: true, onMouseMoveCapture: true, onMouseUpCapture: true, }; </del> <ins> var DisabledInputUtils = require('DisabledInputUtils'); </ins> /** * Implements a <button> native component that does not receive mouse events * when `disabled` is set. */ var ReactDOMButton = { <del> 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) && !mouseListenerNames[key]) { nativeProps[key] = props[key]; } } return nativeProps; }, </del> <ins> getNativeProps: DisabledInputUtils.getNativeProps, </ins> }; module.exports = ReactDOMButton;

// Make sure we set .type before any other properties (setting .value // before .type means .value is lost in IE11 and below) type: undefined, <del> }, props, { </del> <ins> }, DisabledInputUtils.getNativeProps(inst, props), { </ins> defaultChecked: undefined, defaultValue: undefined, value: value != null ? value : inst._wrapperState.initialValue,

'use strict'; <ins> var DisabledInputUtils = require('DisabledInputUtils'); </ins> var LinkedValueUtils = require('LinkedValueUtils'); var ReactDOMComponentTree = require('ReactDOMComponentTree'); var ReactUpdates = require('ReactUpdates');

*/ var ReactDOMSelect = { getNativeProps: function(inst, props) { <del> return Object.assign({}, props, { </del> <ins> return Object.assign({}, DisabledInputUtils.getNativeProps(inst, props), { </ins> onChange: inst._wrapperState.onChange, value: undefined, });

'use strict'; <ins> var DisabledInputUtils = require('DisabledInputUtils'); </ins> var DOMPropertyOperations = require('DOMPropertyOperations'); var LinkedValueUtils = require('LinkedValueUtils'); var ReactDOMComponentTree = require('ReactDOMComponentTree');

// Always set children to the same thing. In IE9, the selection range will // get reset if `textContent` is mutated. <del> var nativeProps = Object.assign({}, props, { </del> <ins> var nativeProps = Object.assign({}, DisabledInputUtils.getNativeProps(inst, props), { </ins> defaultValue: undefined, value: undefined, children: inst._wrapperState.initialValue,

<ins> /** * 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. * * @emails react-core */ 'use strict'; describe('DisabledInputUtils', function() { var React; var ReactDOM; var ReactTestUtils; var elements = ['button', 'input', 'select', 'textarea']; function expectClickThru(element) { onClick.mockClear(); ReactTestUtils.Simulate.click(ReactDOM.findDOMNode(element)); expect(onClick.mock.calls.length).toBe(1); } function expectNoClickThru(element) { onClick.mockClear(); ReactTestUtils.Simulate.click(ReactDOM.findDOMNode(element)); expect(onClick.mock.calls.length).toBe(0); } function mounted(element) { element = ReactTestUtils.renderIntoDocument(element); return element; } var onClick = jest.genMockFn(); elements.forEach(function(tagName) { describe(tagName, function() { beforeEach(function() { React = require('React'); ReactDOM = require('ReactDOM'); ReactTestUtils = require('ReactTestUtils'); }); it('should forward clicks when it starts out not disabled', function() { var element = React.createElement(tagName, { onClick: onClick, }); expectClickThru(mounted(element)); }); it('should not forward clicks when it starts out disabled', function() { var element = React.createElement(tagName, { onClick: onClick, disabled: true, }); expectNoClickThru(mounted(element)); }); it('should forward clicks when it becomes not disabled', function() { var container = document.createElement('div'); var element = ReactDOM.render( React.createElement(tagName, { onClick: onClick, disabled: true }), container ); element = ReactDOM.render( React.createElement(tagName, { onClick: onClick }), container ); expectClickThru(element); }); it('should not forward clicks when it becomes disabled', function() { var container = document.createElement('div'); var element = ReactDOM.render( React.createElement(tagName, { onClick: onClick }), container ); element = ReactDOM.render( React.createElement(tagName, { onClick: onClick, disabled: true }), container ); expectNoClickThru(element); }); it('should work correctly if the listener is changed', function() { var container = document.createElement('div'); var element = ReactDOM.render( React.createElement(tagName, { onClick: onClick, disabled: true }), container ); element = ReactDOM.render( React.createElement(tagName, { onClick: onClick, disabled: false }), container ); expectClickThru(element); }); }); }); }); </ins>

<del> /** * 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. * * @emails react-core */ 'use strict'; describe('ReactDOMButton', function() { var React; var ReactDOM; var ReactTestUtils; var onClick = jest.genMockFn(); function expectClickThru(button) { onClick.mockClear(); ReactTestUtils.Simulate.click(ReactDOM.findDOMNode(button)); expect(onClick.mock.calls.length).toBe(1); } function expectNoClickThru(button) { onClick.mockClear(); ReactTestUtils.Simulate.click(ReactDOM.findDOMNode(button)); expect(onClick.mock.calls.length).toBe(0); } function mounted(button) { button = ReactTestUtils.renderIntoDocument(button); return button; } beforeEach(function() { React = require('React'); ReactDOM = require('ReactDOM'); ReactTestUtils = require('ReactTestUtils'); }); it('should forward clicks when it starts out not disabled', function() { expectClickThru(mounted(<button onClick={onClick} />)); }); it('should not forward clicks when it starts out disabled', function() { expectNoClickThru( mounted(<button disabled={true} onClick={onClick} />) ); }); it('should forward clicks when it becomes not disabled', function() { var container = document.createElement('div'); var btn = ReactDOM.render( <button disabled={true} onClick={onClick} />, container ); btn = ReactDOM.render( <button onClick={onClick} />, container ); expectClickThru(btn); }); it('should not forward clicks when it becomes disabled', function() { var container = document.createElement('div'); var btn = ReactDOM.render( <button onClick={onClick} />, container ); btn = ReactDOM.render( <button disabled={true} onClick={onClick} />, container ); expectNoClickThru(btn); }); it('should work correctly if the listener is changed', function() { var container = document.createElement('div'); var btn = ReactDOM.render( <button disabled={true} onClick={function() {}} />, container ); btn = ReactDOM.render( <button disabled={false} onClick={onClick} />, container ); expectClickThru(btn); }); }); </del>