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

});
  it('should throw if both checkedLink and valueLink are provided', function() {
    var node = document.createElement('div');
    var link = new ReactLink(true, jest.fn());
    var instance = <input type="checkbox" checkedLink={link} />;
    expect(() => ReactDOM.render(instance, node)).not.toThrow();
    instance = <input type="checkbox" valueLink={link} />;
    expect(() => ReactDOM.render(instance, node)).not.toThrow();
    instance =
      <input type="checkbox" checkedLink={link} valueLink={emptyFunction} />;
    expect(() => ReactDOM.render(instance, node)).toThrow();
  });
  it('should warn if value is null', function() {
    ReactTestUtils.renderIntoDocument(<input type="text" value={null} />);
    expect(console.error.argsForCall[0][0]).toContain(
      '`value` prop on `input` should not be null. ' +
      'Consider using the empty string to clear the component or `undefined` ' +
      'for uncontrolled components.'
    );
    ReactTestUtils.renderIntoDocument(<input type="text" value={null} />);
    expect(console.error.argsForCall.length).toBe(1);
  });
  it('should warn if checked and defaultChecked props are specified', function() {
    ReactTestUtils.renderIntoDocument(
      <input type="radio" checked={true} defaultChecked={true} readOnly={true} />
    );
    expect(console.error.argsForCall[0][0]).toContain(
      'A component contains an input of type radio with both checked and defaultChecked props. ' +
      'Input elements must be either controlled or uncontrolled ' +
      '(specify either the checked prop, or the defaultChecked prop, but not ' +