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/03/12 15:14:14 UTC

[1/9] git commit: WICKET-5531 Create new placeholder tag to indicate where header contributions should appear

Repository: wicket
Updated Branches:
  refs/heads/wicket-6.x 6f2d651dc -> ddb7ff349


WICKET-5531 Create new placeholder tag to indicate where header contributions should appear


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

Branch: refs/heads/wicket-6.x
Commit: 0123767f798e7715ae0da81188c0e6e2e5f4a236
Parents: 6f2d651
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Tue Mar 11 18:17:24 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Tue Mar 11 18:17:24 2014 +0200

----------------------------------------------------------------------
 .../main/java/org/apache/wicket/Component.java  |  5 +-
 .../java/org/apache/wicket/MarkupContainer.java |  2 +-
 .../org/apache/wicket/markup/MergedMarkup.java  |  2 +-
 .../java/org/apache/wicket/markup/TagUtils.java | 22 ++++++++-
 .../org/apache/wicket/markup/WicketTag.java     |  8 ++++
 .../html/internal/HtmlHeaderContainer.java      | 12 +++--
 .../html/internal/HtmlHeaderItemsContainer.java | 41 +++++++++++++++++
 .../parser/filter/HtmlHeaderSectionHandler.java | 48 ++++++++++++++++++--
 .../parser/filter/OpenCloseTagExpander.java     | 11 +++--
 .../parser/filter/WicketTagIdentifier.java      |  7 +--
 .../markup/resolver/HtmlHeaderResolver.java     | 43 ++++++++++++++----
 11 files changed, 168 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/0123767f/wicket-core/src/main/java/org/apache/wicket/Component.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/Component.java b/wicket-core/src/main/java/org/apache/wicket/Component.java
index 4c43f52..6e6c7da 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Component.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Component.java
@@ -2549,11 +2549,8 @@ public abstract class Component
 				// Render the body. The default strategy will simply call the component's
 				// onComponentTagBody() implementation.
 				getMarkupSourcingStrategy().onComponentTagBody(this, markupStream, tag);
-			}
 
-			// Render close tag
-			if (tag.isOpen())
-			{
+				// Render close tag
 				if (openTag.isOpen())
 				{
 					renderClosingComponentTag(markupStream, tag, getRenderBodyOnly());

http://git-wip-us.apache.org/repos/asf/wicket/blob/0123767f/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 75ff938..85eb11c 100644
--- a/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
+++ b/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
@@ -1521,7 +1521,7 @@ public abstract class MarkupContainer extends Component implements Iterable<Comp
 			render = !openTag.hasNoCloseTag();
 		}
 
-		if (render == true)
+		if (render)
 		{
 			renderAll(markupStream, openTag);
 		}

http://git-wip-us.apache.org/repos/asf/wicket/blob/0123767f/wicket-core/src/main/java/org/apache/wicket/markup/MergedMarkup.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/MergedMarkup.java b/wicket-core/src/main/java/org/apache/wicket/markup/MergedMarkup.java
index cb173a1..eb1a6b9 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/MergedMarkup.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/MergedMarkup.java
@@ -421,7 +421,7 @@ public class MergedMarkup extends Markup
 				}
 			}
 
-			if (copy == true)
+			if (copy)
 			{
 				addMarkupElement(elem);
 			}

http://git-wip-us.apache.org/repos/asf/wicket/blob/0123767f/wicket-core/src/main/java/org/apache/wicket/markup/TagUtils.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/TagUtils.java b/wicket-core/src/main/java/org/apache/wicket/markup/TagUtils.java
index 7fd4e4d..09aa73a 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/TagUtils.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/TagUtils.java
@@ -106,7 +106,7 @@ public class TagUtils
 	}
 
 	/**
-	 * 
+	 *
 	 * @param elem
 	 * @return True if the current markup element is a &lt;wicket:head&gt; tag
 	 */
@@ -124,6 +124,24 @@ public class TagUtils
 	}
 
 	/**
+	 *
+	 * @param elem
+	 * @return True if the current markup element is a &lt;wicket:head&gt; tag
+	 */
+	public static final boolean isWicketHeaderItemsTag(final MarkupElement elem)
+	{
+		if (elem instanceof WicketTag)
+		{
+			WicketTag wtag = (WicketTag)elem;
+			if (wtag.isHeaderItemsTag())
+			{
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
 	 * 
 	 * @param elem
 	 * @return True if the current markup element is a &lt;wicket:body&gt; tag
@@ -195,4 +213,4 @@ public class TagUtils
 				"Expected a Tag but found raw markup: " + elem.toString());
 		}
 	}
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/0123767f/wicket-core/src/main/java/org/apache/wicket/markup/WicketTag.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/WicketTag.java b/wicket-core/src/main/java/org/apache/wicket/markup/WicketTag.java
index b609f7b..120d2af 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/WicketTag.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/WicketTag.java
@@ -133,6 +133,14 @@ public class WicketTag extends ComponentTag
 	}
 
 	/**
+	 * @return True, if tag name equals 'wicket:header-items'
+	 */
+	public final boolean isHeaderItemsTag()
+	{
+		return HtmlHeaderResolver.HEADER_ITEMS.equalsIgnoreCase(getName());
+	}
+
+	/**
 	 * @return True, if tag name equals 'wicket:message'
 	 */
 	public final boolean isMessageTag()

http://git-wip-us.apache.org/repos/asf/wicket/blob/0123767f/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderContainer.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderContainer.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderContainer.java
index 42e63b6..51962f7 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderContainer.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderContainer.java
@@ -48,8 +48,8 @@ import org.apache.wicket.response.StringResponse;
  * &lt;head&gt; regions may contain additional wicket components, which can be added by means of
  * add(Component) as usual.
  * <p>
- * &lt;wicket:head&gt; tags are handled by simple WebMarkupContainers also created by a
- * HtmlHeaderResolver.
+ * &lt;wicket:head&gt; tags are handled by simple {@link TransparentWebMarkupContainer}s also created by
+ * {@link org.apache.wicket.markup.resolver.HtmlHeaderResolver}.
  * <p>
  * <ul>
  * <li>&lt;head&gt; will be inserted in output automatically if required</li>
@@ -63,7 +63,7 @@ import org.apache.wicket.response.StringResponse;
  * <li>components within &lt;wicket:head&gt; must be added by means of add(), like always with
  * Wicket. No difference.</li>
  * <li>&lt;wicket:head&gt; and it's content is copied to the output. Components contained in
- * &lt;org.apache.wicket.head&gt; are rendered as usual</li>
+ * &lt;wicket:head&gt; are rendered as usual</li>
  * </ul>
  * 
  * @author Juergen Donnerstag
@@ -379,17 +379,19 @@ public class HtmlHeaderContainer extends TransparentWebMarkupContainer
 				if (tag instanceof WicketTag)
 				{
 					WicketTag wtag = (WicketTag)tag;
-					if (wtag.isHeadTag())
+					if (wtag.isHeadTag() || wtag.isHeaderItemsTag())
 					{
 						if (tag.getMarkupClass() == null)
 						{
 							headerMarkup = stream.getMarkupFragment();
+							break;
 						}
 					}
 				}
-				else if (tag.getName().equalsIgnoreCase("head"))
+				else if (tag.getName().equalsIgnoreCase("head") && tag.isAutoComponentTag())
 				{
 					headerMarkup = stream.getMarkupFragment();
+					break;
 				}
 			}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/0123767f/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainer.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainer.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainer.java
new file mode 100644
index 0000000..55490eb
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainer.java
@@ -0,0 +1,41 @@
+/*
+ * 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.internal;
+
+/**
+ */
+public class HtmlHeaderItemsContainer extends HtmlHeaderContainer
+{
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Constructor
+	 *
+	 * @param id
+	 *          The component id
+	 */
+	public HtmlHeaderItemsContainer(String id)
+	{
+		super(id);
+	}
+
+	@Override
+	protected boolean renderOpenAndCloseTags()
+	{
+		return false;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/0123767f/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java
index 4edafac..7042da2 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java
@@ -25,11 +25,12 @@ import org.apache.wicket.markup.MarkupException;
 import org.apache.wicket.markup.MarkupStream;
 import org.apache.wicket.markup.parser.AbstractMarkupFilter;
 import org.apache.wicket.markup.parser.XmlTag.TagType;
+import org.apache.wicket.markup.resolver.HtmlHeaderResolver;
 
 
 /**
- * This is a markup inline filter. It assumes that WicketTagIdentifier has been called first and
- * search for a &lt;head&gt; tag (note: not wicket:head). Provided the markup contains a
+ * This is a markup inline filter. It assumes that {@link org.apache.wicket.markup.parser.filter.WicketTagIdentifier}
+ * has been called first and search for a &lt;head&gt; tag (note: not wicket:head). Provided the markup contains a
  * &lt;body&gt; tag it will automatically prepend a &lt;head&gt; tag if missing.
  * <p>
  * Note: This handler is only relevant for Pages (see MarkupParser.newFilterChain())
@@ -45,12 +46,14 @@ public final class HtmlHeaderSectionHandler extends AbstractMarkupFilter
 	/** The automatically assigned wicket:id to &gt;head&lt; tag */
 	public static final String HEADER_ID = "_header_";
 
-	/** True if <head> has been found already */
+	/** True if &lt;head&gt; has been found already */
 	private boolean foundHead = false;
 
-	/** True if </head> has been found already */
+	/** True if &lt;/head&gt; has been found already */
 	private boolean foundClosingHead = false;
 
+	private boolean foundHeaderItemsTag = false;
+
 	/** True if all the rest of the markup file can be ignored */
 	private boolean ignoreTheRest = false;
 
@@ -97,6 +100,16 @@ public final class HtmlHeaderSectionHandler extends AbstractMarkupFilter
 				}
 				else if (tag.isClose())
 				{
+					if (foundHeaderItemsTag)
+					{
+						// revert the settings from above
+						ComponentTag headOpenTag = tag.getOpenTag();
+						headOpenTag.setId(HEADER_ID + "-Ignored");
+						headOpenTag.setAutoComponentTag(false);
+						headOpenTag.setModified(false);
+						headOpenTag.setFlag(ComponentTag.RENDER_RAW, true);
+					}
+
 					foundClosingHead = true;
 				}
 
@@ -109,6 +122,16 @@ public final class HtmlHeaderSectionHandler extends AbstractMarkupFilter
 				foundClosingHead = true;
 			}
 		}
+		else if (HtmlHeaderResolver.HEADER_ITEMS.equalsIgnoreCase(tag.getName()) &&
+				tag.getNamespace().equalsIgnoreCase(getWicketNamespace()))
+		{
+			foundHeaderItemsTag = true;
+			tag.setId(HEADER_ID);
+			tag.setAutoComponentTag(true);
+			tag.setModified(true);
+
+			return tag;
+		}
 		else if (BODY.equalsIgnoreCase(tag.getName()) && (tag.getNamespace() == null))
 		{
 			// WICKET-4511: We found <body> inside <head> tag. Markup is not valid!
@@ -132,6 +155,23 @@ public final class HtmlHeaderSectionHandler extends AbstractMarkupFilter
 		return tag;
 	}
 
+	// temporary storage. Introduce into flow on next request
+	private ComponentTag next = null;
+
+	@Override
+	public MarkupElement nextElement() throws ParseException
+	{
+		// Did we hold back an elem? Than return that first
+		if (next != null)
+		{
+			MarkupElement rtn = next;
+			next = null;
+			return rtn;
+		}
+
+		return super.nextElement();
+	}
+
 	/**
 	 * Insert <head> open and close tag (with empty body) to the current position.
 	 */

http://git-wip-us.apache.org/repos/asf/wicket/blob/0123767f/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/OpenCloseTagExpander.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/OpenCloseTagExpander.java b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/OpenCloseTagExpander.java
index 390c1f4..c8d8581 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/OpenCloseTagExpander.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/OpenCloseTagExpander.java
@@ -24,6 +24,7 @@ import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.MarkupElement;
 import org.apache.wicket.markup.parser.AbstractMarkupFilter;
 import org.apache.wicket.markup.parser.XmlTag.TagType;
+import org.apache.wicket.markup.resolver.HtmlHeaderResolver;
 
 /**
  * MarkupFilter that expands certain open-close tag as separate open and close tags. Firefox, unless
@@ -60,7 +61,7 @@ public class OpenCloseTagExpander extends AbstractMarkupFilter
 		// @TODO by now an exclude list is probably shorter
 		"article", "aside", "details", "summary", "figure", "figcaption", "footer",
 		"header", "hgroup", "mark", "meter", "nav", "progress", "ruby", "rt", "rp", "section",
-		"audio", "video", "canvas", "datalist", "output");
+		"audio", "video", "canvas", "datalist", "output", HtmlHeaderResolver.HEADER_ITEMS);
 
 	// temporary storage. Introduce into flow on next request
 	private ComponentTag next = null;
@@ -88,10 +89,10 @@ public class OpenCloseTagExpander extends AbstractMarkupFilter
 		if (tag.isOpenClose())
 		{
 			String name = tag.getName();
-			if (tag.getNamespace() != null)
-			{
-				name = tag.getNamespace() + ":" + tag.getName();
-			}
+//			if (tag.getNamespace() != null)
+//			{
+//				name = tag.getNamespace() + ":" + tag.getName();
+//			}
 
 			if (contains(name))
 			{

http://git-wip-us.apache.org/repos/asf/wicket/blob/0123767f/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 2906f69..1eac945 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
@@ -64,6 +64,7 @@ public final class WicketTagIdentifier extends AbstractMarkupFilter
 		WELL_KNOWN_TAG_NAMES.add(WicketRemoveTagHandler.REMOVE);
 		WELL_KNOWN_TAG_NAMES.add(FragmentResolver.FRAGMENT);
 		WELL_KNOWN_TAG_NAMES.add(HtmlHeaderResolver.HEAD);
+		WELL_KNOWN_TAG_NAMES.add(HtmlHeaderResolver.HEADER_ITEMS);
 		WELL_KNOWN_TAG_NAMES.add(MarkupInheritanceResolver.CHILD);
 		WELL_KNOWN_TAG_NAMES.add(MarkupInheritanceResolver.EXTEND);
 		WELL_KNOWN_TAG_NAMES.add(WicketContainerResolver.CONTAINER);
@@ -85,12 +86,12 @@ public final class WicketTagIdentifier extends AbstractMarkupFilter
 	 * Get the next tag from the next MarkupFilter in the chain and search for Wicket specific tags.
 	 * <p>
 	 * Note: The xml parser - the next MarkupFilter in the chain - returns XmlTags which are a
-	 * subclass of MarkupElement. The implementation of this filter will return either ComponentTags
-	 * or ComponentWicketTags. Both are subclasses of MarkupElement as well and both maintain a
+	 * subclass of MarkupElement. The implementation of this filter will return either ComponentTag
+	 * or WicketTag. Both are subclasses of MarkupElement and both maintain a
 	 * reference to the XmlTag. But no XmlTag is returned.
 	 * 
 	 * @see org.apache.wicket.markup.parser.IMarkupFilter#nextElement()
-	 * @return The next tag from markup to be processed. If null, no more tags are available
+	 * @return The next tag from markup to be processed. If {@code null} then no more tags are available
 	 */
 	@Override
 	protected MarkupElement onComponentTag(ComponentTag tag) throws ParseException

http://git-wip-us.apache.org/repos/asf/wicket/blob/0123767f/wicket-core/src/main/java/org/apache/wicket/markup/resolver/HtmlHeaderResolver.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/resolver/HtmlHeaderResolver.java b/wicket-core/src/main/java/org/apache/wicket/markup/resolver/HtmlHeaderResolver.java
index 4688b12..8ebe0ce 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/resolver/HtmlHeaderResolver.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/resolver/HtmlHeaderResolver.java
@@ -27,6 +27,7 @@ import org.apache.wicket.markup.html.TransparentWebMarkupContainer;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.internal.HtmlHeaderContainer;
+import org.apache.wicket.markup.html.internal.HtmlHeaderItemsContainer;
 import org.apache.wicket.markup.parser.filter.HtmlHeaderSectionHandler;
 import org.apache.wicket.markup.parser.filter.WicketTagIdentifier;
 import org.apache.wicket.util.resource.IResourceStream;
@@ -40,7 +41,7 @@ import org.apache.wicket.util.resource.IResourceStream;
  * (auto) added to the component hierarchy and immediately rendered. Please see the javadoc for
  * {@link HtmlHeaderContainer} on how it treats the tag.
  * <p>
- * In case of &lt;wicket:head&gt; a simple {@link WebMarkupContainer} handles the tag.
+ * In case of &lt;wicket:head&gt; a simple {@link TransparentWebMarkupContainer} handles the tag.
  * 
  * @author Juergen Donnerstag
  */
@@ -50,30 +51,33 @@ public class HtmlHeaderResolver implements IComponentResolver
 
 	/** */
 	public static final String HEAD = "head";
+	public static final String HEADER_ITEMS = "header-items";
 
 	@Override
 	public Component resolve(final MarkupContainer container, final MarkupStream markupStream,
 		final ComponentTag tag)
 	{
+		final Page page = container.getPage();
+
 		// Only <head> component tags have the id == "_header"
 		if (tag.getId().equals(HtmlHeaderSectionHandler.HEADER_ID))
 		{
 			// Create a special header component which will gather additional
 			// input the <head> from 'contributors'.
 			return newHtmlHeaderContainer(HtmlHeaderSectionHandler.HEADER_ID +
-				container.getPage().getAutoIndex());
+				page.getAutoIndex(), tag);
 		}
 		else if ((tag instanceof WicketTag) && ((WicketTag)tag).isHeadTag())
 		{
 			// If we found <wicket:head> without surrounding <head> on a Page,
-			// than we have to add wicket:head into a automatically generated
+			// then we have to add wicket:head into a automatically generated
 			// head first.
 			if (container instanceof WebPage)
 			{
 				// Create a special header component which will gather
 				// additional input the <head> from 'contributors'.
 				MarkupContainer header = newHtmlHeaderContainer(HtmlHeaderSectionHandler.HEADER_ID +
-					container.getPage().getAutoIndex());
+					page.getAutoIndex(), tag);
 
 				// It is <wicket:head>. Because they do not provide any
 				// additional functionality they are merely a means of surrounding relevant
@@ -99,13 +103,14 @@ public class HtmlHeaderResolver implements IComponentResolver
 
 				return header;
 			}
-			final Page page = container.getPage();
+
 			final String pageClassName = (page != null) ? page.getClass().getName() : "unknown";
 			final IResourceStream stream = markupStream.getResource();
 			final String streamName = (stream != null) ? stream.toString() : "unknown";
 
 			throw new MarkupException(
-				"Mis-placed <wicket:head>. <wicket:head> must be outside of <wicket:panel>, <wicket:border>, and <wicket:extend>. Error occured while rendering page: " +
+				"Mis-placed <wicket:head>. <wicket:head> must be outside of <wicket:panel>, <wicket:border>, " +
+						"and <wicket:extend>. Error occurred while rendering page: " +
 					pageClassName + " using markup stream: " + streamName);
 		}
 
@@ -115,12 +120,34 @@ public class HtmlHeaderResolver implements IComponentResolver
 
 	/**
 	 * Return a new HtmlHeaderContainer
-	 * 
+	 *
 	 * @param id
 	 * @return HtmlHeaderContainer
+	 * @deprecated Use #newHtmlHeaderContainer(String, ComponentTag) instead
 	 */
+	@Deprecated
 	protected HtmlHeaderContainer newHtmlHeaderContainer(String id)
 	{
 		return new HtmlHeaderContainer(id);
 	}
-}
\ No newline at end of file
+
+	/**
+	 * Return a new HtmlHeaderContainer
+	 *
+	 * @param id
+	 * @return HtmlHeaderContainer
+	 */
+	protected HtmlHeaderContainer newHtmlHeaderContainer(String id, ComponentTag tag)
+	{
+		HtmlHeaderContainer htmlHeaderContainer;
+		if (HtmlHeaderResolver.HEADER_ITEMS.equalsIgnoreCase(tag.getName()))
+		{
+			htmlHeaderContainer = new HtmlHeaderItemsContainer(id);
+		}
+		else
+		{
+			htmlHeaderContainer = newHtmlHeaderContainer(id);
+		}
+		return htmlHeaderContainer;
+	}
+}


[7/9] git commit: WICKET-5531 Create new placeholder tag to indicate where header contributions should appear

Posted by mg...@apache.org.
WICKET-5531 Create new placeholder tag to indicate where header contributions should appear

Remove the usage of the tag namespace when checking where the tag should be transformed from openClose to open+close.
The namespace is dynamic (it depends) on the xmlns: for the page. We cannot hardcode namespaces in the list of tags to expand


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

Branch: refs/heads/wicket-6.x
Commit: 66fd9d41b24ac4010542d75f4566bf9978f7728b
Parents: b77ce25
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Mar 12 11:52:54 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Wed Mar 12 11:52:54 2014 +0200

----------------------------------------------------------------------
 .../wicket/markup/parser/filter/OpenCloseTagExpander.java     | 7 -------
 1 file changed, 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/66fd9d41/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/OpenCloseTagExpander.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/OpenCloseTagExpander.java b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/OpenCloseTagExpander.java
index c8d8581..7b0ddfe 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/OpenCloseTagExpander.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/OpenCloseTagExpander.java
@@ -80,19 +80,12 @@ public class OpenCloseTagExpander extends AbstractMarkupFilter
 		return super.nextElement();
 	}
 
-	/**
-	 * 
-	 */
 	@Override
 	protected MarkupElement onComponentTag(final ComponentTag tag) throws ParseException
 	{
 		if (tag.isOpenClose())
 		{
 			String name = tag.getName();
-//			if (tag.getNamespace() != null)
-//			{
-//				name = tag.getNamespace() + ":" + tag.getName();
-//			}
 
 			if (contains(name))
 			{


[8/9] git commit: WICKET-5531 Create new placeholder tag to indicate where header contributions should appear

Posted by mg...@apache.org.
WICKET-5531 Create new placeholder tag to indicate where header contributions should appear

extend HtmlHeaderSectionHandler javadoc to mention <wicket:header-items/>


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

Branch: refs/heads/wicket-6.x
Commit: 3e053192a1ed9e5def6090e98e92216e997e7925
Parents: 66fd9d4
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Mar 12 11:59:21 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Wed Mar 12 11:59:21 2014 +0200

----------------------------------------------------------------------
 .../markup/parser/filter/HtmlHeaderSectionHandler.java   | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/3e053192/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java
index 9de69fe..0f85964 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java
@@ -29,13 +29,22 @@ import org.apache.wicket.markup.resolver.HtmlHeaderResolver;
 
 
 /**
- * This is a markup inline filter. It assumes that {@link org.apache.wicket.markup.parser.filter.WicketTagIdentifier}
+ * This is a markup inline filter.
+ * <p>
+ * It assumes that {@link org.apache.wicket.markup.parser.filter.WicketTagIdentifier}
  * has been called first and search for a &lt;head&gt; tag (note: not wicket:head). Provided the markup contains a
  * &lt;body&gt; tag it will automatically prepend a &lt;head&gt; tag if missing.
+ * </p>
+ * <p>
+ * Additionally this filter handles &lt;wicket:header-items/&gt;. If there is such tag then it is marked
+ * as the one that should be used as {@link org.apache.wicket.markup.html.internal.HtmlHeaderContainer}, by
+ * setting its id to {@value #HEADER_ID}.
+ * </p>
  * <p>
  * Note: This handler is only relevant for Pages (see MarkupParser.newFilterChain())
  * 
  * @see org.apache.wicket.markup.MarkupParser
+ * @see org.apache.wicket.markup.resolver.HtmlHeaderResolver
  * @author Juergen Donnerstag
  */
 public final class HtmlHeaderSectionHandler extends AbstractMarkupFilter


[5/9] git commit: WICKET-5531 Create new placeholder tag to indicate where header contributions should appear

Posted by mg...@apache.org.
WICKET-5531 Create new placeholder tag to indicate where header contributions should appear


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

Branch: refs/heads/wicket-6.x
Commit: a3aec20d2e4c489b26dbd796d9a8efbfe3354b05
Parents: 5da0113
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Mar 12 11:44:55 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Wed Mar 12 11:44:55 2014 +0200

----------------------------------------------------------------------
 .../parser/filter/HtmlHeaderSectionHandler.java |  11 ++
 .../internal/HtmlHeaderItemsContainerTest.java  | 140 -----------------
 .../HtmlHeaderItemsContainerTest.java           | 157 +++++++++++++++++++
 .../PageWithHeaderItemsOutOfHead.html           |  21 +++
 .../PageWithHeaderItemsOutOfHead.java           |  27 ++++
 .../headeritems/PageWithTwoHeaderItems.html     |  22 +++
 .../headeritems/PageWithTwoHeaderItems.java     |  27 ++++
 7 files changed, 265 insertions(+), 140 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/a3aec20d/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java
index 7042da2..0536d95 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java
@@ -125,6 +125,17 @@ public final class HtmlHeaderSectionHandler extends AbstractMarkupFilter
 		else if (HtmlHeaderResolver.HEADER_ITEMS.equalsIgnoreCase(tag.getName()) &&
 				tag.getNamespace().equalsIgnoreCase(getWicketNamespace()))
 		{
+			if (foundHeaderItemsTag)
+			{
+				throw new MarkupException(new MarkupStream(markup),
+						"More than one <wicket:header-items/> detected in the <head> element. Only one is allowed.");
+			}
+			else if (foundClosingHead)
+			{
+				throw new MarkupException(new MarkupStream(markup),
+						"Detected <wicket:header-items/> after the closing </head> element.");
+			}
+
 			foundHeaderItemsTag = true;
 			tag.setId(HEADER_ID);
 			tag.setAutoComponentTag(true);

http://git-wip-us.apache.org/repos/asf/wicket/blob/a3aec20d/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainerTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainerTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainerTest.java
deleted file mode 100644
index 37ae40c..0000000
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainerTest.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * 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.internal;
-
-import static org.hamcrest.number.OrderingComparison.lessThan;
-
-import org.apache.wicket.WicketTestCase;
-import org.apache.wicket.markup.html.internal.headeritems.PageWithHeaderItems;
-import org.apache.wicket.markup.html.internal.headeritems.PageWithoutHeaderItems;
-import org.apache.wicket.markup.html.internal.headeritems.SubPageWithHeaderItemsAndWicketHead;
-import org.apache.wicket.markup.html.internal.headeritems.SubPageWithoutHeaderItemsAndWicketHead;
-import org.junit.Test;
-
-/**
- * Tests for <wicket:header-items/> element
- */
-public class HtmlHeaderItemsContainerTest extends WicketTestCase
-{
-	@Test
-	public void withHeaderItems()
-	{
-		tester.startPage(PageWithHeaderItems.class);
-		String responseAsString = tester.getLastResponseAsString();
-//		System.err.println("RES:\n" + responseAsString);
-		int idxMetaCharset = responseAsString.indexOf("<meta charset=\"utf-8\"");
-		int idxMetaPanelWicketHead = responseAsString.indexOf("meta name=\"panel-wicket-head\"");
-		int idxWicketAjaxJs = responseAsString.indexOf("wicket-ajax-jquery.js");
-		int idxTitleElement = responseAsString.indexOf("<title>Apache Wicket Quickstart</title>");
-		int idxMetaFromBasePage = responseAsString.indexOf("<meta name='fromBasePage' content='1'");
-
-		assertThat("<meta charset> should be rendered before <meta name=\"panel-wicket-head\"",
-				idxMetaCharset, lessThan(idxMetaPanelWicketHead));
-
-		assertThat("<meta  name=\"panel-wicket-head\"> should be rendered before <script src=wicket-ajax-jquery.js>",
-				idxMetaPanelWicketHead, lessThan(idxWicketAjaxJs));
-
-		assertThat("<script src=wicket-ajax-jquery.js> should be rendered before the <title> element",
-				idxWicketAjaxJs, lessThan(idxTitleElement));
-
-		assertThat("<meta name='fromBasePage'> should be rendered before the <title> element",
-				idxMetaFromBasePage, lessThan(idxTitleElement));
-	}
-
-	@Test
-	public void withoutHeaderItems()
-	{
-		tester.startPage(PageWithoutHeaderItems.class);
-		String responseAsString = tester.getLastResponseAsString();
-//		System.err.println("RES:\n" + responseAsString);
-		int idxMetaCharset = responseAsString.indexOf("<meta charset=\"utf-8\"");
-		int idxMetaPanelWicketHead = responseAsString.indexOf("meta name=\"panel-wicket-head\"");
-		int idxWicketAjaxJs = responseAsString.indexOf("wicket-ajax-jquery.js");
-		int idxTitleElement = responseAsString.indexOf("<title>Apache Wicket Quickstart</title>");
-		int idxMetaFromBasePage = responseAsString.indexOf("<meta name='fromBasePage' content='1'");
-
-		assertThat("<meta name=\"panel-wicket-head\"> should be rendered before <script src=wicket-ajax-jquery.js>",
-				idxMetaPanelWicketHead, lessThan(idxWicketAjaxJs));
-
-		assertThat("<script src=wicket-ajax-jquery.js> should be rendered before <meta charset>",
-				idxWicketAjaxJs, lessThan(idxMetaCharset));
-
-		assertThat("<meta charset> should be rendered before the <title> element",
-				idxMetaCharset, lessThan(idxTitleElement));
-
-		assertThat("<title> should be rendered before the <meta name='fromBasePage'> element",
-				idxTitleElement, lessThan(idxMetaFromBasePage));
-	}
-
-	@Test
-	public void withoutHeaderItemsWithWicketHead()
-	{
-		tester.startPage(SubPageWithoutHeaderItemsAndWicketHead.class);
-		String responseAsString = tester.getLastResponseAsString();
-//		System.err.println("RES:\n" + responseAsString);
-		int idxMetaCharset = responseAsString.indexOf("<meta charset=\"utf-8\"");
-		int idxMetaPanelWicketHead = responseAsString.indexOf("meta name=\"panel-wicket-head\"");
-		int idxWicketAjaxJs = responseAsString.indexOf("wicket-ajax-jquery.js");
-		int idxTitleElement = responseAsString.indexOf("<title>Apache Wicket Quickstart</title>");
-		int idxMetaFromBasePage = responseAsString.indexOf("<meta name='fromBasePage' content='1'");
-		int idxMetaFromSubPage = responseAsString.indexOf("<meta name=\"SubPageWithoutHeaderItemsAndWicketHead\"");
-
-		assertThat("<meta name=\"panel-wicket-head\"> should be rendered before <script src=wicket-ajax-jquery.js>",
-				idxMetaPanelWicketHead, lessThan(idxWicketAjaxJs));
-
-		assertThat("<script src=wicket-ajax-jquery.js> should be rendered before <meta charset>",
-				idxWicketAjaxJs, lessThan(idxMetaCharset));
-
-		assertThat("<meta charset> should be rendered before the <title> element",
-				idxMetaCharset, lessThan(idxTitleElement));
-
-		assertThat("<title> should be rendered before the <meta name=\"SubPageWithoutHeaderItemsAndWicketHead\" element",
-				idxTitleElement, lessThan(idxMetaFromSubPage));
-
-		assertThat("<meta name='fromBasePage'> should be rendered before the <meta name=\"SubPageWithoutHeaderItemsAndWicketHead\" element",
-				idxMetaFromSubPage, lessThan(idxMetaFromBasePage));
-	}
-
-	@Test
-	public void withHeaderItemsWithWicketHead()
-	{
-		tester.startPage(SubPageWithHeaderItemsAndWicketHead.class);
-		String responseAsString = tester.getLastResponseAsString();
-//		System.err.println("RES:\n" + responseAsString);
-		int idxMetaCharset = responseAsString.indexOf("<meta charset=\"utf-8\"");
-		int idxMetaPanelWicketHead = responseAsString.indexOf("meta name=\"panel-wicket-head\"");
-		int idxWicketAjaxJs = responseAsString.indexOf("wicket-ajax-jquery.js");
-		int idxTitleElement = responseAsString.indexOf("<title>Apache Wicket Quickstart</title>");
-		int idxMetaFromBasePage = responseAsString.indexOf("<meta name='fromBasePage' content='1'");
-		int idxMetaFromSubPage = responseAsString.indexOf("<meta name=\"SubPageWithHeaderItemsAndWicketHead\"");
-
-		assertThat("<meta charset> should be rendered before <meta name=\"panel-wicket-head\"",
-				idxMetaCharset, lessThan(idxMetaPanelWicketHead));
-
-		assertThat("<meta  name=\"panel-wicket-head\"> should be rendered before <script src=wicket-ajax-jquery.js>",
-				idxMetaPanelWicketHead, lessThan(idxWicketAjaxJs));
-
-		assertThat("<script src=wicket-ajax-jquery.js> should be rendered before the <title> element",
-				idxWicketAjaxJs, lessThan(idxTitleElement));
-
-		assertThat("<meta name=\"SubPageWithoutHeaderItemsAndWicketHead\"> should be rendered before the <meta name='fromBasePage'> element",
-				idxMetaFromSubPage, lessThan(idxMetaFromBasePage));
-
-		assertThat("<meta name='fromBasePage'> should be rendered before the <title> element",
-				idxMetaFromBasePage, lessThan(idxTitleElement));
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/a3aec20d/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/HtmlHeaderItemsContainerTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/HtmlHeaderItemsContainerTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/HtmlHeaderItemsContainerTest.java
new file mode 100644
index 0000000..f1602cc
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/HtmlHeaderItemsContainerTest.java
@@ -0,0 +1,157 @@
+/*
+ * 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.internal.headeritems;
+
+import static org.hamcrest.number.OrderingComparison.lessThan;
+
+import org.apache.wicket.WicketTestCase;
+import org.apache.wicket.markup.MarkupException;
+import org.junit.Test;
+
+/**
+ * Tests for <wicket:header-items/> element
+ */
+public class HtmlHeaderItemsContainerTest extends WicketTestCase
+{
+	@Test
+	public void withHeaderItems()
+	{
+		tester.startPage(PageWithHeaderItems.class);
+		String responseAsString = tester.getLastResponseAsString();
+//		System.err.println("RES:\n" + responseAsString);
+		int idxMetaCharset = responseAsString.indexOf("<meta charset=\"utf-8\"");
+		int idxMetaPanelWicketHead = responseAsString.indexOf("meta name=\"panel-wicket-head\"");
+		int idxWicketAjaxJs = responseAsString.indexOf("wicket-ajax-jquery.js");
+		int idxTitleElement = responseAsString.indexOf("<title>Apache Wicket Quickstart</title>");
+		int idxMetaFromBasePage = responseAsString.indexOf("<meta name='fromBasePage' content='1'");
+
+		assertThat("<meta charset> should be rendered before <meta name=\"panel-wicket-head\"",
+				idxMetaCharset, lessThan(idxMetaPanelWicketHead));
+
+		assertThat("<meta  name=\"panel-wicket-head\"> should be rendered before <script src=wicket-ajax-jquery.js>",
+				idxMetaPanelWicketHead, lessThan(idxWicketAjaxJs));
+
+		assertThat("<script src=wicket-ajax-jquery.js> should be rendered before the <title> element",
+				idxWicketAjaxJs, lessThan(idxTitleElement));
+
+		assertThat("<meta name='fromBasePage'> should be rendered before the <title> element",
+				idxMetaFromBasePage, lessThan(idxTitleElement));
+	}
+
+	@Test
+	public void withoutHeaderItems()
+	{
+		tester.startPage(PageWithoutHeaderItems.class);
+		String responseAsString = tester.getLastResponseAsString();
+//		System.err.println("RES:\n" + responseAsString);
+		int idxMetaCharset = responseAsString.indexOf("<meta charset=\"utf-8\"");
+		int idxMetaPanelWicketHead = responseAsString.indexOf("meta name=\"panel-wicket-head\"");
+		int idxWicketAjaxJs = responseAsString.indexOf("wicket-ajax-jquery.js");
+		int idxTitleElement = responseAsString.indexOf("<title>Apache Wicket Quickstart</title>");
+		int idxMetaFromBasePage = responseAsString.indexOf("<meta name='fromBasePage' content='1'");
+
+		assertThat("<meta name=\"panel-wicket-head\"> should be rendered before <script src=wicket-ajax-jquery.js>",
+				idxMetaPanelWicketHead, lessThan(idxWicketAjaxJs));
+
+		assertThat("<script src=wicket-ajax-jquery.js> should be rendered before <meta charset>",
+				idxWicketAjaxJs, lessThan(idxMetaCharset));
+
+		assertThat("<meta charset> should be rendered before the <title> element",
+				idxMetaCharset, lessThan(idxTitleElement));
+
+		assertThat("<title> should be rendered before the <meta name='fromBasePage'> element",
+				idxTitleElement, lessThan(idxMetaFromBasePage));
+	}
+
+	@Test
+	public void withoutHeaderItemsWithWicketHead()
+	{
+		tester.startPage(SubPageWithoutHeaderItemsAndWicketHead.class);
+		String responseAsString = tester.getLastResponseAsString();
+//		System.err.println("RES:\n" + responseAsString);
+		int idxMetaCharset = responseAsString.indexOf("<meta charset=\"utf-8\"");
+		int idxMetaPanelWicketHead = responseAsString.indexOf("meta name=\"panel-wicket-head\"");
+		int idxWicketAjaxJs = responseAsString.indexOf("wicket-ajax-jquery.js");
+		int idxTitleElement = responseAsString.indexOf("<title>Apache Wicket Quickstart</title>");
+		int idxMetaFromBasePage = responseAsString.indexOf("<meta name='fromBasePage' content='1'");
+		int idxMetaFromSubPage = responseAsString.indexOf("<meta name=\"SubPageWithoutHeaderItemsAndWicketHead\"");
+
+		assertThat("<meta name=\"panel-wicket-head\"> should be rendered before <script src=wicket-ajax-jquery.js>",
+				idxMetaPanelWicketHead, lessThan(idxWicketAjaxJs));
+
+		assertThat("<script src=wicket-ajax-jquery.js> should be rendered before <meta charset>",
+				idxWicketAjaxJs, lessThan(idxMetaCharset));
+
+		assertThat("<meta charset> should be rendered before the <title> element",
+				idxMetaCharset, lessThan(idxTitleElement));
+
+		assertThat("<title> should be rendered before the <meta name=\"SubPageWithoutHeaderItemsAndWicketHead\" element",
+				idxTitleElement, lessThan(idxMetaFromSubPage));
+
+		assertThat("<meta name='fromBasePage'> should be rendered before the <meta name=\"SubPageWithoutHeaderItemsAndWicketHead\" element",
+				idxMetaFromSubPage, lessThan(idxMetaFromBasePage));
+	}
+
+	@Test
+	public void withHeaderItemsWithWicketHead()
+	{
+		tester.startPage(SubPageWithHeaderItemsAndWicketHead.class);
+		String responseAsString = tester.getLastResponseAsString();
+//		System.err.println("RES:\n" + responseAsString);
+		int idxMetaCharset = responseAsString.indexOf("<meta charset=\"utf-8\"");
+		int idxMetaPanelWicketHead = responseAsString.indexOf("meta name=\"panel-wicket-head\"");
+		int idxWicketAjaxJs = responseAsString.indexOf("wicket-ajax-jquery.js");
+		int idxTitleElement = responseAsString.indexOf("<title>Apache Wicket Quickstart</title>");
+		int idxMetaFromBasePage = responseAsString.indexOf("<meta name='fromBasePage' content='1'");
+		int idxMetaFromSubPage = responseAsString.indexOf("<meta name=\"SubPageWithHeaderItemsAndWicketHead\"");
+
+		assertThat("<meta charset> should be rendered before <meta name=\"panel-wicket-head\"",
+				idxMetaCharset, lessThan(idxMetaPanelWicketHead));
+
+		assertThat("<meta  name=\"panel-wicket-head\"> should be rendered before <script src=wicket-ajax-jquery.js>",
+				idxMetaPanelWicketHead, lessThan(idxWicketAjaxJs));
+
+		assertThat("<script src=wicket-ajax-jquery.js> should be rendered before the <title> element",
+				idxWicketAjaxJs, lessThan(idxTitleElement));
+
+		assertThat("<meta name=\"SubPageWithoutHeaderItemsAndWicketHead\"> should be rendered before the <meta name='fromBasePage'> element",
+				idxMetaFromSubPage, lessThan(idxMetaFromBasePage));
+
+		assertThat("<meta name='fromBasePage'> should be rendered before the <title> element",
+				idxMetaFromBasePage, lessThan(idxTitleElement));
+	}
+
+	/**
+	 * Only one <wicket:header-items/> is allowed only in <head>
+	 * @see org.apache.wicket.markup.parser.filter.HtmlHeaderSectionHandler
+	 */
+	@Test(expected = MarkupException.class)
+	public void pageWithTwoHeaderItems()
+	{
+		tester.startPage(PageWithTwoHeaderItems.class);
+	}
+
+	/**
+	 * <wicket:header-items/> is allowed only in <head>
+	 * @see org.apache.wicket.markup.parser.filter.HtmlHeaderSectionHandler
+	 */
+	@Test(expected = MarkupException.class)
+	public void pageWithHeaderItemsOutOfHead()
+	{
+		tester.startPage(PageWithHeaderItemsOutOfHead.class);
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/a3aec20d/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithHeaderItemsOutOfHead.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithHeaderItemsOutOfHead.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithHeaderItemsOutOfHead.html
new file mode 100644
index 0000000..99b0834
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithHeaderItemsOutOfHead.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html xmlns:wicket="http://wicket.apache.org">
+	<head>
+		<meta charset="utf-8" />
+		<title>Apache Wicket Quickstart</title>
+	</head>
+    <wicket:header-items/>
+	<body>
+        <div id="hd">
+			<div id="logo">
+				<h1>Apache Wicket</h1>
+			</div>
+		</div>
+		<div id="bd">
+            <div wicket:id="panel"></div>
+            <wicket:child/>
+		</div>
+		<div id="ft">
+		</div>
+	</body>
+</html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/a3aec20d/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithHeaderItemsOutOfHead.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithHeaderItemsOutOfHead.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithHeaderItemsOutOfHead.java
new file mode 100644
index 0000000..29249de
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithHeaderItemsOutOfHead.java
@@ -0,0 +1,27 @@
+/*
+ * 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.internal.headeritems;
+
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+public class PageWithHeaderItemsOutOfHead extends BasePage {
+	private static final long serialVersionUID = 1L;
+
+	public PageWithHeaderItemsOutOfHead(final PageParameters parameters) {
+		super(parameters);
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/a3aec20d/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithTwoHeaderItems.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithTwoHeaderItems.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithTwoHeaderItems.html
new file mode 100644
index 0000000..82cbe0b
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithTwoHeaderItems.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html xmlns:wicket="http://wicket.apache.org">
+	<head>
+		<meta charset="utf-8" />
+        <wicket:header-items/>
+		<title>Apache Wicket Quickstart</title>
+        <wicket:header-items/>
+	</head>
+	<body>
+		<div id="hd">
+			<div id="logo">
+				<h1>Apache Wicket</h1>
+			</div>
+		</div>
+		<div id="bd">
+            <div wicket:id="panel"></div>
+            <wicket:child/>
+		</div>
+		<div id="ft">
+		</div>
+	</body>
+</html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/a3aec20d/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithTwoHeaderItems.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithTwoHeaderItems.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithTwoHeaderItems.java
new file mode 100644
index 0000000..a70331a
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithTwoHeaderItems.java
@@ -0,0 +1,27 @@
+/*
+ * 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.internal.headeritems;
+
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+public class PageWithTwoHeaderItems extends BasePage {
+	private static final long serialVersionUID = 1L;
+
+	public PageWithTwoHeaderItems(final PageParameters parameters) {
+		super(parameters);
+	}
+}


[3/9] git commit: Fix copy/paste error

Posted by mg...@apache.org.
Fix copy/paste error


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

Branch: refs/heads/wicket-6.x
Commit: b32ba89897186526e6f277aca10e379f1f606e79
Parents: 8ac36a6
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Mar 12 11:27:54 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Wed Mar 12 11:27:54 2014 +0200

----------------------------------------------------------------------
 wicket-core/src/main/java/org/apache/wicket/markup/TagUtils.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/b32ba898/wicket-core/src/main/java/org/apache/wicket/markup/TagUtils.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/TagUtils.java b/wicket-core/src/main/java/org/apache/wicket/markup/TagUtils.java
index 09aa73a..d1168f2 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/TagUtils.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/TagUtils.java
@@ -126,7 +126,7 @@ public class TagUtils
 	/**
 	 *
 	 * @param elem
-	 * @return True if the current markup element is a &lt;wicket:head&gt; tag
+	 * @return True if the current markup element is a &lt;wicket:header-items&gt; tag
 	 */
 	public static final boolean isWicketHeaderItemsTag(final MarkupElement elem)
 	{


[9/9] git commit: Use tabs, as in the rest of the file

Posted by mg...@apache.org.
Use tabs, as in the rest of the file


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

Branch: refs/heads/wicket-6.x
Commit: ddb7ff3498167b632869e48703042a043d8fdef2
Parents: 3e05319
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Mar 12 12:00:56 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Wed Mar 12 12:00:56 2014 +0200

----------------------------------------------------------------------
 .../src/main/resources/META-INF/wicket-1.5.xsd        | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/ddb7ff34/wicket-core/src/main/resources/META-INF/wicket-1.5.xsd
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/resources/META-INF/wicket-1.5.xsd b/wicket-core/src/main/resources/META-INF/wicket-1.5.xsd
index 9c5c1c0..38c975c 100644
--- a/wicket-core/src/main/resources/META-INF/wicket-1.5.xsd
+++ b/wicket-core/src/main/resources/META-INF/wicket-1.5.xsd
@@ -146,13 +146,13 @@
 		<complexType />
 	</element>
 
-    <element name="header-items">
-        <annotation>
-            <documentation><![CDATA[A special element that is used as a placeholder inside the HTML <head>
-            element. Wicket will replace it with all header contributions.]]></documentation>
-        </annotation>
-        <complexType />
-    </element>
+	<element name="header-items">
+		<annotation>
+			<documentation><![CDATA[A special element that is used as a placeholder inside the HTML <head>
+			element. Wicket will replace it with all header contributions.]]></documentation>
+		</annotation>
+		<complexType />
+	</element>
 
 	<element name="container">
 		<annotation>


[4/9] git commit: Improve the javadoc of HtmlHeaderItemsContainer

Posted by mg...@apache.org.
Improve the javadoc of HtmlHeaderItemsContainer


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

Branch: refs/heads/wicket-6.x
Commit: 5da01132fdbc4bf8344f5d963230c5f5dd976bbb
Parents: b32ba89
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Mar 12 11:30:34 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Wed Mar 12 11:30:34 2014 +0200

----------------------------------------------------------------------
 .../wicket/markup/html/internal/HtmlHeaderItemsContainer.java   | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/5da01132/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainer.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainer.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainer.java
index e7914d0..636eac3 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainer.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainer.java
@@ -18,7 +18,10 @@ package org.apache.wicket.markup.html.internal;
 
 /**
  * A specialization of HtmlHeaderContainer that doesn't render
- * &lt;head&gt; and &l;/head&gt; around the header contributions
+ * &lt;head&gt; and &l;/head&gt; around the header contributions.
+ *
+ * This container is used when there is a usage of &lt;wicket:header-items/&gt;
+ * in the page's &lt;head&gt; element.
  */
 public class HtmlHeaderItemsContainer extends HtmlHeaderContainer
 {


[6/9] git commit: WICKET-5531 Create new placeholder tag to indicate where header contributions should appear

Posted by mg...@apache.org.
WICKET-5531 Create new placeholder tag to indicate where header contributions should appear

Remove a method that is no more needed.
The addition of the closing tag for <wicket:header-items/> is now done in OpenCloseTagExpander


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

Branch: refs/heads/wicket-6.x
Commit: b77ce25776947005377cb6c9496954dc1b9be7f2
Parents: a3aec20
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Mar 12 11:49:26 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Wed Mar 12 11:49:26 2014 +0200

----------------------------------------------------------------------
 .../parser/filter/HtmlHeaderSectionHandler.java   | 18 +-----------------
 1 file changed, 1 insertion(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/b77ce257/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java
index 0536d95..9de69fe 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java
@@ -104,6 +104,7 @@ public final class HtmlHeaderSectionHandler extends AbstractMarkupFilter
 					{
 						// revert the settings from above
 						ComponentTag headOpenTag = tag.getOpenTag();
+						// change the id because it is special. See HtmlHeaderResolver
 						headOpenTag.setId(HEADER_ID + "-Ignored");
 						headOpenTag.setAutoComponentTag(false);
 						headOpenTag.setModified(false);
@@ -166,23 +167,6 @@ public final class HtmlHeaderSectionHandler extends AbstractMarkupFilter
 		return tag;
 	}
 
-	// temporary storage. Introduce into flow on next request
-	private ComponentTag next = null;
-
-	@Override
-	public MarkupElement nextElement() throws ParseException
-	{
-		// Did we hold back an elem? Than return that first
-		if (next != null)
-		{
-			MarkupElement rtn = next;
-			next = null;
-			return rtn;
-		}
-
-		return super.nextElement();
-	}
-
 	/**
 	 * Insert <head> open and close tag (with empty body) to the current position.
 	 */


[2/9] git commit: WICKET-5531 Create new placeholder tag to indicate where header contributions should appear

Posted by mg...@apache.org.
WICKET-5531 Create new placeholder tag to indicate where header contributions should appear


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

Branch: refs/heads/wicket-6.x
Commit: 8ac36a6c9c1d958b1a7846792e0e7604e0fcd962
Parents: 0123767
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Mar 12 10:59:07 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Wed Mar 12 10:59:07 2014 +0200

----------------------------------------------------------------------
 .../html/internal/HtmlHeaderItemsContainer.java |   2 +
 .../src/main/resources/META-INF/wicket-1.5.xsd  |  10 +-
 .../internal/HtmlHeaderItemsContainerTest.java  | 140 +++++++++++++++++++
 .../html/internal/headeritems/BasePage.java     |  44 ++++++
 .../headeritems/PageWithHeaderItems.html        |  21 +++
 .../headeritems/PageWithHeaderItems.java        |  27 ++++
 .../headeritems/PageWithoutHeaderItems.html     |  20 +++
 .../headeritems/PageWithoutHeaderItems.java     |  27 ++++
 .../html/internal/headeritems/PanelA.html       |  11 ++
 .../html/internal/headeritems/PanelA.java       |  41 ++++++
 .../SubPageWithHeaderItemsAndWicketHead.html    |   9 ++
 .../SubPageWithHeaderItemsAndWicketHead.java    |  27 ++++
 .../SubPageWithoutHeaderItemsAndWicketHead.html |   9 ++
 .../SubPageWithoutHeaderItemsAndWicketHead.java |  27 ++++
 14 files changed, 414 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/8ac36a6c/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainer.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainer.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainer.java
index 55490eb..e7914d0 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainer.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainer.java
@@ -17,6 +17,8 @@
 package org.apache.wicket.markup.html.internal;
 
 /**
+ * A specialization of HtmlHeaderContainer that doesn't render
+ * &lt;head&gt; and &l;/head&gt; around the header contributions
  */
 public class HtmlHeaderItemsContainer extends HtmlHeaderContainer
 {

http://git-wip-us.apache.org/repos/asf/wicket/blob/8ac36a6c/wicket-core/src/main/resources/META-INF/wicket-1.5.xsd
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/resources/META-INF/wicket-1.5.xsd b/wicket-core/src/main/resources/META-INF/wicket-1.5.xsd
index 419df57..9c5c1c0 100644
--- a/wicket-core/src/main/resources/META-INF/wicket-1.5.xsd
+++ b/wicket-core/src/main/resources/META-INF/wicket-1.5.xsd
@@ -146,6 +146,14 @@
 		<complexType />
 	</element>
 
+    <element name="header-items">
+        <annotation>
+            <documentation><![CDATA[A special element that is used as a placeholder inside the HTML <head>
+            element. Wicket will replace it with all header contributions.]]></documentation>
+        </annotation>
+        <complexType />
+    </element>
+
 	<element name="container">
 		<annotation>
 			<documentation>A tag to which you can attach a wicket component but
@@ -294,4 +302,4 @@
 			</documentation>
 		</annotation>
 	</element>
-</schema>
\ No newline at end of file
+</schema>

http://git-wip-us.apache.org/repos/asf/wicket/blob/8ac36a6c/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainerTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainerTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainerTest.java
new file mode 100644
index 0000000..37ae40c
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainerTest.java
@@ -0,0 +1,140 @@
+/*
+ * 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.internal;
+
+import static org.hamcrest.number.OrderingComparison.lessThan;
+
+import org.apache.wicket.WicketTestCase;
+import org.apache.wicket.markup.html.internal.headeritems.PageWithHeaderItems;
+import org.apache.wicket.markup.html.internal.headeritems.PageWithoutHeaderItems;
+import org.apache.wicket.markup.html.internal.headeritems.SubPageWithHeaderItemsAndWicketHead;
+import org.apache.wicket.markup.html.internal.headeritems.SubPageWithoutHeaderItemsAndWicketHead;
+import org.junit.Test;
+
+/**
+ * Tests for <wicket:header-items/> element
+ */
+public class HtmlHeaderItemsContainerTest extends WicketTestCase
+{
+	@Test
+	public void withHeaderItems()
+	{
+		tester.startPage(PageWithHeaderItems.class);
+		String responseAsString = tester.getLastResponseAsString();
+//		System.err.println("RES:\n" + responseAsString);
+		int idxMetaCharset = responseAsString.indexOf("<meta charset=\"utf-8\"");
+		int idxMetaPanelWicketHead = responseAsString.indexOf("meta name=\"panel-wicket-head\"");
+		int idxWicketAjaxJs = responseAsString.indexOf("wicket-ajax-jquery.js");
+		int idxTitleElement = responseAsString.indexOf("<title>Apache Wicket Quickstart</title>");
+		int idxMetaFromBasePage = responseAsString.indexOf("<meta name='fromBasePage' content='1'");
+
+		assertThat("<meta charset> should be rendered before <meta name=\"panel-wicket-head\"",
+				idxMetaCharset, lessThan(idxMetaPanelWicketHead));
+
+		assertThat("<meta  name=\"panel-wicket-head\"> should be rendered before <script src=wicket-ajax-jquery.js>",
+				idxMetaPanelWicketHead, lessThan(idxWicketAjaxJs));
+
+		assertThat("<script src=wicket-ajax-jquery.js> should be rendered before the <title> element",
+				idxWicketAjaxJs, lessThan(idxTitleElement));
+
+		assertThat("<meta name='fromBasePage'> should be rendered before the <title> element",
+				idxMetaFromBasePage, lessThan(idxTitleElement));
+	}
+
+	@Test
+	public void withoutHeaderItems()
+	{
+		tester.startPage(PageWithoutHeaderItems.class);
+		String responseAsString = tester.getLastResponseAsString();
+//		System.err.println("RES:\n" + responseAsString);
+		int idxMetaCharset = responseAsString.indexOf("<meta charset=\"utf-8\"");
+		int idxMetaPanelWicketHead = responseAsString.indexOf("meta name=\"panel-wicket-head\"");
+		int idxWicketAjaxJs = responseAsString.indexOf("wicket-ajax-jquery.js");
+		int idxTitleElement = responseAsString.indexOf("<title>Apache Wicket Quickstart</title>");
+		int idxMetaFromBasePage = responseAsString.indexOf("<meta name='fromBasePage' content='1'");
+
+		assertThat("<meta name=\"panel-wicket-head\"> should be rendered before <script src=wicket-ajax-jquery.js>",
+				idxMetaPanelWicketHead, lessThan(idxWicketAjaxJs));
+
+		assertThat("<script src=wicket-ajax-jquery.js> should be rendered before <meta charset>",
+				idxWicketAjaxJs, lessThan(idxMetaCharset));
+
+		assertThat("<meta charset> should be rendered before the <title> element",
+				idxMetaCharset, lessThan(idxTitleElement));
+
+		assertThat("<title> should be rendered before the <meta name='fromBasePage'> element",
+				idxTitleElement, lessThan(idxMetaFromBasePage));
+	}
+
+	@Test
+	public void withoutHeaderItemsWithWicketHead()
+	{
+		tester.startPage(SubPageWithoutHeaderItemsAndWicketHead.class);
+		String responseAsString = tester.getLastResponseAsString();
+//		System.err.println("RES:\n" + responseAsString);
+		int idxMetaCharset = responseAsString.indexOf("<meta charset=\"utf-8\"");
+		int idxMetaPanelWicketHead = responseAsString.indexOf("meta name=\"panel-wicket-head\"");
+		int idxWicketAjaxJs = responseAsString.indexOf("wicket-ajax-jquery.js");
+		int idxTitleElement = responseAsString.indexOf("<title>Apache Wicket Quickstart</title>");
+		int idxMetaFromBasePage = responseAsString.indexOf("<meta name='fromBasePage' content='1'");
+		int idxMetaFromSubPage = responseAsString.indexOf("<meta name=\"SubPageWithoutHeaderItemsAndWicketHead\"");
+
+		assertThat("<meta name=\"panel-wicket-head\"> should be rendered before <script src=wicket-ajax-jquery.js>",
+				idxMetaPanelWicketHead, lessThan(idxWicketAjaxJs));
+
+		assertThat("<script src=wicket-ajax-jquery.js> should be rendered before <meta charset>",
+				idxWicketAjaxJs, lessThan(idxMetaCharset));
+
+		assertThat("<meta charset> should be rendered before the <title> element",
+				idxMetaCharset, lessThan(idxTitleElement));
+
+		assertThat("<title> should be rendered before the <meta name=\"SubPageWithoutHeaderItemsAndWicketHead\" element",
+				idxTitleElement, lessThan(idxMetaFromSubPage));
+
+		assertThat("<meta name='fromBasePage'> should be rendered before the <meta name=\"SubPageWithoutHeaderItemsAndWicketHead\" element",
+				idxMetaFromSubPage, lessThan(idxMetaFromBasePage));
+	}
+
+	@Test
+	public void withHeaderItemsWithWicketHead()
+	{
+		tester.startPage(SubPageWithHeaderItemsAndWicketHead.class);
+		String responseAsString = tester.getLastResponseAsString();
+//		System.err.println("RES:\n" + responseAsString);
+		int idxMetaCharset = responseAsString.indexOf("<meta charset=\"utf-8\"");
+		int idxMetaPanelWicketHead = responseAsString.indexOf("meta name=\"panel-wicket-head\"");
+		int idxWicketAjaxJs = responseAsString.indexOf("wicket-ajax-jquery.js");
+		int idxTitleElement = responseAsString.indexOf("<title>Apache Wicket Quickstart</title>");
+		int idxMetaFromBasePage = responseAsString.indexOf("<meta name='fromBasePage' content='1'");
+		int idxMetaFromSubPage = responseAsString.indexOf("<meta name=\"SubPageWithHeaderItemsAndWicketHead\"");
+
+		assertThat("<meta charset> should be rendered before <meta name=\"panel-wicket-head\"",
+				idxMetaCharset, lessThan(idxMetaPanelWicketHead));
+
+		assertThat("<meta  name=\"panel-wicket-head\"> should be rendered before <script src=wicket-ajax-jquery.js>",
+				idxMetaPanelWicketHead, lessThan(idxWicketAjaxJs));
+
+		assertThat("<script src=wicket-ajax-jquery.js> should be rendered before the <title> element",
+				idxWicketAjaxJs, lessThan(idxTitleElement));
+
+		assertThat("<meta name=\"SubPageWithoutHeaderItemsAndWicketHead\"> should be rendered before the <meta name='fromBasePage'> element",
+				idxMetaFromSubPage, lessThan(idxMetaFromBasePage));
+
+		assertThat("<meta name='fromBasePage'> should be rendered before the <title> element",
+				idxMetaFromBasePage, lessThan(idxTitleElement));
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/8ac36a6c/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/BasePage.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/BasePage.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/BasePage.java
new file mode 100644
index 0000000..192bc77
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/BasePage.java
@@ -0,0 +1,44 @@
+/*
+ * 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.internal.headeritems;
+
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.StringHeaderItem;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+/**
+ * A base page that contributes a StringHeaderItem
+ * and adds a Panel with its own contributions
+ */
+public class BasePage extends WebPage {
+	private static final long serialVersionUID = 1L;
+
+	public BasePage(final PageParameters parameters) {
+		super(parameters);
+
+		add(new PanelA("panel"));
+    }
+
+	@Override
+	public void renderHead(IHeaderResponse response)
+	{
+		super.renderHead(response);
+
+		response.render(StringHeaderItem.forString("<meta name='fromBasePage' content='1'/>"));
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/8ac36a6c/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithHeaderItems.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithHeaderItems.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithHeaderItems.html
new file mode 100644
index 0000000..ffa04a1
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithHeaderItems.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html xmlns:wicket="http://wicket.apache.org">
+	<head>
+		<meta charset="utf-8" />
+        <wicket:header-items/>
+		<title>Apache Wicket Quickstart</title>
+	</head>
+	<body>
+		<div id="hd">
+			<div id="logo">
+				<h1>Apache Wicket</h1>
+			</div>
+		</div>
+		<div id="bd">
+            <div wicket:id="panel"></div>
+            <wicket:child/>
+		</div>
+		<div id="ft">
+		</div>
+	</body>
+</html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/8ac36a6c/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithHeaderItems.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithHeaderItems.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithHeaderItems.java
new file mode 100644
index 0000000..0dd1f11
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithHeaderItems.java
@@ -0,0 +1,27 @@
+/*
+ * 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.internal.headeritems;
+
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+public class PageWithHeaderItems extends BasePage {
+	private static final long serialVersionUID = 1L;
+
+	public PageWithHeaderItems(final PageParameters parameters) {
+		super(parameters);
+    }
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/8ac36a6c/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithoutHeaderItems.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithoutHeaderItems.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithoutHeaderItems.html
new file mode 100644
index 0000000..568a435
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithoutHeaderItems.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html xmlns:wicket="http://wicket.apache.org">
+	<head>
+		<meta charset="utf-8" />
+		<title>Apache Wicket Quickstart</title>
+	</head>
+	<body>
+		<div id="hd">
+			<div id="logo">
+				<h1>Apache Wicket</h1>
+			</div>
+		</div>
+		<div id="bd">
+            <div wicket:id="panel"></div>
+            <wicket:child/>
+		</div>
+		<div id="ft">
+		</div>
+	</body>
+</html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/8ac36a6c/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithoutHeaderItems.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithoutHeaderItems.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithoutHeaderItems.java
new file mode 100644
index 0000000..6ab3a97
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PageWithoutHeaderItems.java
@@ -0,0 +1,27 @@
+/*
+ * 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.internal.headeritems;
+
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+public class PageWithoutHeaderItems extends BasePage {
+	private static final long serialVersionUID = 1L;
+
+	public PageWithoutHeaderItems(final PageParameters parameters) {
+		super(parameters);
+    }
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/8ac36a6c/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PanelA.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PanelA.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PanelA.html
new file mode 100644
index 0000000..434f244
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PanelA.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html xmlns:wicket="http://wicket.apache.org">
+<body>
+    <wicket:head>
+        <meta name="panel-wicket-head" content="done!"/>
+    </wicket:head>
+    <wicket:panel>
+        The panel content
+    </wicket:panel>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/8ac36a6c/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PanelA.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PanelA.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PanelA.java
new file mode 100644
index 0000000..d0ccdb1
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/PanelA.java
@@ -0,0 +1,41 @@
+/*
+ * 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.internal.headeritems;
+
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.resource.CoreLibrariesContributor;
+
+/**
+ * A panel that contributes all Ajax header items
+ * and uses <wicket:head> to contribute a <meta> element
+ */
+public class PanelA extends Panel
+{
+	public PanelA(String id)
+	{
+		super(id);
+	}
+
+	@Override
+	public void renderHead(IHeaderResponse response)
+	{
+		super.renderHead(response);
+
+		CoreLibrariesContributor.contributeAjax(getApplication(), response);
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/8ac36a6c/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/SubPageWithHeaderItemsAndWicketHead.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/SubPageWithHeaderItemsAndWicketHead.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/SubPageWithHeaderItemsAndWicketHead.html
new file mode 100644
index 0000000..54b4b00
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/SubPageWithHeaderItemsAndWicketHead.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html xmlns:wicket="http://wicket.apache.org">
+    <wicket:head>
+        <meta name="SubPageWithHeaderItemsAndWicketHead" content="1"/>
+    </wicket:head>
+    <wicket:extend>
+        SubPageWithHeaderItemsAndWicketHead content
+    </wicket:extend>
+</html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/8ac36a6c/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/SubPageWithHeaderItemsAndWicketHead.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/SubPageWithHeaderItemsAndWicketHead.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/SubPageWithHeaderItemsAndWicketHead.java
new file mode 100644
index 0000000..01df0f0
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/SubPageWithHeaderItemsAndWicketHead.java
@@ -0,0 +1,27 @@
+/*
+ * 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.internal.headeritems;
+
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+public class SubPageWithHeaderItemsAndWicketHead extends PageWithHeaderItems {
+	private static final long serialVersionUID = 1L;
+
+	public SubPageWithHeaderItemsAndWicketHead(final PageParameters parameters) {
+		super(parameters);
+    }
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/8ac36a6c/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/SubPageWithoutHeaderItemsAndWicketHead.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/SubPageWithoutHeaderItemsAndWicketHead.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/SubPageWithoutHeaderItemsAndWicketHead.html
new file mode 100644
index 0000000..3f2dbd2
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/SubPageWithoutHeaderItemsAndWicketHead.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html xmlns:wicket="http://wicket.apache.org">
+<wicket:head>
+    <meta name="SubPageWithoutHeaderItemsAndWicketHead" content="1"/>
+</wicket:head>
+<wicket:extend>
+    SubPageWithoutHeaderItemsAndWicketHead content
+</wicket:extend>
+</html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/8ac36a6c/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/SubPageWithoutHeaderItemsAndWicketHead.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/SubPageWithoutHeaderItemsAndWicketHead.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/SubPageWithoutHeaderItemsAndWicketHead.java
new file mode 100644
index 0000000..fa57dbf
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/headeritems/SubPageWithoutHeaderItemsAndWicketHead.java
@@ -0,0 +1,27 @@
+/*
+ * 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.internal.headeritems;
+
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+public class SubPageWithoutHeaderItemsAndWicketHead extends PageWithoutHeaderItems {
+	private static final long serialVersionUID = 1L;
+
+	public SubPageWithoutHeaderItemsAndWicketHead(final PageParameters parameters) {
+		super(parameters);
+    }
+}