You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by jd...@apache.org on 2011/03/19 20:54:26 UTC

svn commit: r1083270 - in /wicket/trunk/wicket-core/src: main/java/org/apache/wicket/ main/java/org/apache/wicket/ajax/ main/java/org/apache/wicket/markup/ main/java/org/apache/wicket/markup/parser/ main/java/org/apache/wicket/markup/parser/filter/ mai...

Author: jdonnerstag
Date: Sat Mar 19 19:54:25 2011
New Revision: 1083270

URL: http://svn.apache.org/viewvc?rev=1083270&view=rev
Log:
fixed: javascript with a less than character ("<") fails to execute when added through a header contribution in ajax response

- Introduced a new WicketFilter (StyleAndScriptIdentifier) to support the use case
- ComponentTag: replace growing number of booleans with an int flag
- WicketFilter now support postProcessing the markup (may replace current chaining approach in the future)
Issue: WICKET-3420

Added:
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/StyleAndScriptIdentifier.java
Modified:
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/AbstractMarkupParser.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/ComponentTag.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/MarkupParser.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/parser/AbstractMarkupFilter.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/parser/IMarkupFilter.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/RootMarkupFilter.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/mock/MockHomePage.java
    wicket/trunk/wicket-core/src/test/java/org/apache/wicket/ajax/MockComponent1-expected.html
    wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/MarkupParserTest.java

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java?rev=1083270&r1=1083269&r2=1083270&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java Sat Mar 19 19:54:25 2011
@@ -32,7 +32,6 @@ import org.apache.wicket.markup.MarkupFa
 import org.apache.wicket.markup.MarkupNotFoundException;
 import org.apache.wicket.markup.MarkupStream;
 import org.apache.wicket.markup.MarkupType;
-import org.apache.wicket.markup.RawMarkup;
 import org.apache.wicket.markup.WicketTag;
 import org.apache.wicket.markup.html.border.Border;
 import org.apache.wicket.markup.resolver.ComponentResolvers;
@@ -1385,8 +1384,9 @@ public abstract class MarkupContainer ex
 	 * 
 	 * @param markupStream
 	 *            The markup stream
+	 * @return true, if element was rendered as RawMarkup
 	 */
-	protected final void renderNext(final MarkupStream markupStream)
+	protected final boolean renderNext(final MarkupStream markupStream)
 	{
 		// Get the current markup element
 		final MarkupElement element = markupStream.get();
@@ -1416,6 +1416,12 @@ public abstract class MarkupContainer ex
 			{
 				component.render();
 			}
+			else if (tag.getFlag(ComponentTag.RENDER_RAW))
+			{
+				// No component found, but "render as raw markup" flag found
+				getResponse().write(element.toCharSequence());
+				return true;
+			}
 			else
 			{
 				if (tag instanceof WicketTag)
@@ -1446,12 +1452,11 @@ public abstract class MarkupContainer ex
 		else
 		{
 			// Render as raw markup
-			if (log.isDebugEnabled())
-			{
-				log.debug("Rendering raw markup");
-			}
 			getResponse().write(element.toCharSequence());
+			return true;
 		}
+
+		return false;
 	}
 
 	/**
@@ -1537,13 +1542,13 @@ public abstract class MarkupContainer ex
 			final int index = markupStream.getCurrentIndex();
 
 			// Render the markup element
-			renderNext(markupStream);
+			boolean rawMarkup = renderNext(markupStream);
 
 			// Go back to where we were and move the markup stream forward to whatever the next
 			// element is.
 			markupStream.setCurrentIndex(index);
 			MarkupElement elem = markupStream.get();
-			if (elem instanceof RawMarkup)
+			if (rawMarkup)
 			{
 				markupStream.next();
 			}

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java?rev=1083270&r1=1083269&r2=1083270&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java Sat Mar 19 19:54:25 2011
@@ -808,14 +808,10 @@ public class AjaxRequestTarget implement
 			}
 
 			// we need to write response as CDATA and parse it on client,
-			// because
-			// konqueror crashes when there is a <script> element
+			// because konqueror crashes when there is a <script> element
 			response.write("><![CDATA[<head xmlns:wicket=\"http://wicket.apache.org\">");
-
 			response.write(encodingHeaderResponse.getContents());
-
 			response.write("</head>]]>");
-
 			response.write("</header-contribution>");
 		}
 	}

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/AbstractMarkupParser.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/AbstractMarkupParser.java?rev=1083270&r1=1083269&r2=1083270&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/AbstractMarkupParser.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/AbstractMarkupParser.java Sat Mar 19 19:54:25 2011
@@ -44,7 +44,7 @@ import org.slf4j.LoggerFactory;
  * @see IMarkupFilter
  * @see MarkupFactory
  * @see IMarkupSettings
- *
+ * 
  * @author Jonathan Locke
  * @author Juergen Donnerstag
  */
@@ -228,7 +228,7 @@ public abstract class AbstractMarkupPars
 			ComponentTag tag;
 			while (null != (tag = getNextTag()))
 			{
-				boolean add = (tag.getId() != null);
+				boolean add = (tag.getId() != null) || tag.getFlag(ComponentTag.ADD);
 				if (!add && tag.getXmlTag().isClose())
 				{
 					add = ((tag.getOpenTag() != null) && (tag.getOpenTag().getId() != null));
@@ -302,12 +302,23 @@ public abstract class AbstractMarkupPars
 			markup.addMarkupElement(new RawMarkup(text));
 		}
 
+		postProcess(markup);
+
 		// Make all tags immutable and the list of elements unmodifiable
 		markup.makeImmutable();
 	}
 
 	/**
 	 * 
+	 * @param markup
+	 */
+	protected void postProcess(final Markup markup)
+	{
+		markupFilterChain.postProcess(markup);
+	}
+
+	/**
+	 * 
 	 * @param rawMarkup
 	 * @return The modified raw markup
 	 */

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/ComponentTag.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/ComponentTag.java?rev=1083270&r1=1083269&r2=1083270&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/ComponentTag.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/ComponentTag.java Sat Mar 19 19:54:25 2011
@@ -30,6 +30,7 @@ import org.apache.wicket.markup.parser.X
 import org.apache.wicket.markup.parser.XmlTag.TagType;
 import org.apache.wicket.markup.parser.filter.HtmlHandler;
 import org.apache.wicket.request.Response;
+import org.apache.wicket.util.lang.Generics;
 import org.apache.wicket.util.string.AppendingStringBuffer;
 import org.apache.wicket.util.string.StringValue;
 import org.apache.wicket.util.string.Strings;
@@ -46,11 +47,26 @@ import org.apache.wicket.util.value.IVal
  */
 public class ComponentTag extends MarkupElement
 {
-	/**
-	 * Standard component id attribute always available for components regardless of user
-	 * ApplicationSettings for id attribute; value == 'wicket'.
-	 */
-	public static final String DEFAULT_WICKET_NAMESPACE = MarkupParser.WICKET;
+	/** True if a href attribute is available and autolinking is on */
+	private final static int AUTOLINK = 0x0001;
+
+	/** True, if attributes have been modified or added */
+	private final static int MODIFIED = 0x0002;
+
+	/** If true, than the MarkupParser will ignore (remove) it. Temporary working variable */
+	private final static int IGNORE = 0x0004;
+
+	/** If true, than the tag contain an automatically created wicket id */
+	private final static int AUTO_COMPONENT = 0x0008;
+
+	/** Some HTML tags are allow to have no close tag, e.g. 'br' */
+	private final static int NO_CLOSE_TAG = 0x0010;
+
+	/** The component tag shall be added to the markup in any case */
+	public final static int ADD = 0x0020;
+
+	/** Render the tag as RawMarkup even if no Component can be found */
+	public final static int RENDER_RAW = 0x0040;
 
 	/**
 	 * Assuming this is a open (or open-close) tag, 'closes' refers to the ComponentTag which closes
@@ -61,8 +77,8 @@ public class ComponentTag extends Markup
 	/** The underlying xml tag */
 	protected final XmlTag xmlTag;
 
-	/** True if a href attribute is available and autolinking is on */
-	private boolean autolink = false;
+	/** Boolean flags. See above */
+	private int flags = 0;
 
 	/**
 	 * By default this is equal to the wicket:id="xxx" attribute value, but may be provided e.g. for
@@ -70,17 +86,6 @@ public class ComponentTag extends Markup
 	 */
 	private String id;
 
-	/** True, if attributes have been modified or added */
-	private boolean modified = false;
-
-	/**
-	 * If true, than the MarkupParser will ignore (remove) it. Temporary working variable
-	 */
-	private boolean ignore = false;
-
-	/** If true, than the tag contain an automatically created wicket id */
-	private boolean autoComponent = false;
-
 	/**
 	 * In case of inherited markup, the base and the extended markups are merged and the information
 	 * about the tags origin is lost. In some cases like wicket:head and wicket:link this
@@ -88,12 +93,6 @@ public class ComponentTag extends Markup
 	 */
 	private WeakReference<Class<? extends Component>> markupClassRef = null;
 
-	/**
-	 * Tags which are detected to have only an open tag, which is allowed with some HTML tags like
-	 * 'br' for example
-	 */
-	private boolean hasNoCloseTag = false;
-
 	/** added behaviors */
 	private List<Behavior> behaviors;
 
@@ -142,6 +141,38 @@ public class ComponentTag extends Markup
 	}
 
 	/**
+	 * THIS METHOD IS NOT PART OF THE WICKET PUBLIC API. DO NOT USE IT!
+	 * 
+	 * @param flag
+	 *            The flag to set
+	 * @param set
+	 *            True to turn the flag on, false to turn it off
+	 */
+	public final void setFlag(final int flag, final boolean set)
+	{
+		if (set)
+		{
+			flags |= flag;
+		}
+		else
+		{
+			flags &= ~flag;
+		}
+	}
+
+	/**
+	 * THIS METHOD IS NOT PART OF THE WICKET PUBLIC API. DO NOT USE IT!
+	 * 
+	 * @param flag
+	 *            The flag to test
+	 * @return True if the flag is set
+	 */
+	public final boolean getFlag(final int flag)
+	{
+		return (flags & flag) != 0;
+	}
+
+	/**
 	 * Adds a behavior to this component tag.
 	 * 
 	 * @param behavior
@@ -155,7 +186,7 @@ public class ComponentTag extends Markup
 
 		if (behaviors == null)
 		{
-			behaviors = new ArrayList<Behavior>();
+			behaviors = Generics.newArrayList();
 		}
 		behaviors.add(behavior);
 	}
@@ -210,7 +241,7 @@ public class ComponentTag extends Markup
 	 */
 	public final void enableAutolink(final boolean autolink)
 	{
-		this.autolink = autolink;
+		setFlag(AUTOLINK, autolink);
 	}
 
 	/**
@@ -234,6 +265,19 @@ public class ComponentTag extends Markup
 	}
 
 	/**
+	 * Please use {@link #getAttribute(String)} instead
+	 * 
+	 * @param name
+	 * @return The attribute
+	 * @deprecated since 1.5
+	 */
+	@Deprecated
+	public final String getString(String name)
+	{
+		return getAttribute(name);
+	}
+
+	/**
 	 * Get the tag's component id
 	 * 
 	 * @return The component id attribute of this tag
@@ -300,17 +344,6 @@ public class ComponentTag extends Markup
 	}
 
 	/**
-	 * @see org.apache.wicket.markup.parser.XmlTag#getString(String)
-	 * @param key
-	 *            The key
-	 * @return The string value
-	 */
-	public final CharSequence getString(String key)
-	{
-		return xmlTag.getString(key);
-	}
-
-	/**
 	 * @return the tag type (OPEN, CLOSE or OPEN_CLOSE).
 	 */
 	public final TagType getType()
@@ -325,7 +358,7 @@ public class ComponentTag extends Markup
 	 */
 	public final boolean isAutolinkEnabled()
 	{
-		return autolink;
+		return getFlag(AUTOLINK);
 	}
 
 	/**
@@ -410,7 +443,7 @@ public class ComponentTag extends Markup
 		}
 		else
 		{
-			final ComponentTag tag = new ComponentTag(xmlTag.mutable());
+			ComponentTag tag = new ComponentTag(xmlTag.mutable());
 			copyPropertiesTo(tag);
 			return tag;
 		}
@@ -426,8 +459,7 @@ public class ComponentTag extends Markup
 	void copyPropertiesTo(final ComponentTag dest)
 	{
 		dest.id = id;
-		dest.setHasNoCloseTag(hasNoCloseTag);
-		dest.setAutoComponentTag(autoComponent);
+		dest.flags = flags;
 		if (markupClassRef != null)
 		{
 			dest.setMarkupClass(markupClassRef.get());
@@ -699,7 +731,7 @@ public class ComponentTag extends Markup
 				{
 					response.write(" ");
 					response.write(key);
-					CharSequence value = getString(key);
+					CharSequence value = getAttribute(key);
 
 					// attributes without values are possible, e.g.' disabled'
 					if (value != null)
@@ -748,7 +780,7 @@ public class ComponentTag extends Markup
 	 */
 	public final void setModified(final boolean modified)
 	{
-		this.modified = modified;
+		setFlag(MODIFIED, modified);
 	}
 
 	/**
@@ -757,7 +789,7 @@ public class ComponentTag extends Markup
 	 */
 	final boolean isModified()
 	{
-		return modified;
+		return getFlag(MODIFIED);
 	}
 
 	/**
@@ -766,7 +798,7 @@ public class ComponentTag extends Markup
 	 */
 	public boolean hasNoCloseTag()
 	{
-		return hasNoCloseTag;
+		return getFlag(NO_CLOSE_TAG);
 	}
 
 	/**
@@ -776,7 +808,7 @@ public class ComponentTag extends Markup
 	 */
 	public void setHasNoCloseTag(boolean hasNoCloseTag)
 	{
-		this.hasNoCloseTag = hasNoCloseTag;
+		setFlag(NO_CLOSE_TAG, hasNoCloseTag);
 	}
 
 	/**
@@ -832,7 +864,7 @@ public class ComponentTag extends Markup
 	 */
 	public boolean isIgnore()
 	{
-		return ignore;
+		return getFlag(IGNORE);
 	}
 
 	/**
@@ -843,7 +875,7 @@ public class ComponentTag extends Markup
 	 */
 	public void setIgnore(boolean ignore)
 	{
-		this.ignore = ignore;
+		setFlag(IGNORE, ignore);
 	}
 
 	/**
@@ -851,7 +883,7 @@ public class ComponentTag extends Markup
 	 */
 	public boolean isAutoComponentTag()
 	{
-		return autoComponent;
+		return getFlag(AUTO_COMPONENT);
 	}
 
 	/**
@@ -860,7 +892,7 @@ public class ComponentTag extends Markup
 	 */
 	public void setAutoComponentTag(boolean auto)
 	{
-		autoComponent = auto;
+		setFlag(AUTO_COMPONENT, auto);
 	}
 
 	/**

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/MarkupParser.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/MarkupParser.java?rev=1083270&r1=1083269&r2=1083270&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/MarkupParser.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/MarkupParser.java Sat Mar 19 19:54:25 2011
@@ -27,6 +27,7 @@ import org.apache.wicket.markup.parser.f
 import org.apache.wicket.markup.parser.filter.HtmlHeaderSectionHandler;
 import org.apache.wicket.markup.parser.filter.OpenCloseTagExpander;
 import org.apache.wicket.markup.parser.filter.RelativePathPrefixHandler;
+import org.apache.wicket.markup.parser.filter.StyleAndScriptIdentifier;
 import org.apache.wicket.markup.parser.filter.WicketLinkTagHandler;
 import org.apache.wicket.markup.parser.filter.WicketMessageTagHandler;
 import org.apache.wicket.markup.parser.filter.WicketNamespaceHandler;
@@ -180,6 +181,7 @@ public class MarkupParser extends Abstra
 		filters.add(new OpenCloseTagExpander());
 		filters.add(new RelativePathPrefixHandler());
 		filters.add(new EnclosureHandler());
+		filters.add(new StyleAndScriptIdentifier(markup));
 
 		return filters;
 	}

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/parser/AbstractMarkupFilter.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/parser/AbstractMarkupFilter.java?rev=1083270&r1=1083269&r2=1083270&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/parser/AbstractMarkupFilter.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/parser/AbstractMarkupFilter.java Sat Mar 19 19:54:25 2011
@@ -19,6 +19,7 @@ package org.apache.wicket.markup.parser;
 import java.text.ParseException;
 
 import org.apache.wicket.markup.ComponentTag;
+import org.apache.wicket.markup.Markup;
 
 
 /**
@@ -92,4 +93,8 @@ public abstract class AbstractMarkupFilt
 	{
 		return count++;
 	}
+
+	public void postProcess(final Markup markup)
+	{
+	}
 }

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/parser/IMarkupFilter.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/parser/IMarkupFilter.java?rev=1083270&r1=1083269&r2=1083270&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/parser/IMarkupFilter.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/parser/IMarkupFilter.java Sat Mar 19 19:54:25 2011
@@ -18,6 +18,7 @@ package org.apache.wicket.markup.parser;
 
 import java.text.ParseException;
 
+import org.apache.wicket.markup.Markup;
 import org.apache.wicket.markup.MarkupElement;
 
 
@@ -59,4 +60,11 @@ public interface IMarkupFilter
 	 *            The next element in the chain
 	 */
 	void setNextFilter(final IMarkupFilter parent);
+
+	/**
+	 * Called after all filters have been processed
+	 * 
+	 * @param markup
+	 */
+	void postProcess(final Markup markup);
 }

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/RootMarkupFilter.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/RootMarkupFilter.java?rev=1083270&r1=1083269&r2=1083270&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/RootMarkupFilter.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/RootMarkupFilter.java Sat Mar 19 19:54:25 2011
@@ -18,6 +18,7 @@ package org.apache.wicket.markup.parser.
 
 import java.text.ParseException;
 
+import org.apache.wicket.markup.Markup;
 import org.apache.wicket.markup.MarkupElement;
 import org.apache.wicket.markup.parser.IMarkupFilter;
 import org.apache.wicket.markup.parser.IXmlPullParser;
@@ -76,4 +77,8 @@ public final class RootMarkupFilter impl
 	{
 		return parser.next();
 	}
+
+	public void postProcess(Markup markup)
+	{
+	}
 }

Added: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/StyleAndScriptIdentifier.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/StyleAndScriptIdentifier.java?rev=1083270&view=auto
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/StyleAndScriptIdentifier.java (added)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/StyleAndScriptIdentifier.java Sat Mar 19 19:54:25 2011
@@ -0,0 +1,108 @@
+/*
+ * 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.parser.filter;
+
+import java.text.ParseException;
+
+import org.apache.wicket.markup.ComponentTag;
+import org.apache.wicket.markup.Markup;
+import org.apache.wicket.markup.MarkupElement;
+import org.apache.wicket.markup.RawMarkup;
+import org.apache.wicket.markup.parser.XmlPullParser;
+
+
+/**
+ * 
+ * @author Juergen Donnerstag
+ */
+public final class StyleAndScriptIdentifier extends BaseMarkupFilter
+{
+	private boolean found;
+
+	private final Markup markup;
+
+	/**
+	 * Construct.
+	 * 
+	 * @param markup
+	 */
+	public StyleAndScriptIdentifier(final Markup markup)
+	{
+		this.markup = markup;
+	}
+
+	@Override
+	protected final MarkupElement nextTag(final ComponentTag tag) throws ParseException
+	{
+		if (tag.getNamespace() != null)
+		{
+			return tag;
+		}
+
+		if (XmlPullParser.SCRIPT.equalsIgnoreCase(tag.getName()) ||
+			(XmlPullParser.STYLE.equalsIgnoreCase(tag.getName())))
+		{
+			if (tag.isOpen() && (tag.getId() == null))
+			{
+				// Not needed, but must not be null
+				tag.setId("_ScriptStyle");
+				tag.setModified(true);
+			}
+
+			tag.setFlag(ComponentTag.ADD, true);
+			tag.setFlag(ComponentTag.RENDER_RAW, true);
+			tag.setUserData("STYLE_OR_SCRIPT", Boolean.TRUE);
+		}
+
+		return tag;
+	}
+
+	@Override
+	public void postProcess(Markup markup)
+	{
+		for (int i = 0; i < markup.size(); i++)
+		{
+			MarkupElement elem = markup.get(i);
+			if (elem instanceof ComponentTag)
+			{
+				ComponentTag open = (ComponentTag)elem;
+				if (open.getUserData("STYLE_OR_SCRIPT") != null)
+				{
+					if (open.isOpen() && ((i + 2) < markup.size()))
+					{
+						MarkupElement body = markup.get(i + 1);
+						MarkupElement tag2 = markup.get(i + 2);
+
+						if ((body instanceof RawMarkup) && (tag2 instanceof ComponentTag))
+						{
+							ComponentTag close = (ComponentTag)tag2;
+							if (close.closes(open))
+							{
+								String text = body.toString().trim();
+								if (!text.startsWith("<!--") && !text.startsWith("<![CDATA["))
+								{
+									text = "<![CDATA[" + body.toString() + "]]>";
+									markup.replace(i + 1, new RawMarkup(text));
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+}

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/mock/MockHomePage.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/mock/MockHomePage.java?rev=1083270&r1=1083269&r2=1083270&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/mock/MockHomePage.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/mock/MockHomePage.java Sat Mar 19 19:54:25 2011
@@ -18,7 +18,11 @@ package org.apache.wicket.mock;
 
 import org.apache.wicket.markup.html.WebPage;
 
+/**
+ * Mock Page
+ */
 public class MockHomePage extends WebPage
 {
+	private static final long serialVersionUID = 1L;
 
 }

Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/ajax/MockComponent1-expected.html
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/ajax/MockComponent1-expected.html?rev=1083270&r1=1083269&r2=1083270&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/ajax/MockComponent1-expected.html (original)
+++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/ajax/MockComponent1-expected.html Sat Mar 19 19:54:25 2011
@@ -1,9 +1,9 @@
 <![CDATA[<head xmlns:wicket="http://wicket.apache.org">
-<style type="text/css" id="org-apache-wicket-ajax-MockComponent1-0">
+<style type="text/css" id="org-apache-wicket-ajax-MockComponent1-0"><![CDATA[
 .onTheFlyClass {
 	background-color: red;
 	color: white;
 	width: 200px;
 }
-</style>
+]^]^></style>
 </head>]]>
\ No newline at end of file

Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/MarkupParserTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/MarkupParserTest.java?rev=1083270&r1=1083269&r2=1083270&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/MarkupParserTest.java (original)
+++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/MarkupParserTest.java Sat Mar 19 19:54:25 2011
@@ -385,12 +385,10 @@ public final class MarkupParserTest exte
 			"<html wicket:id=\"test\"><script language=\"JavaScript\">... <x a> ...</script></html>");
 
 		IMarkupFragment markup = parser.parse();
-		assertEquals(3, markup.size());
+		assertEquals(5, markup.size());
 		assertEquals("html", ((ComponentTag)markup.get(0)).getName());
-		assertEquals("html", ((ComponentTag)markup.get(2)).getName());
-		assertEquals(true, markup.get(1) instanceof RawMarkup);
-		assertEquals("<script language=\"JavaScript\">... <x a> ...</script>", markup.get(1)
-			.toString());
+		assertEquals("html", ((ComponentTag)markup.get(4)).getName());
+		assertEquals("<![CDATA[... <x a> ...]]>", markup.get(2).toString());
 	}
 
 	/**
@@ -431,4 +429,78 @@ public final class MarkupParserTest exte
 		RawMarkup raw = (RawMarkup)markup.get(0);
 		assertEquals("<span> </span>", raw.toString());
 	}
+
+	/**
+	 * 
+	 * @throws IOException
+	 * @throws ResourceStreamNotFoundException
+	 */
+	public final void testScript1() throws IOException, ResourceStreamNotFoundException
+	{
+		IMarkupFragment markup = new MarkupParser("<script/>").parse();
+		assertEquals(1, markup.size());
+		MarkupElement tag = markup.get(0);
+		assertEquals("<script/>", tag.toString());
+
+		markup = new MarkupParser("<script></script>").parse();
+		assertEquals(2, markup.size());
+		tag = markup.get(0);
+		assertEquals("<script>", tag.toString());
+		tag = markup.get(1);
+		assertEquals("</script>", tag.toString());
+
+		markup = new MarkupParser("<script> text </script>").parse();
+		assertEquals(3, markup.size());
+		tag = markup.get(0);
+		assertEquals("<script>", tag.toString());
+		tag = markup.get(1);
+		assertEquals("<![CDATA[ text ]]>", tag.toString());
+		tag = markup.get(2);
+		assertEquals("</script>", tag.toString());
+
+		markup = new MarkupParser("<script><!-- text --></script>").parse();
+		assertEquals(3, markup.size());
+		tag = markup.get(0);
+		assertEquals("<script>", tag.toString());
+		tag = markup.get(1);
+		assertEquals("<!-- text -->", tag.toString());
+		tag = markup.get(2);
+		assertEquals("</script>", tag.toString());
+
+		markup = new MarkupParser("<script> <!-- text --> </script>").parse();
+		assertEquals(3, markup.size());
+		tag = markup.get(0);
+		assertEquals("<script>", tag.toString());
+		tag = markup.get(1);
+		assertEquals(" <!-- text --> ", tag.toString());
+		tag = markup.get(2);
+		assertEquals("</script>", tag.toString());
+
+		markup = new MarkupParser("<style><![CDATA[ text ]]></style>").parse();
+		assertEquals(3, markup.size());
+		tag = markup.get(0);
+		assertEquals("<style>", tag.toString());
+		tag = markup.get(1);
+		assertEquals("<![CDATA[ text ]]>", tag.toString());
+		tag = markup.get(2);
+		assertEquals("</style>", tag.toString());
+
+		markup = new MarkupParser("<html><script> text </script></html>").parse();
+		assertEquals(5, markup.size());
+		tag = markup.get(1);
+		assertEquals("<script>", tag.toString());
+		tag = markup.get(2);
+		assertEquals("<![CDATA[ text ]]>", tag.toString());
+		tag = markup.get(3);
+		assertEquals("</script>", tag.toString());
+
+		markup = new MarkupParser("<html wicket:id='xx'><script> text </script></html>").parse();
+		assertEquals(5, markup.size());
+		tag = markup.get(1);
+		assertEquals("<script>", tag.toString());
+		tag = markup.get(2);
+		assertEquals("<![CDATA[ text ]]>", tag.toString());
+		tag = markup.get(3);
+		assertEquals("</script>", tag.toString());
+	}
 }