diff options
author | Artur Signell <artur@vaadin.com> | 2017-03-27 21:51:03 +0300 |
---|---|---|
committer | Pekka Hyvönen <pekka@vaadin.com> | 2017-03-29 11:15:21 +0300 |
commit | 92ccddf4f2465dae1f43e6087ca25ae41cae637d (patch) | |
tree | c04b3f1cdb9d7a9bb02b12cd3a8fd0a72b34a84a /server | |
parent | 8fe87084b9418d12ad57d11d713d85cd5862724c (diff) | |
download | vaadin-framework-92ccddf4f2465dae1f43e6087ca25ae41cae637d.tar.gz vaadin-framework-92ccddf4f2465dae1f43e6087ca25ae41cae637d.zip |
Make CustomField iterator() comply with contract
Fixes #8957
Diffstat (limited to 'server')
-rw-r--r-- | server/src/main/java/com/vaadin/ui/CustomField.java | 32 | ||||
-rw-r--r-- | server/src/test/java/com/vaadin/ui/CustomFieldTest.java | 63 |
2 files changed, 72 insertions, 23 deletions
diff --git a/server/src/main/java/com/vaadin/ui/CustomField.java b/server/src/main/java/com/vaadin/ui/CustomField.java index c8cfc2a25e..bd073598b4 100644 --- a/server/src/main/java/com/vaadin/ui/CustomField.java +++ b/server/src/main/java/com/vaadin/ui/CustomField.java @@ -16,7 +16,7 @@ package com.vaadin.ui; -import java.io.Serializable; +import java.util.Collections; import java.util.Iterator; import com.vaadin.data.HasValue; @@ -130,30 +130,16 @@ public abstract class CustomField<T> extends AbstractField<T> // ComponentContainer methods - private class ComponentIterator - implements Iterator<Component>, Serializable { - boolean first = (root != null); - - @Override - public boolean hasNext() { - return first; - } - - @Override - public Component next() { - first = false; - return getContent(); - } - - @Override - public void remove() { - throw new UnsupportedOperationException(); - } - } - @Override public Iterator<Component> iterator() { - return new ComponentIterator(); + // Can't use getContent() here as this will cause an infinite loop if + // initContent happens to all iterator(). This happens if you do + // setWidth... + if (root != null) { + return Collections.singletonList(root).iterator(); + } else { + return Collections.<Component> emptyList().iterator(); + } } /** diff --git a/server/src/test/java/com/vaadin/ui/CustomFieldTest.java b/server/src/test/java/com/vaadin/ui/CustomFieldTest.java new file mode 100644 index 0000000000..94636dcdc0 --- /dev/null +++ b/server/src/test/java/com/vaadin/ui/CustomFieldTest.java @@ -0,0 +1,63 @@ +/* + * Copyright 2000-2016 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.ui; + +import java.util.Iterator; +import java.util.NoSuchElementException; + +import org.junit.Assert; +import org.junit.Test; + +public class CustomFieldTest { + + public static class TestCustomField extends CustomField<String> { + + private String value = "initial"; + private Button button; + + @Override + public String getValue() { + return value; + } + + @Override + protected Component initContent() { + button = new Button("Content"); + return button; + } + + @Override + protected void doSetValue(String value) { + this.value = value; + + } + + } + + @Test(expected = NoSuchElementException.class) + public void iterator() { + TestCustomField field = new TestCustomField(); + // Needs to trigger initContent somehow as + // iterator() can't do it even though it should... + field.getContent(); + Iterator<Component> iterator = field.iterator(); + Assert.assertNotNull(iterator); + Assert.assertTrue(iterator.hasNext()); + Assert.assertEquals(field.button, iterator.next()); + Assert.assertFalse(iterator.hasNext()); + iterator.next(); + } +} |