@@ -37,6 +37,42 @@ describe('TextArea', () => {
37
37
jest . useRealTimers ( ) ;
38
38
} ) ;
39
39
40
+ it ( 'paste text should change cursor position' , async ( ) => {
41
+ const { container } = render (
42
+ < TextArea autoSize = { { minRows : 2 , maxRows : 6 } } /> ,
43
+ ) ;
44
+ const textArea = container . querySelector ( 'textarea' ) as HTMLTextAreaElement ;
45
+ // 监听事件绑定和移除
46
+ const pasteData = 'pasted text\n' . repeat ( 10 ) ;
47
+ const clipboardData = {
48
+ getData : jest . fn ( ) . mockReturnValue ( pasteData ) ,
49
+ } ;
50
+
51
+ const pasteEvent = async ( ) => {
52
+ fireEvent . focus ( textArea ) ;
53
+
54
+ fireEvent . paste ( textArea , {
55
+ clipboardData,
56
+ types : [ 'text/plain' ] ,
57
+ items : [ ] ,
58
+ } ) ;
59
+
60
+ fireEvent . change ( textArea , { target : { value : pasteData } } ) ;
61
+ textArea . setSelectionRange ( pasteData . length , pasteData . length ) ;
62
+
63
+ await wait ( ) ;
64
+ expect ( textArea . selectionStart ) . toBe ( pasteData . length ) ;
65
+ expect ( textArea . selectionEnd ) . toBe ( pasteData . length ) ;
66
+ fireEvent . change ( textArea , { target : { value : '' } } ) ;
67
+ await wait ( ) ;
68
+ expect ( textArea . selectionStart ) . toBe ( 0 ) ;
69
+ expect ( textArea . selectionEnd ) . toBe ( 0 ) ;
70
+ } ;
71
+
72
+ await pasteEvent ( ) ;
73
+ await pasteEvent ( ) ;
74
+ } ) ;
75
+
40
76
it ( 'should work correctly on controlled mode' , ( ) => {
41
77
const Demo = ( ) => {
42
78
const [ value , setValue ] = React . useState ( '111' ) ;
@@ -235,18 +271,23 @@ describe('TextArea', () => {
235
271
container . querySelector ( 'textarea' ) . focus ( ) ;
236
272
expect ( document . activeElement ) . toBe ( container . querySelector ( 'textarea' ) ) ;
237
273
238
- const setSelectionRangeFn = jest . spyOn (
239
- container . querySelector ( 'textarea' ) ,
240
- 'setSelectionRange' ,
241
- ) ;
274
+ // https://github.com/ant-design/ant-design/issues/54444
275
+ // Other browsers may have cursor position issues when calling setSelectionRange, so we do not call it here.
276
+ // const setSelectionRangeFn = jest.spyOn(
277
+ // container.querySelector('textarea'),
278
+ // 'setSelectionRange',
279
+ // );
242
280
243
281
fireEvent . change ( container . querySelector ( 'textarea' ) , {
244
282
target : { value : '\n1' } ,
245
283
} ) ;
246
284
247
285
await wait ( ) ;
248
286
249
- expect ( setSelectionRangeFn ) . toHaveBeenCalled ( ) ;
287
+ // expect(setSelectionRangeFn).toHaveBeenCalled();
288
+ expect ( container . querySelector ( 'textarea' ) . scrollTop ) . toBe (
289
+ container . querySelector ( 'textarea' ) . scrollHeight ,
290
+ ) ;
250
291
unmount ( ) ;
251
292
} ) ;
252
293
0 commit comments