]> source.dussan.org Git - vaadin-framework.git/commitdiff
Better error handling trying to enable HTML5 DnD for mobile from thread (#12170)...
authorAnna Koskinen <Ansku@users.noreply.github.com>
Fri, 18 Dec 2020 13:03:49 +0000 (15:03 +0200)
committerGitHub <noreply@github.com>
Fri, 18 Dec 2020 13:03:49 +0000 (15:03 +0200)
- Informative error message
- Reset back to disabled state when enabling fails
- Incorrect usage also detectable using non-mobile devices

Fixes #12152

server/src/main/java/com/vaadin/ui/UI.java
uitest/src/main/java/com/vaadin/tests/components/ui/MobileHtml5DndEnablingError.java [new file with mode: 0644]
uitest/src/test/java/com/vaadin/tests/components/ui/MobileHtml5DndEnablingErrorTest.java [new file with mode: 0644]

index 5891addca451d0fe084869e9a41fd5a6083b356b..7430c04bb9c08da2560048fbcebf615c8acd8c79 100644 (file)
@@ -1987,6 +1987,13 @@ public abstract class UI extends AbstractSingleComponentContainer
             getState().enableMobileHTML5DnD = enabled;
 
             if (isMobileHtml5DndEnabled()) {
+                if (VaadinService.getCurrentRequest() == null) {
+                    getState().enableMobileHTML5DnD = false;
+                    throw new IllegalStateException("HTML5 DnD cannot be "
+                            + "enabled for mobile devices when current "
+                            + "VaadinRequest cannot be accessed. Call this "
+                            + "method from init(VaadinRequest) to ensure access.");
+                }
                 loadMobileHtml5DndPolyfill();
             }
         }
diff --git a/uitest/src/main/java/com/vaadin/tests/components/ui/MobileHtml5DndEnablingError.java b/uitest/src/main/java/com/vaadin/tests/components/ui/MobileHtml5DndEnablingError.java
new file mode 100644 (file)
index 0000000..8742d26
--- /dev/null
@@ -0,0 +1,46 @@
+package com.vaadin.tests.components.ui;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Label;
+
+public class MobileHtml5DndEnablingError extends AbstractTestUI {
+
+    @Override
+    protected void setup(VaadinRequest request) {
+        final MobileHtml5DndEnablingError ui = MobileHtml5DndEnablingError.this;
+        new Thread() {
+            @Override
+            public void run() {
+                try {
+                    Thread.sleep(100);
+                } catch (InterruptedException e) {
+                }
+                ui.access(() -> {
+                    Label label;
+                    try {
+                        ui.setMobileHtml5DndEnabled(true);
+                        label = new Label(
+                                "If you see this, there was no error.");
+                    } catch (Exception e) {
+                        label = new Label("Error message: " + e.getMessage());
+                    }
+                    label.setId("error");
+                    label.setSizeFull();
+                    ui.addComponent(label);
+                });
+            }
+        }.start();
+    }
+
+    @Override
+    protected String getTestDescription() {
+        return "Attempting to set HTML5 DnD enabled for mobile devices from "
+                + "a thread should give an informative error message.";
+    }
+
+    @Override
+    protected Integer getTicketNumber() {
+        return 12152;
+    }
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/components/ui/MobileHtml5DndEnablingErrorTest.java b/uitest/src/test/java/com/vaadin/tests/components/ui/MobileHtml5DndEnablingErrorTest.java
new file mode 100644 (file)
index 0000000..b549c63
--- /dev/null
@@ -0,0 +1,19 @@
+package com.vaadin.tests.components.ui;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.LabelElement;
+import com.vaadin.tests.tb3.SingleBrowserTest;
+
+public class MobileHtml5DndEnablingErrorTest extends SingleBrowserTest {
+
+    @Test
+    public void testErrorMessage() {
+        openTestURL();
+        LabelElement label = $(LabelElement.class).id("error");
+        assertTrue("Unexpected Label content: " + label.getText(),
+                label.getText().startsWith("Error message: HTML5 DnD cannot"));
+    }
+}