summaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorAdam Wagner <wbadam@users.noreply.github.com>2017-05-19 11:22:04 +0300
committerPekka Hyvönen <pekka@vaadin.com>2017-05-19 11:22:04 +0300
commitd7142d1870bd45d5a9bb79b0d89edf3f3a5033ab (patch)
tree323c62fe400130861595ceabe1d2770a03fe5d0b /client
parentded683a75f5923274952a0a173ca09b61c834c82 (diff)
downloadvaadin-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.java54
-rw-r--r--client/src/main/java/com/vaadin/client/extensions/FileDropTargetConnector.java6
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