Browse Source

Ensure ChangeListener still works after first upload. (#11936)

Fixes #10420
tags/8.11.0.alpha1
Anna Koskinen 4 years ago
parent
commit
f4dc8b2952
No account linked to committer's email address

+ 11
- 0
client/src/main/java/com/vaadin/client/ui/VUpload.java View File

@@ -40,6 +40,7 @@ import com.vaadin.client.ConnectorMap;
import com.vaadin.client.StyleConstants;
import com.vaadin.client.ui.upload.UploadConnector;
import com.vaadin.client.ui.upload.UploadIFrameOnloadStrategy;
import com.vaadin.shared.EventId;
import com.vaadin.shared.ui.upload.UploadServerRpc;

/**
@@ -264,6 +265,16 @@ public class VUpload extends SimplePanel {
if (isImmediateMode()) {
fu.sinkEvents(Event.ONCHANGE);
}
fu.addChangeHandler(event -> {
if (client != null) {
UploadConnector connector = ((UploadConnector) ConnectorMap
.get(client).getConnector(VUpload.this));
if (connector.hasEventListener(EventId.CHANGE)) {
connector.getRpcProxy(UploadServerRpc.class)
.change(fu.getFilename());
}
}
});
}

/**

+ 31
- 0
uitest/src/main/java/com/vaadin/tests/components/upload/UploadChangeListener.java View File

@@ -0,0 +1,31 @@
package com.vaadin.tests.components.upload;

import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractTestUIWithLog;
import com.vaadin.ui.Upload;

public class UploadChangeListener extends AbstractTestUIWithLog {

@Override
protected void setup(VaadinRequest request) {
Upload upload = new Upload();
upload.setImmediateMode(false);
upload.addChangeListener(e -> {
log("change");
});
upload.addFinishedListener(e -> {
log("finished");
});
addComponent(upload);
}

@Override
protected String getTestDescription() {
return "Change listener should still work after first upload.";
};

@Override
protected Integer getTicketNumber() {
return 10420;
}
}

+ 90
- 0
uitest/src/test/java/com/vaadin/tests/components/upload/UploadChangeListenerTest.java View File

@@ -0,0 +1,90 @@
package com.vaadin.tests.components.upload;

import static org.junit.Assert.assertEquals;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.internal.WrapsElement;
import org.openqa.selenium.remote.LocalFileDetector;
import org.openqa.selenium.remote.RemoteWebElement;

import com.vaadin.tests.tb3.MultiBrowserTest;

public class UploadChangeListenerTest extends MultiBrowserTest {

@Test
public void changeListenerWorksAfterFirstUpload() throws IOException {
openTestURL();
WebElement upload = findElement(By.className("v-button"));

File tempFile = createTempFile();
fillPathToUploadInput(tempFile.getPath());

assertEquals("1. change", getLogRow(0));

upload.click();

assertEquals("2. finished", getLogRow(0));

tempFile = createTempFile();
fillPathToUploadInput(tempFile.getPath());

assertEquals("3. change", getLogRow(0));
}

/**
* @return The generated temp file handle
* @throws IOException
*/
private File createTempFile() throws IOException {
File tempFile = File.createTempFile("TestFileUpload", ".txt");
BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
writer.write(getTempFileContents());
writer.close();
tempFile.deleteOnExit();
return tempFile;
}

private String getTempFileContents() {
StringBuilder sb = new StringBuilder("This is a small test file.");
sb.append("\n");
sb.append("Very small.");
return sb.toString();
}

private void fillPathToUploadInput(String tempFileName) {
// create a valid path in upload input element. Instead of selecting a
// file by some file browsing dialog, we use the local path directly.
WebElement input = getInput();
setLocalFileDetector(input);
input.sendKeys(tempFileName);
}

private WebElement getInput() {
return getDriver().findElement(By.className("gwt-FileUpload"));
}

private void setLocalFileDetector(WebElement element) {
if (getRunLocallyBrowser() != null) {
return;
}

if (element instanceof WrapsElement) {
element = ((WrapsElement) element).getWrappedElement();
}
if (element instanceof RemoteWebElement) {
((RemoteWebElement) element)
.setFileDetector(new LocalFileDetector());
} else {
throw new IllegalArgumentException(
"Expected argument of type RemoteWebElement, received "
+ element.getClass().getName());
}
}
}

Loading…
Cancel
Save