summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--client/src/com/vaadin/client/ui/VUpload.java7
-rw-r--r--client/src/com/vaadin/client/ui/upload/UploadConnector.java14
-rw-r--r--server/src/com/vaadin/ui/Upload.java14
-rw-r--r--shared/src/com/vaadin/shared/ui/upload/UploadClientRpc.java26
-rw-r--r--uitest/src/com/vaadin/tests/components/upload/UploadNoSelection.java83
-rw-r--r--uitest/src/com/vaadin/tests/components/upload/UploadNoSelectionTest.java56
6 files changed, 182 insertions, 18 deletions
diff --git a/client/src/com/vaadin/client/ui/VUpload.java b/client/src/com/vaadin/client/ui/VUpload.java
index c08d75e9b7..8e55387d39 100644
--- a/client/src/com/vaadin/client/ui/VUpload.java
+++ b/client/src/com/vaadin/client/ui/VUpload.java
@@ -295,10 +295,13 @@ public class VUpload extends SimplePanel {
/** For internal use only. May be removed or replaced in the future. */
public void submit() {
- if (fu.getFilename().length() == 0 || submitted || !enabled) {
- VConsole.log("Submit cancelled (disabled, no file or already submitted)");
+ if (submitted || !enabled) {
+ VConsole.log("Submit cancelled (disabled or already submitted)");
return;
}
+ if (fu.getFilename().length() == 0) {
+ VConsole.log("Submitting empty selection (no file)");
+ }
// flush possibly pending variable changes, so they will be handled
// before upload
client.sendPendingVariableChanges();
diff --git a/client/src/com/vaadin/client/ui/upload/UploadConnector.java b/client/src/com/vaadin/client/ui/upload/UploadConnector.java
index 937ff438ac..989a913adc 100644
--- a/client/src/com/vaadin/client/ui/upload/UploadConnector.java
+++ b/client/src/com/vaadin/client/ui/upload/UploadConnector.java
@@ -22,12 +22,22 @@ import com.vaadin.client.UIDL;
import com.vaadin.client.ui.AbstractComponentConnector;
import com.vaadin.client.ui.VUpload;
import com.vaadin.shared.ui.Connect;
+import com.vaadin.shared.ui.upload.UploadClientRpc;
import com.vaadin.ui.Upload;
@Connect(Upload.class)
public class UploadConnector extends AbstractComponentConnector implements
Paintable {
+ public UploadConnector() {
+ registerRpc(UploadClientRpc.class, new UploadClientRpc() {
+ @Override
+ public void submitUpload() {
+ getWidget().submit();
+ }
+ });
+ }
+
@Override
public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
if (!isRealUpdate(uidl)) {
@@ -37,10 +47,6 @@ public class UploadConnector extends AbstractComponentConnector implements
getWidget().t.schedule(400);
return;
}
- if (uidl.hasAttribute("forceSubmit")) {
- getWidget().submit();
- return;
- }
getWidget().setImmediate(getState().immediate);
getWidget().client = client;
getWidget().paintableId = uidl.getId();
diff --git a/server/src/com/vaadin/ui/Upload.java b/server/src/com/vaadin/ui/Upload.java
index 08cabf979a..98f5d2ded9 100644
--- a/server/src/com/vaadin/ui/Upload.java
+++ b/server/src/com/vaadin/ui/Upload.java
@@ -28,6 +28,7 @@ import com.vaadin.server.NoOutputStreamException;
import com.vaadin.server.PaintException;
import com.vaadin.server.PaintTarget;
import com.vaadin.server.StreamVariable.StreamingProgressEvent;
+import com.vaadin.shared.ui.upload.UploadClientRpc;
/**
* Component for uploading files from client to server.
@@ -107,11 +108,6 @@ public class Upload extends AbstractComponent implements Component.Focusable,
private int nextid;
/**
- * Flag to indicate that submitting file has been requested.
- */
- private boolean forceSubmit;
-
- /**
* Creates a new instance of Upload.
*
* The receiver must be set before performing an upload.
@@ -157,11 +153,6 @@ public class Upload extends AbstractComponent implements Component.Focusable,
notStarted = false;
return;
}
- if (forceSubmit) {
- target.addAttribute("forceSubmit", true);
- forceSubmit = true;
- return;
- }
// The field should be focused
if (focus) {
target.addAttribute("focus", true);
@@ -1011,12 +1002,11 @@ public class Upload extends AbstractComponent implements Component.Focusable,
*/
public void submitUpload() {
markAsDirty();
- forceSubmit = true;
+ getRpcProxy(UploadClientRpc.class).submitUpload();
}
@Override
public void markAsDirty() {
- forceSubmit = false;
super.markAsDirty();
}
diff --git a/shared/src/com/vaadin/shared/ui/upload/UploadClientRpc.java b/shared/src/com/vaadin/shared/ui/upload/UploadClientRpc.java
new file mode 100644
index 0000000000..1757ddb001
--- /dev/null
+++ b/shared/src/com/vaadin/shared/ui/upload/UploadClientRpc.java
@@ -0,0 +1,26 @@
+/*
+ * 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.shared.ui.upload;
+
+import com.vaadin.shared.communication.ClientRpc;
+
+public interface UploadClientRpc extends ClientRpc {
+
+ /**
+ * Forces the upload the send selected file to the server.
+ */
+ void submitUpload();
+}
diff --git a/uitest/src/com/vaadin/tests/components/upload/UploadNoSelection.java b/uitest/src/com/vaadin/tests/components/upload/UploadNoSelection.java
new file mode 100644
index 0000000000..c304293170
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/upload/UploadNoSelection.java
@@ -0,0 +1,83 @@
+/*
+ * 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.upload;
+
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUIWithLog;
+import com.vaadin.ui.Upload;
+import com.vaadin.ui.Upload.FailedEvent;
+import com.vaadin.ui.Upload.FinishedEvent;
+import com.vaadin.ui.Upload.Receiver;
+
+public class UploadNoSelection extends AbstractTestUIWithLog implements
+ Receiver {
+
+ static final String LOG_ID_PREFIX = "Log_row_";
+ static final String UPLOAD_ID = "u";
+
+ static final String UPLOAD_FINISHED = "Upload Finished";
+ static final String RECEIVING_UPLOAD = "Receiving upload";
+
+ static final String FILE_LENGTH_PREFIX = "File length:";
+ static final String FILE_NAME_PREFIX = "File name:";
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 9602;
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Uploading an empty selection (no file) will trigger FinishedEvent with 0-length file size and empty filename.";
+ }
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ Upload u = new Upload("Upload", this);
+ u.setId(UPLOAD_ID);
+ u.setSizeUndefined();
+
+ addComponent(u);
+
+ u.addFinishedListener(new Upload.FinishedListener() {
+ @Override
+ public void uploadFinished(FinishedEvent event) {
+ log(UPLOAD_FINISHED);
+ log(FILE_LENGTH_PREFIX + " " + event.getLength());
+ log(FILE_NAME_PREFIX + " " + event.getFilename());
+ }
+ });
+ u.addFailedListener(new Upload.FailedListener() {
+
+ @Override
+ public void uploadFailed(FailedEvent event) {
+ log("Upload Failed");
+ log(FILE_LENGTH_PREFIX + " " + event.getLength());
+ log(FILE_NAME_PREFIX + " " + event.getFilename());
+ }
+ });
+ }
+
+ @Override
+ public OutputStream receiveUpload(String filename, String MIMEType) {
+ log(RECEIVING_UPLOAD);
+ return new ByteArrayOutputStream();
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/upload/UploadNoSelectionTest.java b/uitest/src/com/vaadin/tests/components/upload/UploadNoSelectionTest.java
new file mode 100644
index 0000000000..1b30c4080a
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/upload/UploadNoSelectionTest.java
@@ -0,0 +1,56 @@
+/*
+ * 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.upload;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class UploadNoSelectionTest extends MultiBrowserTest {
+
+ @Test
+ public void testUploadNoSelection() throws Exception {
+ openTestURL();
+
+ // empty content is populated by com.vaadin.tests.util.Log
+ Assert.assertEquals(" ", getLogRow(0));
+
+ getSubmitButton().click();
+
+ // expecting empty file name
+ assertLogRow(0, 4, UploadNoSelection.FILE_NAME_PREFIX);
+ // expecting 0-length file
+ assertLogRow(1, 3, UploadNoSelection.FILE_LENGTH_PREFIX + " " + 0);
+ assertLogRow(2, 2, UploadNoSelection.UPLOAD_FINISHED);
+ assertLogRow(3, 1, UploadNoSelection.RECEIVING_UPLOAD);
+ }
+
+ private WebElement getSubmitButton() {
+ WebElement element = getDriver().findElement(
+ By.id(UploadNoSelection.UPLOAD_ID));
+ WebElement submitButton = element.findElement(By.className("v-button"));
+ return submitButton;
+ }
+
+ private void assertLogRow(int index, int expentedRowNo,
+ String expectedValueWithoutRowNo) {
+ Assert.assertEquals(expentedRowNo + ". " + expectedValueWithoutRowNo,
+ getLogRow(index));
+ }
+}