summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--WebContent/VAADIN/themes/tests-components/styles.css7
-rw-r--r--WebContent/VAADIN/themes/tests-tickets/styles.css10
-rw-r--r--client/src/com/vaadin/client/ui/AbstractComponentConnector.java17
-rw-r--r--server/build.xml2
-rw-r--r--server/src/com/vaadin/server/AbstractCommunicationManager.java71
-rw-r--r--server/src/com/vaadin/ui/ConnectorTracker.java115
-rw-r--r--server/src/com/vaadin/ui/Form.java29
-rw-r--r--server/tests/src/com/vaadin/tests/server/TestStreamVariableMapping.java12
-rw-r--r--uitest/src/com/vaadin/tests/components/AbstractComponentTest.java6
-rw-r--r--uitest/src/com/vaadin/tests/components/customfield/BooleanFieldExample.java1
-rw-r--r--uitest/src/com/vaadin/tests/components/datefield/DateFieldInSubWindow.java1
-rw-r--r--uitest/src/com/vaadin/tests/components/form/FormClearDatasourceRepaint.java1
-rw-r--r--uitest/src/com/vaadin/tests/components/form/FormCommitWithInvalidValues.java1
-rw-r--r--uitest/src/com/vaadin/tests/components/ui/IdOverrideTest.html64
-rw-r--r--uitest/src/com/vaadin/tests/components/ui/IdOverrideTest.java73
-rw-r--r--uitest/src/com/vaadin/tests/components/ui/MultipleUIUploadTest.java118
-rw-r--r--uitest/src/com/vaadin/tests/components/window/UndefinedHeightSubWindowAndContent.java1
-rw-r--r--uitest/src/com/vaadin/tests/validation/EmptyFieldErrorIndicators.java1
-rw-r--r--uitest/src/com/vaadin/tests/widgetset/client/IdTestLabelConnector.java18
-rw-r--r--uitest/src/com/vaadin/tests/widgetset/client/VIdTestLabel.java15
-rw-r--r--uitest/src/com/vaadin/tests/widgetset/server/IdTestLabel.java16
21 files changed, 492 insertions, 87 deletions
diff --git a/WebContent/VAADIN/themes/tests-components/styles.css b/WebContent/VAADIN/themes/tests-components/styles.css
index 5b41f1824f..0680e2b472 100644
--- a/WebContent/VAADIN/themes/tests-components/styles.css
+++ b/WebContent/VAADIN/themes/tests-components/styles.css
@@ -53,4 +53,11 @@
box-shadow: inset 0 1px 2px rgba(0,0,0,.2);
border-radius: .5em;
background: rgba(0,0,0,.02);
+}
+
+.displaynone {
+ height: 0;
+ width: 0;
+ display: none;
+}
} \ No newline at end of file
diff --git a/WebContent/VAADIN/themes/tests-tickets/styles.css b/WebContent/VAADIN/themes/tests-tickets/styles.css
index 2bd6536e49..c1dd89d6b8 100644
--- a/WebContent/VAADIN/themes/tests-tickets/styles.css
+++ b/WebContent/VAADIN/themes/tests-tickets/styles.css
@@ -316,6 +316,16 @@
border-left: 10px solid blue;
}
+/*****************************************************************************/
+/* Ticket 10179
+/*****************************************************************************/
+#default10179 {
+ color:red;
+}
+
+#set10179 {
+ color:blue;
+}
/*****************************************************************************/
/* The reference screenshots all have a white background */
diff --git a/client/src/com/vaadin/client/ui/AbstractComponentConnector.java b/client/src/com/vaadin/client/ui/AbstractComponentConnector.java
index 16b5adef81..d11be76a80 100644
--- a/client/src/com/vaadin/client/ui/AbstractComponentConnector.java
+++ b/client/src/com/vaadin/client/ui/AbstractComponentConnector.java
@@ -17,6 +17,7 @@ package com.vaadin.client.ui;
import java.util.ArrayList;
import java.util.List;
+import java.util.Set;
import com.google.gwt.dom.client.Element;
import com.google.gwt.user.client.ui.Focusable;
@@ -53,6 +54,8 @@ public abstract class AbstractComponentConnector extends AbstractConnector
private String lastKnownWidth = "";
private String lastKnownHeight = "";
+ private boolean initialStateEvent = true;
+
/**
* The style names from getState().getStyles() which are currently applied
* to the widget.
@@ -123,11 +126,13 @@ public abstract class AbstractComponentConnector extends AbstractConnector
public void onStateChanged(StateChangeEvent stateChangeEvent) {
ConnectorMap paintableMap = ConnectorMap.get(getConnection());
- if (getState().id != null) {
- getWidget().getElement().setId(getState().id);
- } else {
- getWidget().getElement().removeAttribute("id");
-
+ Set<String> changedProperties = stateChangeEvent.getChangedProperties();
+ if (changedProperties.contains("id")) {
+ if (getState().id != null) {
+ getWidget().getElement().setId(getState().id);
+ } else if (!initialStateEvent) {
+ getWidget().getElement().removeAttribute("id");
+ }
}
/*
@@ -164,6 +169,8 @@ public abstract class AbstractComponentConnector extends AbstractConnector
*/
updateComponentSize();
+
+ initialStateEvent = false;
}
@Override
diff --git a/server/build.xml b/server/build.xml
index d6b6d7b38c..6c61b7dc75 100644
--- a/server/build.xml
+++ b/server/build.xml
@@ -23,7 +23,7 @@
</union>
<target name="jar">
- <property name="server.osgi.import" value="javax.servlet;version=&quot;2.4.0&quot;,javax.servlet.http;version=&quot;2.4.0&quot;,org.jsoup;version=&quot;1.6.3&quot;,org.jsoup.parser;version=&quot;1.6.3&quot;,org.jsoup.nodes;version=&quot;1.6.3&quot;,org.jsoup.helper;version=&quot;1.6.3&quot;,org.jsoup.safety;version=&quot;1.6.3&quot;,org.json;version=&quot;20080701&quot;" />
+ <property name="server.osgi.import" value="javax.servlet;version=&quot;2.4.0&quot;,javax.servlet.http;version=&quot;2.4.0&quot;,org.jsoup;version=&quot;1.6.3&quot;,org.jsoup.parser;version=&quot;1.6.3&quot;,org.jsoup.nodes;version=&quot;1.6.3&quot;,org.jsoup.helper;version=&quot;1.6.3&quot;,org.jsoup.safety;version=&quot;1.6.3&quot;,org.json;version=&quot;0.0.20080701&quot;" />
<antcall target="common.jar">
<param name="require-bundle" value="com.vaadin.shared;bundle-version=&quot;${vaadin.version}&quot;"/>
<param name="import-package" value="${server.osgi.import}" />
diff --git a/server/src/com/vaadin/server/AbstractCommunicationManager.java b/server/src/com/vaadin/server/AbstractCommunicationManager.java
index 0a3dff8120..af9118547f 100644
--- a/server/src/com/vaadin/server/AbstractCommunicationManager.java
+++ b/server/src/com/vaadin/server/AbstractCommunicationManager.java
@@ -165,10 +165,6 @@ public abstract class AbstractCommunicationManager implements Serializable {
private Map<String, Class<?>> publishedFileContexts = new HashMap<String, Class<?>>();
- private Map<String, Map<String, StreamVariable>> pidToNameToStreamVariable;
-
- private Map<StreamVariable, String> streamVariableToSeckey;
-
/**
* TODO New constructor - document me!
*
@@ -644,23 +640,6 @@ public abstract class AbstractCommunicationManager implements Serializable {
// Remove connectors that have been detached from the session during
// handling of the request
uI.getConnectorTracker().cleanConnectorMap();
-
- if (pidToNameToStreamVariable != null) {
- Iterator<String> iterator = pidToNameToStreamVariable.keySet()
- .iterator();
- while (iterator.hasNext()) {
- String connectorId = iterator.next();
- if (uI.getConnectorTracker().getConnector(connectorId) == null) {
- // Owner is no longer attached to the session
- Map<String, StreamVariable> removed = pidToNameToStreamVariable
- .get(connectorId);
- for (String key : removed.keySet()) {
- streamVariableToSeckey.remove(removed.get(key));
- }
- iterator.remove();
- }
- }
- }
}
protected void highlightConnector(ClientConnector highlightedConnector) {
@@ -2269,28 +2248,13 @@ public abstract class AbstractCommunicationManager implements Serializable {
* handling post
*/
String paintableId = owner.getConnectorId();
- int uiId = owner.getUI().getUIId();
+ UI ui = owner.getUI();
+ int uiId = ui.getUIId();
String key = uiId + "/" + paintableId + "/" + name;
- if (pidToNameToStreamVariable == null) {
- pidToNameToStreamVariable = new HashMap<String, Map<String, StreamVariable>>();
- }
- Map<String, StreamVariable> nameToStreamVariable = pidToNameToStreamVariable
- .get(paintableId);
- if (nameToStreamVariable == null) {
- nameToStreamVariable = new HashMap<String, StreamVariable>();
- pidToNameToStreamVariable.put(paintableId, nameToStreamVariable);
- }
- nameToStreamVariable.put(name, value);
-
- if (streamVariableToSeckey == null) {
- streamVariableToSeckey = new HashMap<StreamVariable, String>();
- }
- String seckey = streamVariableToSeckey.get(value);
- if (seckey == null) {
- seckey = UUID.randomUUID().toString();
- streamVariableToSeckey.put(value, seckey);
- }
+ ConnectorTracker connectorTracker = ui.getConnectorTracker();
+ connectorTracker.addStreamVariable(paintableId, name, value);
+ String seckey = connectorTracker.getSeckey(value);
return ApplicationConstants.APP_PROTOCOL_PREFIX
+ ServletPortletHelper.UPLOAD_URL_PREFIX + key + "/" + seckey;
@@ -2298,12 +2262,8 @@ public abstract class AbstractCommunicationManager implements Serializable {
}
public void cleanStreamVariable(ClientConnector owner, String name) {
- Map<String, StreamVariable> nameToStreamVar = pidToNameToStreamVariable
- .get(owner.getConnectorId());
- nameToStreamVar.remove(name);
- if (nameToStreamVar.isEmpty()) {
- pidToNameToStreamVariable.remove(owner.getConnectorId());
- }
+ owner.getUI().getConnectorTracker()
+ .cleanStreamVariable(owner.getConnectorId(), name);
}
/**
@@ -2683,9 +2643,9 @@ public abstract class AbstractCommunicationManager implements Serializable {
UI uI = session.getUIById(Integer.parseInt(uiId));
UI.setCurrent(uI);
- StreamVariable streamVariable = getStreamVariable(connectorId,
- variableName);
- String secKey = streamVariableToSeckey.get(streamVariable);
+ StreamVariable streamVariable = uI.getConnectorTracker()
+ .getStreamVariable(connectorId, variableName);
+ String secKey = uI.getConnectorTracker().getSeckey(streamVariable);
if (secKey.equals(parts[3])) {
ClientConnector source = getConnector(uI, connectorId);
@@ -2741,17 +2701,6 @@ public abstract class AbstractCommunicationManager implements Serializable {
}
}
- public StreamVariable getStreamVariable(String connectorId,
- String variableName) {
- Map<String, StreamVariable> map = pidToNameToStreamVariable
- .get(connectorId);
- if (map == null) {
- return null;
- }
- StreamVariable streamVariable = map.get(variableName);
- return streamVariable;
- }
-
/**
* Stream that extracts content from another stream until the boundary
* string is encountered.
diff --git a/server/src/com/vaadin/ui/ConnectorTracker.java b/server/src/com/vaadin/ui/ConnectorTracker.java
index 8b1a940c4b..91f9ac451c 100644
--- a/server/src/com/vaadin/ui/ConnectorTracker.java
+++ b/server/src/com/vaadin/ui/ConnectorTracker.java
@@ -23,6 +23,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
+import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -33,6 +34,7 @@ import com.vaadin.server.AbstractClientConnector;
import com.vaadin.server.AbstractCommunicationManager;
import com.vaadin.server.ClientConnector;
import com.vaadin.server.GlobalResourceHandler;
+import com.vaadin.server.StreamVariable;
/**
* A class which takes care of book keeping of {@link ClientConnector}s for a
@@ -65,6 +67,11 @@ public class ConnectorTracker implements Serializable {
private UI uI;
private transient Map<ClientConnector, JSONObject> diffStates = new HashMap<ClientConnector, JSONObject>();
+ /** Maps connectorIds to a map of named StreamVariables */
+ private Map<String, Map<String, StreamVariable>> pidToNameToStreamVariable;
+
+ private Map<StreamVariable, String> streamVariableToSeckey;
+
/**
* Gets a logger for this class
*
@@ -259,6 +266,7 @@ public class ConnectorTracker implements Serializable {
}
}
+ cleanStreamVariables();
}
/**
@@ -497,4 +505,111 @@ public class ConnectorTracker implements Serializable {
}
}
+
+ /**
+ * Checks if the indicated connector has a StreamVariable of the given name
+ * and returns the variable if one is found.
+ *
+ * @param connectorId
+ * @param variableName
+ * @return variable if a matching one exists, otherwise null
+ */
+ public StreamVariable getStreamVariable(String connectorId,
+ String variableName) {
+ if (pidToNameToStreamVariable == null) {
+ return null;
+ }
+ Map<String, StreamVariable> map = pidToNameToStreamVariable
+ .get(connectorId);
+ if (map == null) {
+ return null;
+ }
+ StreamVariable streamVariable = map.get(variableName);
+ return streamVariable;
+ }
+
+ /**
+ * Adds a StreamVariable of the given name to the indicated connector.
+ *
+ * @param connectorId
+ * @param variableName
+ * @param variable
+ */
+ public void addStreamVariable(String connectorId, String variableName,
+ StreamVariable variable) {
+ if (pidToNameToStreamVariable == null) {
+ pidToNameToStreamVariable = new HashMap<String, Map<String, StreamVariable>>();
+ }
+ Map<String, StreamVariable> nameToStreamVariable = pidToNameToStreamVariable
+ .get(connectorId);
+ if (nameToStreamVariable == null) {
+ nameToStreamVariable = new HashMap<String, StreamVariable>();
+ pidToNameToStreamVariable.put(connectorId, nameToStreamVariable);
+ }
+ nameToStreamVariable.put(variableName, variable);
+
+ if (streamVariableToSeckey == null) {
+ streamVariableToSeckey = new HashMap<StreamVariable, String>();
+ }
+ String seckey = streamVariableToSeckey.get(variable);
+ if (seckey == null) {
+ seckey = UUID.randomUUID().toString();
+ streamVariableToSeckey.put(variable, seckey);
+ }
+ }
+
+ /**
+ * Removes StreamVariables that belong to connectors that are no longer
+ * attached to the session.
+ */
+ private void cleanStreamVariables() {
+ if (pidToNameToStreamVariable != null) {
+ Iterator<String> iterator = pidToNameToStreamVariable.keySet()
+ .iterator();
+ while (iterator.hasNext()) {
+ String connectorId = iterator.next();
+ if (uI.getConnectorTracker().getConnector(connectorId) == null) {
+ // Owner is no longer attached to the session
+ Map<String, StreamVariable> removed = pidToNameToStreamVariable
+ .get(connectorId);
+ for (String key : removed.keySet()) {
+ streamVariableToSeckey.remove(removed.get(key));
+ }
+ iterator.remove();
+ }
+ }
+ }
+ }
+
+ /**
+ * Removes any StreamVariable of the given name from the indicated
+ * connector.
+ *
+ * @param connectorId
+ * @param variableName
+ */
+ public void cleanStreamVariable(String connectorId, String variableName) {
+ if (pidToNameToStreamVariable == null) {
+ return;
+ }
+ Map<String, StreamVariable> nameToStreamVar = pidToNameToStreamVariable
+ .get(connectorId);
+ nameToStreamVar.remove(variableName);
+ if (nameToStreamVar.isEmpty()) {
+ pidToNameToStreamVariable.remove(connectorId);
+ }
+ }
+
+ /**
+ * Returns the security key associated with the given StreamVariable.
+ *
+ * @param variable
+ * @return matching security key if one exists, null otherwise
+ */
+ public String getSeckey(StreamVariable variable) {
+ if (streamVariableToSeckey == null) {
+ return null;
+ }
+ return streamVariableToSeckey.get(variable);
+ }
}
diff --git a/server/src/com/vaadin/ui/Form.java b/server/src/com/vaadin/ui/Form.java
index 862d98bb3c..d95b0ec70e 100644
--- a/server/src/com/vaadin/ui/Form.java
+++ b/server/src/com/vaadin/ui/Form.java
@@ -187,7 +187,7 @@ public class Form extends AbstractField<Object> implements Item.Editor,
public Form(Layout formLayout, FormFieldFactory fieldFactory) {
super();
setLayout(formLayout);
- setFooter(null);
+ setFooter(new HorizontalLayout());
setFormFieldFactory(fieldFactory);
setValidationVisible(false);
setWidth(100, UNITS_PERCENTAGE);
@@ -1210,16 +1210,16 @@ public class Form extends AbstractField<Object> implements Item.Editor,
* Returns a layout that is rendered below normal form contents. This area
* can be used for example to include buttons related to form contents.
*
- * @return layout rendered below normal form contents.
+ * @return layout rendered below normal form contents or null if no footer
+ * is used
*/
public Layout getFooter() {
return (Layout) getState().footer;
}
/**
- * Sets the layout that is rendered below normal form contents. Setting this
- * to null will cause an empty HorizontalLayout to be rendered in the
- * footer.
+ * Sets the layout that is rendered below normal form contents. No footer is
+ * rendered if this is set to null, .
*
* @param footer
* the new footer layout
@@ -1228,12 +1228,10 @@ public class Form extends AbstractField<Object> implements Item.Editor,
if (getFooter() != null) {
getFooter().setParent(null);
}
- if (footer == null) {
- footer = new HorizontalLayout();
- }
-
getState().footer = footer;
- footer.setParent(this);
+ if (footer != null) {
+ footer.setParent(this);
+ }
}
@Override
@@ -1332,9 +1330,16 @@ public class Form extends AbstractField<Object> implements Item.Editor,
}
i++;
if (i == 1) {
- return getLayout() != null ? getLayout() : getFooter();
+ if (getLayout() != null) {
+ return getLayout();
+ }
+ if (getFooter() != null) {
+ return getFooter();
+ }
} else if (i == 2) {
- return getFooter();
+ if (getFooter() != null) {
+ return getFooter();
+ }
}
return null;
}
diff --git a/server/tests/src/com/vaadin/tests/server/TestStreamVariableMapping.java b/server/tests/src/com/vaadin/tests/server/TestStreamVariableMapping.java
index f8dceca363..f24638e6a7 100644
--- a/server/tests/src/com/vaadin/tests/server/TestStreamVariableMapping.java
+++ b/server/tests/src/com/vaadin/tests/server/TestStreamVariableMapping.java
@@ -8,6 +8,7 @@ import com.vaadin.server.CommunicationManager;
import com.vaadin.server.StreamVariable;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinSession;
+import com.vaadin.ui.ConnectorTracker;
import com.vaadin.ui.UI;
import com.vaadin.ui.Upload;
@@ -51,18 +52,21 @@ public class TestStreamVariableMapping extends TestCase {
streamVariable);
assertTrue(targetUrl.startsWith("app://APP/UPLOAD/-1/1/myName/"));
- StreamVariable streamVariable2 = cm.getStreamVariable(
+ ConnectorTracker tracker = UI.getCurrent().getConnectorTracker();
+ StreamVariable streamVariable2 = tracker.getStreamVariable(
owner.getConnectorId(), variableName);
assertSame(streamVariable, streamVariable2);
}
public void testRemoverVariable() {
+ ConnectorTracker tracker = UI.getCurrent().getConnectorTracker();
cm.getStreamVariableTargetUrl(owner, variableName, streamVariable);
- assertNotNull(cm
- .getStreamVariable(owner.getConnectorId(), variableName));
+ assertNotNull(tracker.getStreamVariable(owner.getConnectorId(),
+ variableName));
cm.cleanStreamVariable(owner, variableName);
- assertNull(cm.getStreamVariable(owner.getConnectorId(), variableName));
+ assertNull(tracker.getStreamVariable(owner.getConnectorId(),
+ variableName));
}
private CommunicationManager createCommunicationManager() {
diff --git a/uitest/src/com/vaadin/tests/components/AbstractComponentTest.java b/uitest/src/com/vaadin/tests/components/AbstractComponentTest.java
index c086e03ae0..8dae56b079 100644
--- a/uitest/src/com/vaadin/tests/components/AbstractComponentTest.java
+++ b/uitest/src/com/vaadin/tests/components/AbstractComponentTest.java
@@ -165,12 +165,10 @@ public abstract class AbstractComponentTest<T extends AbstractComponent>
// This is only to be screenshot-compatible with Vaadin 6, where
// invisible components cause spacing
if (visible) {
- log.setHeight(null);
- log.setWidth(null);
+ log.removeStyleName("displaynone");
log.setCaption((String) log.getData());
} else {
- log.setHeight("0px");
- log.setWidth("0px");
+ log.addStyleName("displaynone");
log.setCaption(null);
}
}
diff --git a/uitest/src/com/vaadin/tests/components/customfield/BooleanFieldExample.java b/uitest/src/com/vaadin/tests/components/customfield/BooleanFieldExample.java
index a52b168e84..66346287ba 100644
--- a/uitest/src/com/vaadin/tests/components/customfield/BooleanFieldExample.java
+++ b/uitest/src/com/vaadin/tests/components/customfield/BooleanFieldExample.java
@@ -45,6 +45,7 @@ public class BooleanFieldExample extends TestBase {
layout.setMargin(true);
final Form form = new Form();
+ form.setFooter(null);
form.setFormFieldFactory(new DefaultFieldFactory() {
@Override
public Field createField(Item item, Object propertyId,
diff --git a/uitest/src/com/vaadin/tests/components/datefield/DateFieldInSubWindow.java b/uitest/src/com/vaadin/tests/components/datefield/DateFieldInSubWindow.java
index d6fbb465e8..fab97f46cb 100644
--- a/uitest/src/com/vaadin/tests/components/datefield/DateFieldInSubWindow.java
+++ b/uitest/src/com/vaadin/tests/components/datefield/DateFieldInSubWindow.java
@@ -88,6 +88,7 @@ public class DateFieldInSubWindow extends AbstractTestCase {
CustomerFieldFactory fieldFactory = new CustomerFieldFactory();
final Form generalForm = new Form();
{
+ generalForm.setFooter(null);
generalForm.setCaption("My form");
generalForm.setBuffered(false);
generalForm.setFormFieldFactory(fieldFactory);
diff --git a/uitest/src/com/vaadin/tests/components/form/FormClearDatasourceRepaint.java b/uitest/src/com/vaadin/tests/components/form/FormClearDatasourceRepaint.java
index ad6b13f6d2..df403ceb78 100644
--- a/uitest/src/com/vaadin/tests/components/form/FormClearDatasourceRepaint.java
+++ b/uitest/src/com/vaadin/tests/components/form/FormClearDatasourceRepaint.java
@@ -38,6 +38,7 @@ public class FormClearDatasourceRepaint extends TestBase {
protected void setup() {
final Form form = new Form();
+ form.setFooter(null);
form.setItemDataSource(new BeanItem<MySecondBean>(new MySecondBean()));
addComponent(form);
diff --git a/uitest/src/com/vaadin/tests/components/form/FormCommitWithInvalidValues.java b/uitest/src/com/vaadin/tests/components/form/FormCommitWithInvalidValues.java
index 907b8a27f3..b6b0624ba0 100644
--- a/uitest/src/com/vaadin/tests/components/form/FormCommitWithInvalidValues.java
+++ b/uitest/src/com/vaadin/tests/components/form/FormCommitWithInvalidValues.java
@@ -26,6 +26,7 @@ public class FormCommitWithInvalidValues extends TestBase {
@Override
protected void setup() {
form = new Form();
+ form.setFooter(null);
TextField tf = new TextField("A field, must contain 1-2 chars");
tf.addValidator(new StringLengthValidator("Invalid length", 1, 2, false));
tf.setRequired(true);
diff --git a/uitest/src/com/vaadin/tests/components/ui/IdOverrideTest.html b/uitest/src/com/vaadin/tests/components/ui/IdOverrideTest.html
new file mode 100644
index 0000000000..3a38712fb4
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/ui/IdOverrideTest.html
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<link rel="selenium.base" href="http://localhost:8888/run/com.vaadin.tests.components.ui.IdOverrideTest?restartApplication" />
+<title>IdOverrideTest</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+<thead>
+<tr><td rowspan="1" colspan="3">IdOverrideTest</td></tr>
+</thead><tbody>
+<tr>
+ <td>open</td>
+ <td>/run/com.vaadin.tests.components.ui.IdOverrideTest?restartApplication</td>
+ <td></td>
+</tr>
+<!-- Ensure the default components are present with correct ids -->
+<tr>
+ <td>assertElementPresent</td>
+ <td>default10179</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertElementPresent</td>
+ <td>set10179</td>
+ <td></td>
+</tr>
+<!-- Remove id from the middle component -->
+<tr>
+ <td>click</td>
+ <td>vaadin=runcomvaadintestscomponentsuiIdOverrideTest::PID_Stoggle/domChild[0]/domChild[0]</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertElementPresent</td>
+ <td>default10179</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertElementNotPresent</td>
+ <td>set10179</td>
+ <td></td>
+</tr>
+<!-- Re-add id to the middle component -->
+<tr>
+ <td>click</td>
+ <td>vaadin=runcomvaadintestscomponentsuiIdOverrideTest::PID_Stoggle/domChild[0]/domChild[0]</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertElementPresent</td>
+ <td>default10179</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertElementPresent</td>
+ <td>set10179</td>
+ <td></td>
+</tr>
+</tbody></table>
+</body>
+</html> \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/components/ui/IdOverrideTest.java b/uitest/src/com/vaadin/tests/components/ui/IdOverrideTest.java
new file mode 100644
index 0000000000..eeadc89691
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/ui/IdOverrideTest.java
@@ -0,0 +1,73 @@
+package com.vaadin.tests.components.ui;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.annotations.Widgetset;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.ui.MarginInfo;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.tests.widgetset.TestingWidgetSet;
+import com.vaadin.tests.widgetset.server.IdTestLabel;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.Label;
+
+@Widgetset(TestingWidgetSet.NAME)
+@Theme("tests-tickets")
+public class IdOverrideTest extends AbstractTestUI {
+
+ @Override
+ protected String getTestDescription() {
+ return "Id shouldn't get overridden unless specifically re-set.<br>"
+ + "First two are custom labels with a default id, third is an ordinary label for comparison.";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 10179;
+ }
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ getLayout().setSpacing(true);
+ getLayout().setMargin(new MarginInfo(true, false, false, false));
+
+ final IdTestLabel idTestLabel = new IdTestLabel("default id");
+ idTestLabel.setSizeUndefined();
+ addComponent(idTestLabel);
+
+ final IdTestLabel idTestLabelWithId = new IdTestLabel("set id");
+ idTestLabelWithId.setSizeUndefined();
+ idTestLabelWithId.setId("set10179");
+ idTestLabelWithId.setImmediate(true);
+ addComponent(idTestLabelWithId);
+
+ final Label label = new Label("no id");
+ label.setSizeUndefined();
+ addComponent(label);
+
+ Button button = new Button();
+ button.setCaption("Toggle");
+ button.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ if (idTestLabelWithId.getId() == null) {
+ idTestLabelWithId.setId("set10179");
+ idTestLabelWithId.setValue("set id");
+ idTestLabel.setValue("default id");
+ label.setValue("no id");
+ } else {
+ idTestLabelWithId.setId(null);
+ idTestLabelWithId.setValue("removed id");
+ idTestLabel.setValue("still default id");
+ label.setValue("still no id");
+ }
+ }
+ });
+ button.setId("toggle");
+ button.setImmediate(true);
+ addComponent(button);
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/ui/MultipleUIUploadTest.java b/uitest/src/com/vaadin/tests/components/ui/MultipleUIUploadTest.java
new file mode 100644
index 0000000000..f92e22d06b
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/ui/MultipleUIUploadTest.java
@@ -0,0 +1,118 @@
+package com.vaadin.tests.components.ui;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import com.vaadin.server.StreamResource;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.Notification;
+import com.vaadin.ui.Upload;
+import com.vaadin.ui.VerticalLayout;
+
+public class MultipleUIUploadTest extends AbstractTestUI {
+
+ private MemoryBuffer buffer = new MemoryBuffer();
+ private Upload upload;
+
+ @Override
+ protected String getTestDescription() {
+ return "Using Upload with multiple UIs causes NPE."
+ + " Open test in first browser window and open the file selection window."
+ + " Then open test in second browser window (without ?restartApplication) and click the notification button."
+ + " Then go back to the first window, select a file, and click Upload."
+ + " Click notification button to ensure the upload was received successfully.";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 10112;
+ }
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ final VerticalLayout layout = new VerticalLayout();
+ layout.setMargin(true);
+ layout.setSpacing(true);
+ setContent(layout);
+
+ upload = new Upload(null, buffer);
+ upload.setId("upload");
+ layout.addComponent(upload);
+
+ Button button = new Button("show notification");
+ button.setId("notify");
+ button.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ Notification.show("uploaded: " + buffer.getFileName());
+ }
+ });
+ layout.addComponent(button);
+
+ }
+
+ public class MemoryBuffer implements StreamResource.StreamSource,
+ Upload.Receiver {
+ ByteArrayOutputStream outputBuffer = null;
+
+ String mimeType;
+
+ String fileName;
+
+ public MemoryBuffer() {
+
+ }
+
+ @Override
+ public InputStream getStream() {
+ if (outputBuffer == null) {
+ return null;
+ }
+ return new ByteArrayInputStream(outputBuffer.toByteArray());
+ }
+
+ /**
+ * @see com.vaadin.ui.Upload.Receiver#receiveUpload(String, String)
+ */
+ @Override
+ public OutputStream receiveUpload(String filename, String MIMEType) {
+ fileName = filename;
+ mimeType = MIMEType;
+ outputBuffer = new ByteArrayOutputStream() {
+ @Override
+ public synchronized void write(byte[] b, int off, int len) {
+ super.write(b, off, len);
+ }
+
+ };
+ return outputBuffer;
+ }
+
+ /**
+ * Returns the fileName.
+ *
+ * @return String
+ */
+ public String getFileName() {
+ return fileName;
+ }
+
+ /**
+ * Returns the mimeType.
+ *
+ * @return String
+ */
+ public String getMimeType() {
+ return mimeType;
+ }
+
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/window/UndefinedHeightSubWindowAndContent.java b/uitest/src/com/vaadin/tests/components/window/UndefinedHeightSubWindowAndContent.java
index 715d089f57..1a34e90446 100644
--- a/uitest/src/com/vaadin/tests/components/window/UndefinedHeightSubWindowAndContent.java
+++ b/uitest/src/com/vaadin/tests/components/window/UndefinedHeightSubWindowAndContent.java
@@ -20,6 +20,7 @@ public class UndefinedHeightSubWindowAndContent extends TestBase {
subWindow.setContent(layout);
final Form form = new Form();
+ form.setFooter(null);
form.setImmediate(true);
form.setValidationVisible(true);
form.setCaption("This is a form");
diff --git a/uitest/src/com/vaadin/tests/validation/EmptyFieldErrorIndicators.java b/uitest/src/com/vaadin/tests/validation/EmptyFieldErrorIndicators.java
index a62eb62e71..11f98eb888 100644
--- a/uitest/src/com/vaadin/tests/validation/EmptyFieldErrorIndicators.java
+++ b/uitest/src/com/vaadin/tests/validation/EmptyFieldErrorIndicators.java
@@ -55,6 +55,7 @@ public class EmptyFieldErrorIndicators extends TestBase {
part.setMargin(true);
final Form form = createForm(required, failValidator);
+ form.setFooter(null);
part.addComponent(form);
Button validate = new Button("Validate fields");
diff --git a/uitest/src/com/vaadin/tests/widgetset/client/IdTestLabelConnector.java b/uitest/src/com/vaadin/tests/widgetset/client/IdTestLabelConnector.java
new file mode 100644
index 0000000000..5683ef03c6
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/widgetset/client/IdTestLabelConnector.java
@@ -0,0 +1,18 @@
+package com.vaadin.tests.widgetset.client;
+
+import com.vaadin.client.ui.label.LabelConnector;
+import com.vaadin.shared.ui.Connect;
+
+/**
+ * Connects server-side <code>IdTestLabel</code> component to client-side
+ * {@link VIdTestLabel} component (#10179).
+ *
+ */
+@Connect(com.vaadin.tests.widgetset.server.IdTestLabel.class)
+public class IdTestLabelConnector extends LabelConnector {
+
+ @Override
+ public VIdTestLabel getWidget() {
+ return (VIdTestLabel) super.getWidget();
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/widgetset/client/VIdTestLabel.java b/uitest/src/com/vaadin/tests/widgetset/client/VIdTestLabel.java
new file mode 100644
index 0000000000..52610e2a47
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/widgetset/client/VIdTestLabel.java
@@ -0,0 +1,15 @@
+package com.vaadin.tests.widgetset.client;
+
+import com.vaadin.client.ui.VLabel;
+
+/**
+ * Client-side implementation for IdTestLabel (#10179).
+ *
+ */
+public class VIdTestLabel extends VLabel {
+
+ public VIdTestLabel() {
+ super();
+ getElement().setId("default10179");
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/widgetset/server/IdTestLabel.java b/uitest/src/com/vaadin/tests/widgetset/server/IdTestLabel.java
new file mode 100644
index 0000000000..c505151341
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/widgetset/server/IdTestLabel.java
@@ -0,0 +1,16 @@
+package com.vaadin.tests.widgetset.server;
+
+import com.vaadin.ui.Label;
+
+/**
+ * Label that has a default id <code>default10179</code> for the use of
+ * IdOverrideTest (#10179).
+ *
+ */
+public class IdTestLabel extends Label {
+
+ public IdTestLabel(String caption) {
+ super(caption);
+ }
+
+}