From: Artur Signell Date: Wed, 25 Nov 2009 17:49:17 +0000 (+0000) Subject: Merged changes from trunk X-Git-Tag: 6.7.0.beta1~2241^2~9 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=1d89da47d29849dc41d7c5f2f68700eb5e918b8d;p=vaadin-framework.git Merged changes from trunk svn changeset:10040/svn branch:event-framework-3234 --- diff --git a/src/com/vaadin/event/EventRouter.java b/src/com/vaadin/event/EventRouter.java index b12a280262..dd13445e93 100644 --- a/src/com/vaadin/event/EventRouter.java +++ b/src/com/vaadin/event/EventRouter.java @@ -138,13 +138,17 @@ public class EventRouter implements MethodEventSource { public void fireEvent(EventObject event) { // It is not necessary to send any events if there are no listeners if (listenerList != null) { + + // Make a copy of the listener list to allow listeners to be added + // inside listener methods. Fixes #3605. + // Send the event to all listeners. The listeners themselves // will filter out unwanted events. - - final Iterator i = listenerList.iterator(); - while (i.hasNext()) { - (i.next()).receiveEvent(event); + final Object[] listeners = listenerList.toArray(); + for (int i = 0; i < listeners.length; i++) { + ((ListenerMethod) listeners[i]).receiveEvent(event); } + } } diff --git a/src/com/vaadin/terminal/gwt/server/ApplicationRunnerServlet.java b/src/com/vaadin/terminal/gwt/server/ApplicationRunnerServlet.java index aeb1b50c9c..b047556371 100644 --- a/src/com/vaadin/terminal/gwt/server/ApplicationRunnerServlet.java +++ b/src/com/vaadin/terminal/gwt/server/ApplicationRunnerServlet.java @@ -164,6 +164,8 @@ public class ApplicationRunnerServlet extends AbstractApplicationServlet { appClass = (Class) getClass() .getClassLoader().loadClass( defaultPackages[i] + "." + baseName); + } catch (ClassNotFoundException ee) { + // Ignore as this is expected for many packages } catch (Exception e2) { // TODO: handle exception e2.printStackTrace(); diff --git a/tests/src/com/vaadin/tests/server/TestEventRouter.java b/tests/src/com/vaadin/tests/server/TestEventRouter.java new file mode 100644 index 0000000000..dc388a66ac --- /dev/null +++ b/tests/src/com/vaadin/tests/server/TestEventRouter.java @@ -0,0 +1,37 @@ +package com.vaadin.tests.server; + +import junit.framework.TestCase; + +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.ui.TextField; + +public class TestEventRouter extends TestCase { + + int innerListenerCalls = 0; + + public void testAddInEventListener() { + final TextField tf = new TextField(); + + final ValueChangeListener outer = new ValueChangeListener() { + + public void valueChange(ValueChangeEvent event) { + ValueChangeListener inner = new ValueChangeListener() { + + public void valueChange(ValueChangeEvent event) { + innerListenerCalls++; + System.out.println("The inner listener was called"); + } + }; + + tf.addListener(inner); + } + }; + + tf.addListener(outer); + tf.setValue("abc"); // No inner listener calls, adds one inner + tf.setValue("def"); // One inner listener call, adds one inner + tf.setValue("ghi"); // Two inner listener calls, adds one inner + assert (innerListenerCalls == 3); + } +}