@@ -73,6 +73,21 @@ describe('ReactDOMInput', function() {
73
73
expect ( node . defaultValue ) . toBe ( '1' ) ;
74
74
} ) ;
75
75
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
+
76
91
it ( 'should take `defaultValue` when changing to uncontrolled input' , function ( ) {
77
92
var container = document . createElement ( 'div' ) ;
78
93
@@ -781,4 +796,42 @@ describe('ReactDOMInput', function() {
781
796
expect ( node . value ) . toEqual ( 'Test' ) ;
782
797
} ) ;
783
798
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
+ } ) ;
784
837
} ) ;
0 commit comments