Skip to content

Commit 65a194e

Browse files
feat: Fix Firefox Drag'n'Drop Functionality (#294)
* Add isBrowserFirefox lib util * Extract subject type logic into un-exported helper method
1 parent fd4e873 commit 65a194e

File tree

3 files changed

+26
-5
lines changed

3 files changed

+26
-5
lines changed

lib/browser/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
// eslint-disable-next-line import/prefer-default-export
21
export { default as isManualEventHandling } from './isManualEventHandling';
2+
export { default as isBrowserFirefox } from './isBrowserFirefox';

lib/browser/isBrowserFirefox.js

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
const BROWSER_FIREFOX = 'firefox';
2+
3+
export default function isBrowserFirefox() {
4+
const { name } = Cypress.browser;
5+
6+
return name === BROWSER_FIREFOX;
7+
}

src/helpers/attachFileToElement.js

+18-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,26 @@
11
import { dispatchEvent } from '../../lib/dom';
2-
import { SUBJECT_TYPE, EVENTS_BY_SUBJECT_TYPE } from '../constants';
2+
import { EVENTS_BY_SUBJECT_TYPE, SUBJECT_TYPE } from '../constants';
3+
import { isBrowserFirefox } from '../../lib/browser';
34

45
function dispatchEvents(element, events, dataTransfer) {
56
events.forEach(event => {
67
dispatchEvent(element, event, dataTransfer);
78
});
89
}
910

11+
function getEventsBySubjectType(subjectType) {
12+
const events = EVENTS_BY_SUBJECT_TYPE[subjectType];
13+
14+
/**
15+
* @see https://github.com/abramenal/cypress-file-upload/issues/293
16+
*/
17+
if (subjectType === SUBJECT_TYPE.DRAG_N_DROP && isBrowserFirefox()) {
18+
events.push('change');
19+
}
20+
21+
return events;
22+
}
23+
1024
export default function attachFileToElement(subject, { files, subjectType, force, window }) {
1125
const dataTransfer = new window.DataTransfer();
1226
files.forEach(f => dataTransfer.items.add(f));
@@ -16,7 +30,7 @@ export default function attachFileToElement(subject, { files, subjectType, force
1630
inputElement.files = dataTransfer.files;
1731

1832
if (force) {
19-
dispatchEvents(inputElement, EVENTS_BY_SUBJECT_TYPE[subjectType], dataTransfer);
33+
dispatchEvents(inputElement, getEventsBySubjectType(subjectType), dataTransfer);
2034
}
2135
} else if (subjectType === SUBJECT_TYPE.DRAG_N_DROP) {
2236
const inputElements = subject[0].querySelectorAll('input[type="file"]');
@@ -30,14 +44,14 @@ export default function attachFileToElement(subject, { files, subjectType, force
3044
inputElement.files = dataTransfer.files;
3145

3246
if (force) {
33-
dispatchEvents(inputElement, EVENTS_BY_SUBJECT_TYPE[subjectType], dataTransfer);
47+
dispatchEvents(inputElement, getEventsBySubjectType(subjectType), dataTransfer);
3448
}
3549
} else {
3650
const inputElement = subject[0];
3751
inputElement.files = dataTransfer.files;
3852

3953
if (force) {
40-
dispatchEvents(inputElement, EVENTS_BY_SUBJECT_TYPE[subjectType], dataTransfer);
54+
dispatchEvents(inputElement, getEventsBySubjectType(subjectType), dataTransfer);
4155
}
4256
}
4357
}

0 commit comments

Comments
 (0)