Skip to content

Commit

Permalink
feat: Fix Firefox Drag'n'Drop Functionality (#294)
Browse files Browse the repository at this point in the history
* Add isBrowserFirefox lib util

* Extract subject type logic into un-exported helper method
  • Loading branch information
michaeljaltamirano committed Apr 15, 2021
1 parent fd4e873 commit 65a194e
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 5 deletions.
2 changes: 1 addition & 1 deletion lib/browser/index.js
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
// eslint-disable-next-line import/prefer-default-export
export { default as isManualEventHandling } from './isManualEventHandling';
export { default as isBrowserFirefox } from './isBrowserFirefox';
7 changes: 7 additions & 0 deletions lib/browser/isBrowserFirefox.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const BROWSER_FIREFOX = 'firefox';

export default function isBrowserFirefox() {
const { name } = Cypress.browser;

return name === BROWSER_FIREFOX;
}
22 changes: 18 additions & 4 deletions src/helpers/attachFileToElement.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,26 @@
import { dispatchEvent } from '../../lib/dom';
import { SUBJECT_TYPE, EVENTS_BY_SUBJECT_TYPE } from '../constants';
import { EVENTS_BY_SUBJECT_TYPE, SUBJECT_TYPE } from '../constants';
import { isBrowserFirefox } from '../../lib/browser';

function dispatchEvents(element, events, dataTransfer) {
events.forEach(event => {
dispatchEvent(element, event, dataTransfer);
});
}

function getEventsBySubjectType(subjectType) {
const events = EVENTS_BY_SUBJECT_TYPE[subjectType];

/**
* @see https://github.com/abramenal/cypress-file-upload/issues/293
*/
if (subjectType === SUBJECT_TYPE.DRAG_N_DROP && isBrowserFirefox()) {
events.push('change');
}

return events;
}

export default function attachFileToElement(subject, { files, subjectType, force, window }) {
const dataTransfer = new window.DataTransfer();
files.forEach(f => dataTransfer.items.add(f));
Expand All @@ -16,7 +30,7 @@ export default function attachFileToElement(subject, { files, subjectType, force
inputElement.files = dataTransfer.files;

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

if (force) {
dispatchEvents(inputElement, EVENTS_BY_SUBJECT_TYPE[subjectType], dataTransfer);
dispatchEvents(inputElement, getEventsBySubjectType(subjectType), dataTransfer);
}
} else {
const inputElement = subject[0];
inputElement.files = dataTransfer.files;

if (force) {
dispatchEvents(inputElement, EVENTS_BY_SUBJECT_TYPE[subjectType], dataTransfer);
dispatchEvents(inputElement, getEventsBySubjectType(subjectType), dataTransfer);
}
}
}
Expand Down

0 comments on commit 65a194e

Please sign in to comment.