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 2014/05/26 20:47:37 UTC

git commit: WICKET-5580 Allow markup to find child fragments when wicket:child is inside a component tag

Repository: wicket
Updated Branches:
  refs/heads/wicket-6.x 7b6b88883 -> bc62f8cca


WICKET-5580 Allow markup to find child fragments when wicket:child is inside a component tag


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

Branch: refs/heads/wicket-6.x
Commit: bc62f8cca03573160514444291513899211dae7e
Parents: 7b6b888
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Mon May 26 20:45:58 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Mon May 26 20:45:58 2014 +0200

----------------------------------------------------------------------
 .../wicket/markup/AbstractMarkupFragment.java   | 117 ++++++++++++++
 .../java/org/apache/wicket/markup/Markup.java   |  33 +---
 .../apache/wicket/markup/MarkupFragment.java    |  36 +----
 .../org/apache/wicket/markup/MarkupTest.java    | 161 +++++++++++++++++++
 .../apache/wicket/markup/MarkupTest_Find_1.html |  68 ++++++++
 .../apache/wicket/markup/MarkupTest_Find_1.java |  24 +++
 .../apache/wicket/markup/MarkupTest_Find_2.html |  60 +++++++
 .../apache/wicket/markup/MarkupTest_Find_2.java |  22 +++
 .../apache/wicket/markup/MarkupTest_Find_3.html |  49 ++++++
 .../apache/wicket/markup/MarkupTest_Find_3.java |  22 +++
 10 files changed, 527 insertions(+), 65 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/bc62f8cc/wicket-core/src/main/java/org/apache/wicket/markup/AbstractMarkupFragment.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/AbstractMarkupFragment.java b/wicket-core/src/main/java/org/apache/wicket/markup/AbstractMarkupFragment.java
new file mode 100644
index 0000000..d990db2
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/AbstractMarkupFragment.java
@@ -0,0 +1,117 @@
+/*
+ * 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;
+
+import java.util.Deque;
+import java.util.LinkedList;
+import org.apache.wicket.util.lang.Args;
+
+/**
+ * A base implementation of {@link IMarkupFragment}.
+ */
+public abstract class AbstractMarkupFragment implements IMarkupFragment
+{
+	/**
+	 * Find the markup fragment of component with id equal to {@code id}, starting at offset {@code streamOffset}.
+	 * 
+	 * @param id
+	 *		The id of the component tag being searched for.
+	 * @param streamOffset
+	 *		The offset in the markup stream from which to start searching.
+	 * @return the {@link IMarkupFragment} of the component tag if found, {@code null} is not found.
+	 */
+	protected final IMarkupFragment find(final String id, int streamOffset)
+	{
+		/*
+		 * We need streamOffset because MarkupFragment starts searching from offset 1.
+		 */
+		Args.notEmpty(id, "id");
+		Args.withinRange(0, size() - 1, streamOffset, "streamOffset");
+
+		Deque<Boolean> openTagUsability = new LinkedList<Boolean>();
+		boolean canFind = true;
+
+		MarkupStream stream = new MarkupStream(this);
+		stream.setCurrentIndex(streamOffset);
+		while (stream.hasMore())
+		{
+			MarkupElement elem = stream.get();
+
+			if (elem instanceof ComponentTag)
+			{
+				ComponentTag tag = stream.getTag();
+
+				if (tag.isOpen() || tag.isOpenClose())
+				{
+					if (canFind && tag.getId().equals(id))
+					{
+						return stream.getMarkupFragment();
+					}
+					else if (tag.isOpen() && !tag.hasNoCloseTag())
+					{
+						openTagUsability.push(canFind);
+
+						if (tag instanceof WicketTag)
+						{
+							WicketTag wtag = (WicketTag)tag;
+
+							if (wtag.isExtendTag())
+							{
+								canFind = true;
+							}
+							else if (wtag.isFragementTag())
+							{
+								canFind = false;
+							}
+							/*
+							 * We should potentially also not try find child markup inside some other
+							 * Wicket tags. Other tags that we should think about refusing to look for
+							 * child markup inside include: container, body, border, child (we already
+							 * have special extend handling).
+							 */
+						}
+						else if (!"head".equals(tag.getName()) && !tag.isAutoComponentTag())
+						{
+							canFind = false;
+						}
+					}
+				}
+				else if (tag.isClose())
+				{
+					if (openTagUsability.isEmpty())
+					{
+						canFind = false;
+					}
+					else
+					{
+						canFind = openTagUsability.pop();
+					}
+				}
+			}
+
+			stream.next();
+		}
+
+		return null;
+	}
+
+	@Override
+	public String toString()
+	{
+		return toString(false);
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bc62f8cc/wicket-core/src/main/java/org/apache/wicket/markup/Markup.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/Markup.java b/wicket-core/src/main/java/org/apache/wicket/markup/Markup.java
index 3bc2f39..2808e42 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/Markup.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/Markup.java
@@ -39,10 +39,8 @@ import org.slf4j.LoggerFactory;
  * 
  * @author Juergen Donnerstag
  */
-public class Markup implements IMarkupFragment
+public class Markup extends AbstractMarkupFragment
 {
-	private static final Logger log = LoggerFactory.getLogger(Markup.class);
-
 	/** Placeholder that indicates no markup */
 	public static final Markup NO_MARKUP = new Markup();
 
@@ -211,34 +209,7 @@ public class Markup implements IMarkupFragment
 	@Override
 	public final IMarkupFragment find(final String id)
 	{
-		Args.notEmpty(id, "id");
-
-		MarkupStream stream = new MarkupStream(this);
-		stream.setCurrentIndex(0);
-		while (stream.hasMore())
-		{
-			MarkupElement elem = stream.get();
-			if (elem instanceof ComponentTag)
-			{
-				ComponentTag tag = stream.getTag();
-				if (tag.isOpen() || tag.isOpenClose())
-				{
-					if (tag.getId().equals(id))
-					{
-						return stream.getMarkupFragment();
-					}
-					if (tag.isOpen() && !tag.hasNoCloseTag() && !(tag instanceof WicketTag) &&
-						!"head".equals(tag.getName()) && !tag.isAutoComponentTag())
-					{
-						stream.skipToMatchingCloseTag(tag);
-					}
-				}
-			}
-
-			stream.next();
-		}
-
-		return null;
+		return find(id, 0);
 	}
 
 	@Override

http://git-wip-us.apache.org/repos/asf/wicket/blob/bc62f8cc/wicket-core/src/main/java/org/apache/wicket/markup/MarkupFragment.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/MarkupFragment.java b/wicket-core/src/main/java/org/apache/wicket/markup/MarkupFragment.java
index 35c434f..263adc6 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/MarkupFragment.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/MarkupFragment.java
@@ -36,7 +36,7 @@ import org.apache.wicket.util.string.AppendingStringBuffer;
  * 
  * @author Juergen Donnerstag
  */
-public class MarkupFragment implements IMarkupFragment
+public class MarkupFragment extends AbstractMarkupFragment
 {
 	/** The parent markup. Must not be null. */
 	private final IMarkupFragment markup;
@@ -147,33 +147,7 @@ public class MarkupFragment implements IMarkupFragment
 	@Override
 	public final IMarkupFragment find(final String id)
 	{
-		Args.notEmpty(id, "id");
-
-		MarkupStream stream = new MarkupStream(this);
-		stream.setCurrentIndex(1);
-		while (stream.hasMore())
-		{
-			MarkupElement elem = stream.get();
-			if (elem instanceof ComponentTag)
-			{
-				ComponentTag tag = stream.getTag();
-				if (tag.isOpen() || tag.isOpenClose())
-				{
-					if (tag.getId().equals(id))
-					{
-						return stream.getMarkupFragment();
-					}
-					if (tag.isOpen() && !tag.hasNoCloseTag() && !tag.isAutoComponentTag())
-					{
-						stream.skipToMatchingCloseTag(tag);
-					}
-				}
-			}
-
-			stream.next();
-		}
-
-		return null;
+		return find(id, 1);
 	}
 
 	@Override
@@ -210,12 +184,6 @@ public class MarkupFragment implements IMarkupFragment
 	}
 
 	@Override
-	public String toString()
-	{
-		return toString(false);
-	}
-
-	@Override
 	public String toString(boolean markupOnly)
 	{
 		final AppendingStringBuffer buf = new AppendingStringBuffer(400);

http://git-wip-us.apache.org/repos/asf/wicket/blob/bc62f8cc/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest.java
new file mode 100644
index 0000000..751be1a
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest.java
@@ -0,0 +1,161 @@
+/*
+ * 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;
+
+import org.apache.wicket.WicketTestCase;
+import org.junit.Test;
+
+/**
+ * Tests {@link Markup} class.
+ */
+public class MarkupTest extends WicketTestCase
+{
+	@Test
+	public void testFind()
+	{
+		MarkupFactory markupFactory = tester.getApplication().getMarkupSettings().getMarkupFactory();
+		Markup markup = markupFactory.getMarkup(new MarkupTest_Find_3(), false);
+
+		IMarkupFragment childMarkup;
+
+		/*
+		 * Ensure we can find inside <head>
+		 */
+		childMarkup = markup.find("a1");
+		assertNotNull(childMarkup);
+		assertTrue(childMarkup.get(0) instanceof ComponentTag);
+		assertEquals("a1", ((ComponentTag)childMarkup.get(0)).getId());
+
+		/*
+		 * Ensure we can find in body
+		 */
+		childMarkup = markup.find("a2");
+		assertNotNull(childMarkup);
+		assertTrue(childMarkup.get(0) instanceof ComponentTag);
+		assertEquals("a2", ((ComponentTag)childMarkup.get(0)).getId());
+
+		/*
+		 * Ensure we cannot find inside component tag
+		 */
+		assertNull(markup.find("a3"));
+
+		/*
+		 * Ensure we can find after other component tag
+		 */
+		childMarkup = markup.find("a4");
+		assertNotNull(childMarkup);
+		assertTrue(childMarkup.get(0) instanceof ComponentTag);
+		assertEquals("a4", ((ComponentTag)childMarkup.get(0)).getId());
+
+		/*
+		 * Ensure we can find after wicket:child
+		 */
+		childMarkup = markup.find("a5");
+		assertNotNull(childMarkup);
+		assertTrue(childMarkup.get(0) instanceof ComponentTag);
+		assertEquals("a5", ((ComponentTag)childMarkup.get(0)).getId());
+
+		/*
+		 * Ensure we can find after fragment
+		 */
+		childMarkup = markup.find("a6");
+		assertNotNull(childMarkup);
+		assertTrue(childMarkup.get(0) instanceof WicketTag);
+		assertEquals("a6", ((ComponentTag)childMarkup.get(0)).getId());
+		assertTrue(((WicketTag)childMarkup.get(0)).isFragementTag());
+
+		/*
+		 * Ensure we cannot find inside fragment
+		 */
+		assertNull(markup.find("a7"));
+
+		/*
+		 * Ensure we can find in subclass <wicket:head> section
+		 */
+		childMarkup = markup.find("b1");
+		assertNotNull(childMarkup);
+		assertTrue(childMarkup.get(0) instanceof ComponentTag);
+		assertEquals("b1", ((ComponentTag)childMarkup.get(0)).getId());
+
+		/*
+		 * Ensure we can find fragment in subclass
+		 */
+		childMarkup = markup.find("b2");
+		assertNotNull(childMarkup);
+		assertTrue(childMarkup.get(0) instanceof WicketTag);
+		assertEquals("b2", ((ComponentTag)childMarkup.get(0)).getId());
+		assertTrue(((WicketTag)childMarkup.get(0)).isFragementTag());
+
+		/*
+		 * Ensure we cannot find inside fragment in subclass
+		 */
+		assertNull(markup.find("b3"));
+
+		/*
+		 * Ensure we can find in subclass <wicket:extend> section
+		 */
+		childMarkup = markup.find("b4");
+		assertNotNull(childMarkup);
+		assertTrue(childMarkup.get(0) instanceof ComponentTag);
+		assertEquals("b4", ((ComponentTag)childMarkup.get(0)).getId());
+
+		/*
+		 * Ensure we cannot find inside component tag in subclass
+		 */
+		assertNull(markup.find("b5"));
+
+		/*
+		 * Ensure we cannot find inside component tag in subclass after wicket:child
+		 */
+		assertNull(markup.find("b6"));
+
+		/*
+		 * Ensure we can find in subclass <wicket:head> section
+		 */
+		childMarkup = markup.find("c1");
+		assertNotNull(childMarkup);
+		assertTrue(childMarkup.get(0) instanceof ComponentTag);
+		assertEquals("c1", ((ComponentTag)childMarkup.get(0)).getId());
+
+		/*
+		 * Ensure we can find fragment in subclass
+		 */
+		childMarkup = markup.find("c2");
+		assertNotNull(childMarkup);
+		assertTrue(childMarkup.get(0) instanceof WicketTag);
+		assertEquals("c2", ((ComponentTag)childMarkup.get(0)).getId());
+		assertTrue(((WicketTag)childMarkup.get(0)).isFragementTag());
+
+		/*
+		 * Ensure we cannot find inside fragment in subclass
+		 */
+		assertNull(markup.find("c3"));
+
+		/*
+		 * Ensure we can find in subclass <wicket:extend> section
+		 */
+		childMarkup = markup.find("c4");
+		assertNotNull(childMarkup);
+		assertTrue(childMarkup.get(0) instanceof ComponentTag);
+		assertEquals("c4", ((ComponentTag)childMarkup.get(0)).getId());
+
+		/*
+		 * Ensure we cannot find inside component tag in subclass
+		 */
+		assertNull(markup.find("c5"));
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bc62f8cc/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_1.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_1.html b/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_1.html
new file mode 100644
index 0000000..6bcadc4
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_1.html
@@ -0,0 +1,68 @@
+<!--
+    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.
+-->
+<html>
+	<head>
+		<meta wicket:id="a1">
+	</head>
+	<body>
+		<!--
+		Test that we correctly find after open-no-close
+		-->
+		<input type="text" wicket:id="textfield">
+
+		<!--
+		Test that we correctly find after open-close
+		-->
+		<div wicket:id="openClose"/>
+
+		<!--
+		Test finding in body (normal)
+		-->
+		<div wicket:id="a2">
+			<!--
+			Test that we do not find d3 inside another component tag
+			-->
+			<div wicket:id="a3">
+			</div>
+		</div>
+
+		<!--
+		Test after component
+		--> 
+		<span wicket:id="a4"></span>
+
+		<div>
+			<wicket:child/>
+		</div>
+
+		<!--
+		Test after wicket:child
+		-->
+		<span wicket:id="a5"></span>
+
+		<!--
+		Test find fragment
+		-->
+	<wicket:fragment wicket:id="a6">
+
+		<!--
+		Test not find inside fragment
+		-->
+		<div wicket:id="a7">
+
+		</div>
+
+	</wicket:fragment>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/bc62f8cc/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_1.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_1.java b/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_1.java
new file mode 100644
index 0000000..f215512
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_1.java
@@ -0,0 +1,24 @@
+/*
+ * 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;
+
+import org.apache.wicket.markup.html.WebPage;
+
+public class MarkupTest_Find_1 extends WebPage
+{
+
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bc62f8cc/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_2.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_2.html b/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_2.html
new file mode 100644
index 0000000..a0fa950
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_2.html
@@ -0,0 +1,60 @@
+<!--
+    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.
+-->
+<html>
+	<wicket:head>
+		<!--
+		Test find in wicket:head of subclass
+		-->
+		<link wicket:id="b1">
+	</wicket:head>
+
+	<wicket:extend>
+
+		<!--
+		test find fragment in subclass
+		-->
+		<wicket:fragment wicket:id="b2">
+
+			Something here
+			<!--
+			Test not find in fragment in subclass
+			-->
+			<span wicket:id="b3">hhh</span>
+
+		</wicket:fragment>
+
+		<!--
+		Test find in subclass
+		-->
+		<div wicket:id="b4">
+
+			<!--
+			Test not find inside component tag in sub class
+			-->
+			<div wicket:id="b5"></div>
+
+			<!--
+			Notice that <wicket:child> is inside component tag. We must still be able to find
+			components inside <wicket:extend> of subclass.
+			-->
+			<wicket:child/>
+
+			<!--
+			Test not find inside component tag after wicket:child
+			-->
+			<div wicket:id="b6"></div>
+		</div>
+
+	</wicket:extend>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/bc62f8cc/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_2.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_2.java b/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_2.java
new file mode 100644
index 0000000..26d54bc
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_2.java
@@ -0,0 +1,22 @@
+/*
+ * 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;
+
+public class MarkupTest_Find_2 extends MarkupTest_Find_1
+{
+
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bc62f8cc/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_3.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_3.html b/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_3.html
new file mode 100644
index 0000000..83f3e98
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_3.html
@@ -0,0 +1,49 @@
+<!--
+    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.
+-->
+<html>
+	<wicket:head>
+		<!--
+		Test find in wicket:head of subclass
+		-->
+		<link wicket:id="c1">
+	</wicket:head>
+
+	<wicket:extend>
+
+		<!--
+		test find fragment in subclass
+		-->
+		<wicket:fragment wicket:id="c2">
+
+			Something here
+			<!--
+			Test not find in fragment in subclass
+			-->
+			<span wicket:id="c3">hhh</span>
+
+		</wicket:fragment>
+
+		<!--
+		Test find in subclass
+		-->
+		<div wicket:id="c4">
+
+			<!--
+			Test not find inside component tag in sub class
+			-->
+			<div wicket:id="b5"></div>
+		</div>
+
+	</wicket:extend>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/bc62f8cc/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_3.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_3.java b/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_3.java
new file mode 100644
index 0000000..9b71872
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/MarkupTest_Find_3.java
@@ -0,0 +1,22 @@
+/*
+ * 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;
+
+public class MarkupTest_Find_3 extends MarkupTest_Find_2
+{
+
+}