diff options
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="2.4.0",javax.servlet.http;version="2.4.0",org.jsoup;version="1.6.3",org.jsoup.parser;version="1.6.3",org.jsoup.nodes;version="1.6.3",org.jsoup.helper;version="1.6.3",org.jsoup.safety;version="1.6.3",org.json;version="20080701"" /> + <property name="server.osgi.import" value="javax.servlet;version="2.4.0",javax.servlet.http;version="2.4.0",org.jsoup;version="1.6.3",org.jsoup.parser;version="1.6.3",org.jsoup.nodes;version="1.6.3",org.jsoup.helper;version="1.6.3",org.jsoup.safety;version="1.6.3",org.json;version="0.0.20080701"" /> <antcall target="common.jar"> <param name="require-bundle" value="com.vaadin.shared;bundle-version="${vaadin.version}""/> <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); + } + +} |