diff options
author | Adam Wagner <wbadam@users.noreply.github.com> | 2017-05-19 11:22:04 +0300 |
---|---|---|
committer | Pekka Hyvönen <pekka@vaadin.com> | 2017-05-19 11:22:04 +0300 |
commit | d7142d1870bd45d5a9bb79b0d89edf3f3a5033ab (patch) | |
tree | 323c62fe400130861595ceabe1d2770a03fe5d0b /client | |
parent | ded683a75f5923274952a0a173ca09b61c834c82 (diff) | |
download | vaadin-framework-d7142d1870bd45d5a9bb79b0d89edf3f3a5033ab.tar.gz vaadin-framework-d7142d1870bd45d5a9bb79b0d89edf3f3a5033ab.zip |
Make it possible for drop target to accept both files and other data (#9382)
Diffstat (limited to 'client')
-rw-r--r-- | client/src/main/java/com/vaadin/client/extensions/DropTargetExtensionConnector.java | 54 | ||||
-rw-r--r-- | client/src/main/java/com/vaadin/client/extensions/FileDropTargetConnector.java | 6 |
2 files changed, 47 insertions, 13 deletions
diff --git a/client/src/main/java/com/vaadin/client/extensions/DropTargetExtensionConnector.java b/client/src/main/java/com/vaadin/client/extensions/DropTargetExtensionConnector.java index cd23b3bc74..cd7cc7026b 100644 --- a/client/src/main/java/com/vaadin/client/extensions/DropTargetExtensionConnector.java +++ b/client/src/main/java/com/vaadin/client/extensions/DropTargetExtensionConnector.java @@ -274,21 +274,34 @@ public class DropTargetExtensionConnector extends AbstractExtensionConnector { protected void onDrop(Event event) { NativeEvent nativeEvent = (NativeEvent) event; if (isDropAllowed(nativeEvent)) { - nativeEvent.preventDefault(); - nativeEvent.stopPropagation(); JsArrayString typesJsArray = getTypes( nativeEvent.getDataTransfer()); - List<String> types = new ArrayList<>(); - Map<String, String> data = new HashMap<>(); - for (int i = 0; i < typesJsArray.length(); i++) { - String type = typesJsArray.get(i); - types.add(type); - data.put(type, nativeEvent.getDataTransfer().getData(type)); + + /* Handle event if transfer doesn't contain files. + * + * Spec: "Dragging files can currently only happen from outside a + * browsing context, for example from a file system manager + * application." + * Thus there cannot be at the same time both files and other data + * dragged + */ + if (!containsFiles(typesJsArray)) { + nativeEvent.preventDefault(); + nativeEvent.stopPropagation(); + + List<String> types = new ArrayList<>(); + Map<String, String> data = new HashMap<>(); + for (int i = 0; i < typesJsArray.length(); i++) { + String type = typesJsArray.get(i); + types.add(type); + data.put(type, nativeEvent.getDataTransfer().getData(type)); + } + + sendDropEventToServer(types, data, DragSourceExtensionConnector + .getDropEffect(nativeEvent.getDataTransfer()), nativeEvent); } - sendDropEventToServer(types, data, DragSourceExtensionConnector - .getDropEffect(nativeEvent.getDataTransfer()), nativeEvent); } removeDragOverStyle(nativeEvent); @@ -314,6 +327,27 @@ public class DropTargetExtensionConnector extends AbstractExtensionConnector { } /** + * Tells if the given array of types contains files. + * <p> + * According to HTML specification, if any files are being dragged, {@code + * dataTransfer.types} will contain the string "Files". See + * https://html.spec.whatwg.org/multipage/interaction.html#the-datatransfer-interface:dom-datatransfer-types-2 + * + * @param types + * Array of data types. + * @return {@code} true if given array contains {@code "Files"}, {@code + * false} otherwise. + */ + private boolean containsFiles(JsArrayString types) { + for (int i = 0; i < types.length(); i++) { + if ("Files".equals(types.get(i))) { + return true; + } + } + return false; + } + + /** * Initiates a server RPC for the drop event. * * @param types diff --git a/client/src/main/java/com/vaadin/client/extensions/FileDropTargetConnector.java b/client/src/main/java/com/vaadin/client/extensions/FileDropTargetConnector.java index aba52f7e6b..142b7b2ff8 100644 --- a/client/src/main/java/com/vaadin/client/extensions/FileDropTargetConnector.java +++ b/client/src/main/java/com/vaadin/client/extensions/FileDropTargetConnector.java @@ -127,10 +127,10 @@ public class FileDropTargetConnector extends DropTargetExtensionConnector { if (fileParams.size() > 0) { getRpcProxy(FileDropTargetRpc.class).drop(fileParams); } - } - event.preventDefault(); - event.stopPropagation(); + event.preventDefault(); + event.stopPropagation(); + } } @Override |