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


Reply via email to