Просмотр исходного кода

Upload control with empty selection (#9602)

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: Id32b82532ec34e61a9c0718413fd1755015d2c30
tags/7.1.10
Tomi Virtanen 10 лет назад
Родитель
Сommit
0579fba630

+ 5
- 2
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();

+ 10
- 4
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();

+ 2
- 12
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.
@@ -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();
}


+ 26
- 0
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();
}

+ 83
- 0
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();
}

}

+ 56
- 0
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));
}
}

Загрузка…
Отмена
Сохранить