Event is now sent on submit even if no file is selected. Removed forceSubmit UIDL attribute and replaced it with a UploadClientRpc call. Added TestBench3 test. Change-Id: Id32b82532ec34e61a9c0718413fd1755015d2c30tags/7.1.10
@@ -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(); |
@@ -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(); |
@@ -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. | |||
@@ -106,11 +107,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. | |||
* | |||
@@ -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(); | |||
} | |||
@@ -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(); | |||
} |
@@ -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(); | |||
} | |||
} |
@@ -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)); | |||
} | |||
} |