You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by ad...@apache.org on 2017/04/29 13:08:47 UTC

wicket git commit: WICKET-6361 MarkupContainer#queue doesn't work in table column

Repository: wicket
Updated Branches:
  refs/heads/master 9e42a9548 -> 446003862


WICKET-6361 MarkupContainer#queue doesn't work in table column

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

Branch: refs/heads/master
Commit: 446003862b96e8c5ff551b26489f2e0751b50db0
Parents: 9e42a95
Author: Andrea Del Bene <ad...@apache.org>
Authored: Sat Apr 29 15:09:12 2017 +0200
Committer: Andrea Del Bene <ad...@apache.org>
Committed: Sat Apr 29 15:09:35 2017 +0200

----------------------------------------------------------------------
 .../java/org/apache/wicket/MarkupContainer.java | 54 +++++++-------------
 .../wicket/queueing/ComponentQueueingTest.java  | 20 ++++++++
 2 files changed, 38 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/44600386/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java b/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
index 5baac8b..57ab1c9 100644
--- a/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
+++ b/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
@@ -1002,17 +1002,6 @@ public abstract class MarkupContainer extends Component implements Iterable<Comp
 		}
 
 		Page page = findPage();
-		
-		// if we have a path to page, dequeue any container children.
-		if (page != null && child instanceof MarkupContainer)
-		{
-		    MarkupContainer childContainer = (MarkupContainer)child;
-		    // if we are already dequeueing there is no need to dequeue again
-		    if (!childContainer.getRequestFlag(RFLAG_CONTAINER_DEQUEING))
-			{				
-				childContainer.dequeue();
-			}
-		}
 
 		if (page != null)
 		{
@@ -1874,42 +1863,35 @@ public abstract class MarkupContainer extends Component implements Iterable<Comp
 		}
 		else
 		{
-			MarkupContainer containerWithQueue = this;
+			MarkupContainer queueRegion = (MarkupContainer)findParent(IQueueRegion.class);
 
-			// check if there are any parent containers that have queued components, up till our
-			// queue region
-			while (containerWithQueue.isQueueEmpty() &&
-				!(containerWithQueue instanceof IQueueRegion))
+			if (queueRegion == null)
 			{
-				containerWithQueue = containerWithQueue.getParent();
-				if (containerWithQueue == null)
-				{
-					// no queued components are available for dequeuing, so we can stop
-					return;
-				}
-			}
-
-			// when there are no components to be dequeued, just stop
-			if (containerWithQueue.isQueueEmpty())
 				return;
-
-			// get the queue region where we are going to dequeue components in
-			MarkupContainer queueRegion = containerWithQueue;
-
-			// the container with queued components could be a queue region, if not, find the region
-			// to dequeue in
-			if (!queueRegion.isQueueRegion())
+			}
+			
+			MarkupContainer anchestor = this;
+			boolean hasQueuedChildren = !isQueueEmpty();
+			
+			while (!hasQueuedChildren && anchestor != queueRegion)
 			{
-				queueRegion = (MarkupContainer)queueRegion.findParent(IQueueRegion.class);
+				anchestor = anchestor.getParent();
+				hasQueuedChildren = !anchestor.isQueueEmpty();
 			}
-
-			if (queueRegion != null && !queueRegion.getRequestFlag(RFLAG_CONTAINER_DEQUEING))
+			
+			if (hasQueuedChildren && !queueRegion.getRequestFlag(RFLAG_CONTAINER_DEQUEING))
 			{
 				queueRegion.dequeue();
 			}
 		}
 	}
 
+	@Override
+	protected void onInitialize()
+	{
+		super.onInitialize();
+		dequeue();
+	}
 	/**
 	 * @return {@code true} when one or more components are queued
 	 */

http://git-wip-us.apache.org/repos/asf/wicket/blob/44600386/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingTest.java b/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingTest.java
index e889865..fdce742 100644
--- a/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingTest.java
@@ -66,6 +66,26 @@ public class ComponentQueueingTest extends WicketTestCase
 		tester.startPage(p);
 	}
 
+	/**
+	 * https://issues.apache.org/jira/browse/WICKET-6361
+	 */
+	@Test
+	public void dequeueComponentsOnInitialization()
+	{
+		TestPage p = new TestPage();
+		p.setPageMarkup("<p wicket:id='a'><p wicket:id='b'><p wicket:id='c'></p></p></p>");
+		MarkupContainer a = new A(), b = new B(), c = new C();
+		
+		//components are queued before their nested container is added to the page.
+		//this caused a "Detach called on component...while it had a non-empty queue" before WICKET-6361 was fixed
+		b.queue(c);
+		a.add(b);
+		
+		p.add(a);
+
+		tester.startPage(p);
+	}
+	
 	/** {@code [a[b,c]] -> [a[b[c]]] } */
 	@Test
 	public void dequeue2()