summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Anisimov <denis@vaadin.com>2014-04-27 18:59:51 +0300
committerLeif Åstrand <leif@vaadin.com>2014-04-28 16:50:08 +0000
commit43a2943572b594402230fb6ceaa1d565e8e4d636 (patch)
treedfcc2704ee28460d17402fc140c9149a607d1ad1
parent0897607042fe8da4c20d02ae47d1ac0b326f243d (diff)
downloadvaadin-framework-43a2943572b594402230fb6ceaa1d565e8e4d636.tar.gz
vaadin-framework-43a2943572b594402230fb6ceaa1d565e8e4d636.zip
Avoid client side exception on DnD for empty table (#13655).
Change-Id: I71c18e87760ecbff34cfe215f56390fd75f3e55c
-rw-r--r--client/src/com/vaadin/client/ui/VScrollTable.java13
-rw-r--r--uitest/src/com/vaadin/tests/components/table/DndEmptyTable.java71
-rw-r--r--uitest/src/com/vaadin/tests/components/table/DndEmptyTableTest.java49
3 files changed, 131 insertions, 2 deletions
diff --git a/client/src/com/vaadin/client/ui/VScrollTable.java b/client/src/com/vaadin/client/ui/VScrollTable.java
index 6f575ca1c0..38f8ff8644 100644
--- a/client/src/com/vaadin/client/ui/VScrollTable.java
+++ b/client/src/com/vaadin/client/ui/VScrollTable.java
@@ -7101,7 +7101,11 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
dropDetails = new TableDDDetails();
Element elementOver = drag.getElementOver();
- VScrollTableRow row = Util.findWidget(elementOver, getRowClass());
+ Class<? extends Widget> clazz = getRowClass();
+ VScrollTableRow row = null;
+ if (clazz != null) {
+ row = Util.findWidget(elementOver, clazz);
+ }
if (row != null) {
dropDetails.overkey = row.rowKey;
Element tr = row.getElement();
@@ -7127,7 +7131,12 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
private Class<? extends Widget> getRowClass() {
// get the row type this way to make dd work in derived
// implementations
- return scrollBody.iterator().next().getClass();
+ Iterator<Widget> iterator = scrollBody.iterator();
+ if (iterator.hasNext()) {
+ return iterator.next().getClass();
+ } else {
+ return null;
+ }
}
@Override
diff --git a/uitest/src/com/vaadin/tests/components/table/DndEmptyTable.java b/uitest/src/com/vaadin/tests/components/table/DndEmptyTable.java
new file mode 100644
index 0000000000..baac7ce057
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/table/DndEmptyTable.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.table;
+
+import com.vaadin.event.dd.DragAndDropEvent;
+import com.vaadin.event.dd.DropHandler;
+import com.vaadin.event.dd.acceptcriteria.AcceptAll;
+import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.DragAndDropWrapper;
+import com.vaadin.ui.DragAndDropWrapper.DragStartMode;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.Table;
+
+/**
+ * Test UI for empty table: empty table (without any data) throws client side
+ * exception if it's a target for DnD.
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class DndEmptyTable extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ Label source = new Label("label");
+ DragAndDropWrapper wrapper = new DragAndDropWrapper(source);
+ wrapper.setDragStartMode(DragStartMode.WRAPPER);
+ addComponent(wrapper);
+
+ Table target = new Table();
+ target.setWidth(100, Unit.PERCENTAGE);
+ addComponent(target);
+ target.setDropHandler(new DropHandler() {
+
+ @Override
+ public AcceptCriterion getAcceptCriterion() {
+ return AcceptAll.get();
+ }
+
+ @Override
+ public void drop(DragAndDropEvent event) {
+ }
+ });
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Drag and drop into empty table should not throws client side exception.";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 13655;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/table/DndEmptyTableTest.java b/uitest/src/com/vaadin/tests/components/table/DndEmptyTableTest.java
new file mode 100644
index 0000000000..4c682637b1
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/table/DndEmptyTableTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.table;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.interactions.Actions;
+
+import com.vaadin.testbench.By;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ * Test for empty table as a DnD target: it should not throws client side
+ * exception.
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class DndEmptyTableTest extends MultiBrowserTest {
+
+ @Test
+ public void testDndEmptyTable() {
+ setDebug(true);
+ openTestURL();
+
+ WebElement source = driver.findElement(By.className("v-ddwrapper"));
+ WebElement target = driver.findElement(By.className("v-table-body"));
+ Actions actions = new Actions(driver);
+ actions.clickAndHold(source).moveToElement(target).release();
+
+ Assert.assertFalse(isElementPresent(By
+ .className("v-Notification-error")));
+ }
+
+}