Now that #1510 has landed we still have one final issue to fix (ironically, the initial reason for #1510). https://github.com/facebook/react/pull/1510#issuecomment-170229012 + https://github.com/facebook/react/pull/1510#issuecomment-170229162, the problem being that `value` is managed as a property for the purpose of `<input>`, but `<progress>` requires it to be an attribute so that the attribute is correctly removed when null.

As discussed in the second comment, it seems to me that the right approach here is to actually remove all the special property logic from DOMPropertyOperations and instead implement it in the appropriate wrappers instead (ReactDOMInput, etc).

Repro: http://jsfiddle.net/670u7ure/8/
Original issue: https://github.com/facebook/react/issues/1431

cc @jimfb, @spicyj

'Input elements should not switch from uncontrolled to controlled (or vice versa). ' +
      'Decide between using a controlled or uncontrolled input ' +
      'element for the lifetime of the component. More info: https://fb.me/react-controlled-components'
    );
  });
  it('should warn if controlled checkbox switches to uncontrolled', function() {
    var stub = <input type="checkbox" checked={true} onChange={emptyFunction} />;
    var container = document.createElement('div');
    ReactDOM.render(stub, container);
    ReactDOM.render(<input type="checkbox" />, container);
    expect(console.error.argsForCall.length).toBe(1);
    expect(console.error.argsForCall[0][0]).toContain(
      'A component is changing a controlled input of type checkbox to be uncontrolled. ' +
      'Input elements should not switch from controlled to uncontrolled (or vice versa). ' +
      'Decide between using a controlled or uncontrolled input ' +
      'element for the lifetime of the component. More info: https://fb.me/react-controlled-components'
    );
  });
  it('should warn if controlled checkbox switches to uncontrolled with defaultChecked', function() {
    var stub = <input type="checkbox" checked={true} onChange={emptyFunction} />;
    var container = document.createElement('div');
    ReactDOM.render(stub, container);
    ReactDOM.render(<input type="checkbox" defaultChecked={true} />, container);
    expect(console.error.argsForCall.length).toBe(1);
    expect(console.error.argsForCall[0][0]).toContain(
      'A component is changing a controlled input of type checkbox to be uncontrolled. ' +
      'Input elements should not switch from controlled to uncontrolled (or vice versa). ' +
      'Decide between using a controlled or uncontrolled input ' +
      'element for the lifetime of the component. More info: https://fb.me/react-controlled-components'
    );