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 2016/06/22 16:37:28 UTC

wicket git commit: WICKET-6185 Border body not reachable for visitors

Repository: wicket
Updated Branches:
  refs/heads/wicket-7.x 529375ee1 -> 8c43b38a4


WICKET-6185 Border body not reachable for visitors

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

Branch: refs/heads/wicket-7.x
Commit: 8c43b38a43efff07b22cc87ffa6946d7d88de379
Parents: 529375e
Author: Andrea Del Bene <ad...@apache.org>
Authored: Wed Jun 22 18:36:13 2016 +0200
Committer: Andrea Del Bene <ad...@apache.org>
Committed: Wed Jun 22 18:36:13 2016 +0200

----------------------------------------------------------------------
 .../org/apache/wicket/ChildToDequeueType.java   | 49 ++++++++++++++++++++
 .../java/org/apache/wicket/MarkupContainer.java | 27 ++++++-----
 .../wicket/markup/html/border/Border.java       | 34 ++++++++++++--
 .../parser/filter/WicketTagIdentifier.java      |  4 +-
 .../html/border/BorderWithNestedBody.html       | 30 ++++++++++++
 .../html/border/BorderWithNestedBody.java       | 34 ++++++++++++++
 .../markup/html/border/ComponentBorderTest.java | 10 ++++
 7 files changed, 172 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/8c43b38a/wicket-core/src/main/java/org/apache/wicket/ChildToDequeueType.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ChildToDequeueType.java b/wicket-core/src/main/java/org/apache/wicket/ChildToDequeueType.java
new file mode 100644
index 0000000..29cfdfe
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/ChildToDequeueType.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.wicket;
+
+import org.apache.wicket.markup.html.border.Border;
+
+public enum ChildToDequeueType
+{
+	NULL, GENERIC_COMPONENT, MARKUP_CONTAINER, BORDER, QUEUE_REGION;
+	
+	public static ChildToDequeueType fromChild(Component child) 
+	{
+		if (child == null)
+		{
+			return NULL;
+		}
+		
+		if (child instanceof Border)
+		{
+			return BORDER;
+		}
+		
+		if (child instanceof IQueueRegion)
+		{
+			return QUEUE_REGION;
+		}
+		
+		if (child instanceof MarkupContainer)
+		{
+			return MARKUP_CONTAINER;
+		}
+		
+		return GENERIC_COMPONENT;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/8c43b38a/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 798cc67..791ae73 100644
--- a/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
+++ b/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
@@ -2144,24 +2144,29 @@ public abstract class MarkupContainer extends Component implements Iterable<Comp
 	 */
 	private void dequeueChild(Component child, ComponentTag tag, DequeueContext dequeue)
 	{
-		if (child == null)
-		{
-			// could not dequeue, or is a dequeue container
-			dequeue.skipToCloseTag();
-		}
-		else if (child instanceof IQueueRegion) 
+		ChildToDequeueType childType = ChildToDequeueType.fromChild(child);
+		
+		if (childType == ChildToDequeueType.QUEUE_REGION ||
+			childType == ChildToDequeueType.BORDER)
 		{
-			((IQueueRegion)child).dequeue();
-			dequeue.skipToCloseTag();
+			((IQueueRegion)child).dequeue();			
 		}
-		else if (child instanceof MarkupContainer)
+		
+		if (childType == ChildToDequeueType.MARKUP_CONTAINER ||
+			childType == ChildToDequeueType.BORDER)
 		{
 			// propagate dequeuing to containers
 			MarkupContainer childContainer = (MarkupContainer)child;
-
+			
 			dequeue.pushContainer(childContainer);
 			childContainer.dequeue(dequeue);
-			dequeue.popContainer();
+			dequeue.popContainer();			
+		}
+		
+		if (childType == ChildToDequeueType.NULL || 
+			childType == ChildToDequeueType.QUEUE_REGION)
+		{
+				dequeue.skipToCloseTag();
 		}
 
 		// pull the close tag off

http://git-wip-us.apache.org/repos/asf/wicket/blob/8c43b38a/wicket-core/src/main/java/org/apache/wicket/markup/html/border/Border.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/border/Border.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/border/Border.java
index 5ef0468..3104b23 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/border/Border.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/border/Border.java
@@ -22,6 +22,7 @@ import org.apache.wicket.DequeueTagAction;
 import org.apache.wicket.IQueueRegion;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.markup.ComponentTag;
+import org.apache.wicket.markup.ContainerInfo;
 import org.apache.wicket.markup.IMarkupFragment;
 import org.apache.wicket.markup.MarkupElement;
 import org.apache.wicket.markup.MarkupException;
@@ -34,6 +35,7 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.panel.BorderMarkupSourcingStrategy;
 import org.apache.wicket.markup.html.panel.IMarkupSourcingStrategy;
 import org.apache.wicket.markup.parser.XmlTag.TagType;
+import org.apache.wicket.markup.parser.filter.WicketTagIdentifier;
 import org.apache.wicket.markup.resolver.IComponentResolver;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.util.lang.Args;
@@ -316,6 +318,13 @@ public abstract class Border extends WebMarkupContainer implements IComponentRes
 	public Border addToBorder(final Component... children)
 	{
 		super.add(children);
+		
+		//if body has not been assigned yet, we queue it
+		if (body.getParent() == null)
+		{
+			dequeue();
+		}
+		
 		return this;
 	}
 
@@ -637,7 +646,7 @@ public abstract class Border extends WebMarkupContainer implements IComponentRes
 	@Override
 	protected DequeueTagAction canDequeueTag(ComponentTag tag)
 	{
-		if ((tag instanceof WicketTag) && ((WicketTag)tag).isBodyTag())
+		if (canDequeueBody(tag))
 		{
 			return DequeueTagAction.DEQUEUE;
 		}
@@ -648,18 +657,35 @@ public abstract class Border extends WebMarkupContainer implements IComponentRes
 	@Override
 	public Component findComponentToDequeue(ComponentTag tag)
 	{
-		if ((tag instanceof WicketTag) && ((WicketTag)tag).isBodyTag())
+		if (canDequeueBody(tag))
 		{
-			return getBodyContainer();
+			//synch the tag id with the one of the body component
+			tag.setId(body.getId());
+			return body;
 		}
 		return super.findComponentToDequeue(tag);
 	}
 
+	private boolean canDequeueBody(ComponentTag tag)
+	{
+		ContainerInfo containerInfo = (ContainerInfo)tag.getUserData(
+			WicketTagIdentifier.CONTAINER_INFO);
+		Class<?> containerClass = containerInfo != null ? 
+			containerInfo.getContainerClass() : null;
+		
+		boolean isBodyTag = (tag instanceof WicketTag) && ((WicketTag)tag).isBodyTag();
+		
+		//the body tag might belong to an outer body component
+		boolean isBorderBodyTag = containerClass == null || containerClass.equals(getClass());
+		
+		return isBodyTag && isBorderBodyTag;
+	}
+
 	@Override
 	protected void addDequeuedComponent(Component component, ComponentTag tag)
 	{
 		// components queued in border get dequeued into the border not into the body container
-		addToBorder(component);
+		super.add(component);
 	}
 	
 	/**

http://git-wip-us.apache.org/repos/asf/wicket/blob/8c43b38a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/WicketTagIdentifier.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/WicketTagIdentifier.java b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/WicketTagIdentifier.java
index 2694508..99b7ee5 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/WicketTagIdentifier.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/WicketTagIdentifier.java
@@ -50,6 +50,7 @@ import org.apache.wicket.util.string.Strings;
  */
 public final class WicketTagIdentifier extends AbstractMarkupFilter
 {
+	public static final String CONTAINER_INFO = "containerInfo";
 	/** List of well known wicket tag names */
 	private static final Set<String> WELL_KNOWN_TAG_NAMES = new HashSet<>();
 	/** List of raw wicket tag names */
@@ -121,8 +122,9 @@ public final class WicketTagIdentifier extends AbstractMarkupFilter
 			{
 				// Make it a Wicket component.
 				tag.setId(namespace + "_" + tag.getName() + getRequestUniqueId());
+				tag.setUserData(CONTAINER_INFO, getMarkupResourceStream().getContainerInfo());
 				tag.setModified(true);
-
+				
 				if (isRaw(tag)) 
 				{
 					tag.setFlag(ComponentTag.RENDER_RAW, true);

http://git-wip-us.apache.org/repos/asf/wicket/blob/8c43b38a/wicket-core/src/test/java/org/apache/wicket/markup/html/border/BorderWithNestedBody.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/border/BorderWithNestedBody.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/border/BorderWithNestedBody.html
new file mode 100644
index 0000000..b7d3449
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/border/BorderWithNestedBody.html
@@ -0,0 +1,30 @@
+<!--
+    ====================================================================
+    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.
+-->
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<title>Insert title here</title>
+</head>
+<body>
+    <wicket:border>
+         <div class="content">
+            <div wicket:id="nestedBorder">
+                <wicket:body/>                
+            </div>
+         </div>   
+    </wicket:border>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/8c43b38a/wicket-core/src/test/java/org/apache/wicket/markup/html/border/BorderWithNestedBody.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/border/BorderWithNestedBody.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/border/BorderWithNestedBody.java
new file mode 100644
index 0000000..b23c2e5
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/border/BorderWithNestedBody.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.wicket.markup.html.border;
+
+public class BorderWithNestedBody extends Border
+{
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 3233023845189903488L;
+
+	public BorderWithNestedBody(String id)
+	{
+		super(id);
+		
+		addToBorder(new BorderComponent1("nestedBorder"));
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/8c43b38a/wicket-core/src/test/java/org/apache/wicket/markup/html/border/ComponentBorderTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/border/ComponentBorderTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/border/ComponentBorderTest.java
index 7761a18..e3f38b8 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/border/ComponentBorderTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/border/ComponentBorderTest.java
@@ -126,4 +126,14 @@ public class ComponentBorderTest extends WicketTestCase
 		tester.startPage(BorderWithAutoLabelPage.class);
 		tester.assertRenderedPage(BorderWithAutoLabelPage.class);
 	}
+	
+	@Test
+	public void borderWithBodyInsideAnotherBody() throws Exception
+	{
+		Border borderTest = tester.startComponentInPage(new BorderWithNestedBody("test"));
+		Border nestedBorder = (Border)borderTest.get("nestedBorder");
+		
+		assertNotNull(borderTest.getBodyContainer().getParent());
+		assertNotNull(nestedBorder.getBodyContainer().getParent());
+	}
 }