diff --git a/src/AjaxUploader.tsx b/src/AjaxUploader.tsx index 7d10882e..e8fca7b8 100644 --- a/src/AjaxUploader.tsx +++ b/src/AjaxUploader.tsx @@ -67,8 +67,6 @@ class AjaxUploader extends Component { }; onFileDropOrPaste = async (e: React.DragEvent | ClipboardEvent) => { - e.preventDefault(); - if (e.type === 'dragover') { return; } @@ -87,6 +85,10 @@ class AjaxUploader extends Component { files = [...(clipboardData.files || [])]; } + if (files.length > 0 || items.some(item => item.kind === 'file')) { + e.preventDefault(); + } + if (directory) { files = await traverseFileTree(Array.prototype.slice.call(items), (_file: RcFile) => attrAccept(_file, this.props.accept), diff --git a/tests/uploader.spec.tsx b/tests/uploader.spec.tsx index a1c22fa7..5ba2a930 100644 --- a/tests/uploader.spec.tsx +++ b/tests/uploader.spec.tsx @@ -488,6 +488,42 @@ describe('uploader', () => { fireEvent.change(input, { target: { files } }); }); + + it('should call preventDefault when paste contains files', () => { + const { container } = render(); + const input = container.querySelector('input')!; + + const files = [new File([''], 'test.png', { type: 'image/png' })]; + + const preventDefaultSpy = jest.spyOn(Event.prototype, 'preventDefault'); + + fireEvent.paste(input, { + clipboardData: { + items: [{ kind: 'file' }], + files, + }, + }); + + expect(preventDefaultSpy).toHaveBeenCalledTimes(1); + preventDefaultSpy.mockRestore(); + }); + + it('should not call preventDefault when paste contains no files', () => { + const { container } = render(); + const input = container.querySelector('input')!; + + const preventDefaultSpy = jest.spyOn(Event.prototype, 'preventDefault'); + + fireEvent.paste(input, { + clipboardData: { + items: [{ kind: 'string' }], + files: [], + }, + }); + + expect(preventDefaultSpy).toHaveBeenCalledTimes(0); + preventDefaultSpy.mockRestore(); + }); }); describe('directory uploader', () => {