@@ -73,6 +73,21 @@ describe('ReactDOMInput', function() {
7373 expect ( node . defaultValue ) . toBe ( '1' ) ;
7474 } ) ;
7575
76+ it ( 'should update `defaultValue` for uncontrolled date/time input' , function ( ) {
77+ var container = document . createElement ( 'div' ) ;
78+
79+ var node = ReactDOM . render ( < input type = "date" defaultValue = "1980-01-01" /> , container ) ;
80+
81+ expect ( node . value ) . toBe ( '1980-01-01' ) ;
82+
83+ ReactDOM . render ( < input type = "date" defaultValue = "2000-01-01" /> , container ) ;
84+
85+ expect ( node . value ) . toBe ( '1980-01-01' ) ;
86+ expect ( node . defaultValue ) . toBe ( '2000-01-01' ) ;
87+
88+ ReactDOM . render ( < input type = "date" /> , container ) ;
89+ } ) ;
90+
7691 it ( 'should take `defaultValue` when changing to uncontrolled input' , function ( ) {
7792 var container = document . createElement ( 'div' ) ;
7893
@@ -781,4 +796,42 @@ describe('ReactDOMInput', function() {
781796 expect ( node . value ) . toEqual ( 'Test' ) ;
782797 } ) ;
783798
799+ it ( 'resets value of date/time input to fix bugs in iOS Safari' , function ( ) {
800+ // https://github.com/facebook/react/issues/7233
801+ if ( ! ReactDOMFeatureFlags . useCreateElement ) {
802+ return ;
803+ }
804+
805+ function strify ( x ) {
806+ return JSON . stringify ( x , null , 2 ) ;
807+ }
808+
809+ var log = [ ] ;
810+ var originalCreateElement = document . createElement ;
811+ spyOn ( document , 'createElement' ) . and . callFake ( function ( type ) {
812+ var el = originalCreateElement . apply ( this , arguments ) ;
813+ if ( type === 'input' ) {
814+ Object . defineProperty ( el , 'value' , {
815+ set : function ( val ) {
816+ log . push ( `node.value = ${ strify ( val ) } ` ) ;
817+ } ,
818+ } ) ;
819+ spyOn ( el , 'setAttribute' ) . and . callFake ( function ( name , val ) {
820+ log . push ( `node.setAttribute(${ strify ( name ) } , ${ strify ( val ) } )` ) ;
821+ } ) ;
822+ }
823+ return el ;
824+ } ) ;
825+
826+ ReactTestUtils . renderIntoDocument ( < input type = "date" defaultValue = "1980-01-01" /> ) ;
827+ expect ( log ) . toEqual ( [
828+ 'node.setAttribute("data-reactroot", "")' ,
829+ 'node.setAttribute("type", "date")' ,
830+ 'node.setAttribute("value", "1980-01-01")' ,
831+ 'node.value = ""' ,
832+ 'node.value = ""' ,
833+ 'node.setAttribute("checked", "")' ,
834+ 'node.setAttribute("checked", "")' ,
835+ ] ) ;
836+ } ) ;
784837} ) ;
0 commit comments