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());
+ }
}