You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2013/08/06 16:43:00 UTC

git commit: WICKET-5302 Using InlineEnclosure leads to two re-renderings of the controlling child component

Updated Branches:
  refs/heads/master f0cfce83e -> fa0140223


WICKET-5302 Using InlineEnclosure leads to two re-renderings of the controlling child component

Pass the original/modifiable map of components added to the AjaxRequestTarget for re-rendering to all registered AjaxRequestTarget.IListeners.
This way they can modify it if needed


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/fa014022
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/fa014022
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/fa014022

Branch: refs/heads/master
Commit: fa01402233fb56abc0709bcdc6f6a6c008a1abc7
Parents: f0cfce8
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Tue Aug 6 16:41:16 2013 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Tue Aug 6 16:41:16 2013 +0200

----------------------------------------------------------------------
 .../apache/wicket/ajax/AjaxRequestHandler.java  |  4 +---
 .../apache/wicket/ajax/AjaxRequestTarget.java   |  2 +-
 .../protocol/http/AjaxEnclosureListener.java    | 24 +++++++++++---------
 .../markup/html/internal/TogglePageTest.java    |  6 +++--
 4 files changed, 19 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/fa014022/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestHandler.java b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestHandler.java
index 3de3519..a77f60f 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestHandler.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestHandler.java
@@ -161,11 +161,9 @@ public class AjaxRequestHandler implements AjaxRequestTarget
 
 				if (listeners != null)
 				{
-					final Map<String, Component> components = Collections.unmodifiableMap(markupIdToComponent);
-
 					for (AjaxRequestTarget.IListener listener : listeners)
 					{
-						listener.onBeforeRespond(components, AjaxRequestHandler.this);
+						listener.onBeforeRespond(markupIdToComponent, AjaxRequestHandler.this);
 					}
 				}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/fa014022/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java
index 662fe1f..bf4c284 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java
@@ -44,7 +44,7 @@ public interface AjaxRequestTarget extends IPageRequestHandler, ILoggableRequest
 		 * Triggered before ajax request target begins its response cycle
 		 *
 		 * @param map
-		 *            read-only map:markupId->component of components already added to the target
+		 *            modifiable map (markupId -> component) of components already added to the target
 		 * @param target
 		 *            the target itself. Could be used to add components or to append/prepend
 		 *            javascript

http://git-wip-us.apache.org/repos/asf/wicket/blob/fa014022/wicket-core/src/main/java/org/apache/wicket/protocol/http/AjaxEnclosureListener.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/protocol/http/AjaxEnclosureListener.java b/wicket-core/src/main/java/org/apache/wicket/protocol/http/AjaxEnclosureListener.java
index 1c583a7..f07be63 100644
--- a/wicket-core/src/main/java/org/apache/wicket/protocol/http/AjaxEnclosureListener.java
+++ b/wicket-core/src/main/java/org/apache/wicket/protocol/http/AjaxEnclosureListener.java
@@ -16,9 +16,6 @@
  */
 package org.apache.wicket.protocol.http;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
 import java.util.Map;
 
 import org.apache.wicket.Component;
@@ -70,18 +67,16 @@ public class AjaxEnclosureListener extends AjaxRequestTarget.AbstractListener
 	@Override
 	public void onBeforeRespond(final Map<String, Component> map, final AjaxRequestTarget target)
 	{
-		// We need to iterate over the map, but the map changes if we add an
-		// InlineEnclosure to the target. --> make a copy of the map and iterate that instead.
-		final List<Component> originalComponents = Collections.unmodifiableList(new ArrayList<Component>(
-			map.values()));
-
-		target.getPage().visitChildren(InlineEnclosure.class, new IVisitor<InlineEnclosure, Void>()
+		String key = target.getPage().visitChildren(InlineEnclosure.class, new IVisitor<InlineEnclosure, String>()
 		{
 			@Override
-			public void component(final InlineEnclosure enclosure, final IVisit<Void> visit)
+			public void component(final InlineEnclosure enclosure, final IVisit<String> visit)
 			{
-				for (Component component : originalComponents)
+				for (Map.Entry<String, Component> entry : map.entrySet())
 				{
+					String key = entry.getKey();
+					Component component = entry.getValue();
+
 					if (isControllerOfEnclosure(component, enclosure))
 					{
 						// update the visibility of the enclosure
@@ -89,10 +84,17 @@ public class AjaxEnclosureListener extends AjaxRequestTarget.AbstractListener
 
 						// add enclosure to Ajax target
 						target.add(enclosure);
+						visit.stop(key);
+						break;
 					}
 				}
 			}
 		});
+
+		if (key != null)
+		{
+			map.remove(key);
+		}
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/wicket/blob/fa014022/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/TogglePageTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/TogglePageTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/TogglePageTest.java
index 8a843f0..7d48517 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/TogglePageTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/TogglePageTest.java
@@ -127,7 +127,9 @@ public class TogglePageTest extends WicketTestCase
 		{
 			// On
 			InlineEnclosureWithAdditionalAjaxTargetPage ajaxPage = (InlineEnclosureWithAdditionalAjaxTargetPage)tester.getLastRenderedPage();
-			tester.assertComponentOnAjaxResponse(ajaxPage.getLabel1());
+			// WICKET-5302 - only the InlineEnclosure is in the Ajax response
+			// Label1 is inside the InlineEncosure
+			tester.assertComponentOnAjaxResponse("wicket_InlineEnclosure-0");
 			tester.assertComponentOnAjaxResponse(ajaxPage.getLabel2());
 			assertVisible(ajaxPage.getLabel1());
 			assertVisible(ajaxPage.getLabel2());
@@ -232,4 +234,4 @@ public class TogglePageTest extends WicketTestCase
 	}
 
 
-}
\ No newline at end of file
+}