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 2012/03/15 12:50:13 UTC

git commit: WICKET-4453 [StyleAndScriptIdentifier] Better matching of CDATA-comments

Updated Branches:
  refs/heads/wicket-1.5.x 2ab7df583 -> d80606016


WICKET-4453 [StyleAndScriptIdentifier] Better matching of CDATA-comments


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

Branch: refs/heads/wicket-1.5.x
Commit: d80606016e1f84da1777cbf66c28edbf4fd66914
Parents: 2ab7df5
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Thu Mar 15 13:49:47 2012 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Thu Mar 15 13:49:47 2012 +0200

----------------------------------------------------------------------
 .../parser/filter/StyleAndScriptIdentifier.java    |   34 ++++++-
 .../filter/StyleAndScriptIdentifierTest.java       |   85 +++++++++++++++
 2 files changed, 117 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/d8060601/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/StyleAndScriptIdentifier.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/StyleAndScriptIdentifier.java b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/StyleAndScriptIdentifier.java
index 957de64..9010980 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/StyleAndScriptIdentifier.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/StyleAndScriptIdentifier.java
@@ -17,6 +17,7 @@
 package org.apache.wicket.markup.parser.filter;
 
 import java.text.ParseException;
+import java.util.regex.Pattern;
 
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.Markup;
@@ -24,6 +25,7 @@ import org.apache.wicket.markup.MarkupElement;
 import org.apache.wicket.markup.RawMarkup;
 import org.apache.wicket.markup.parser.AbstractMarkupFilter;
 import org.apache.wicket.markup.parser.XmlPullParser;
+import org.apache.wicket.util.lang.Args;
 import org.apache.wicket.util.string.JavaScriptUtils;
 
 
@@ -95,8 +97,7 @@ public final class StyleAndScriptIdentifier extends AbstractMarkupFilter
 							if (close.closes(open))
 							{
 								String text = body.toString().trim();
-								if (!text.startsWith("<!--") && !text.startsWith("<![CDATA[") &&
-									!text.startsWith("/*<![CDATA[*/"))
+								if (shouldWrapInCdata(text))
 								{
 									text = JavaScriptUtils.SCRIPT_CONTENT_PREFIX + body.toString() +
 										JavaScriptUtils.SCRIPT_CONTENT_SUFFIX;
@@ -110,6 +111,35 @@ public final class StyleAndScriptIdentifier extends AbstractMarkupFilter
 		}
 	}
 
+	// OES == optional empty space
+
+	// OES<!--OES
+	private static final Pattern HTML_START_COMMENT = Pattern.compile("^\\s*<!--\\s*.*", Pattern.DOTALL);
+
+	// OES<![CDATA[OES
+	private static final Pattern CDATA_START_COMMENT = Pattern.compile("^\\s*<!\\[CDATA\\[\\s*.*", Pattern.DOTALL);
+
+	// OES/*OES<![CDATA[OES*/OES
+	private static final Pattern JS_CDATA_START_COMMENT = Pattern.compile("^\\s*\\/\\*\\s*<!\\[CDATA\\[\\s*\\*\\/\\s*.*", Pattern.DOTALL);
+
+	boolean shouldWrapInCdata(final String elementBody)
+	{
+		Args.notNull(elementBody, "elementBody");
+
+		boolean shouldWrap = true;
+
+		if (
+				HTML_START_COMMENT.matcher(elementBody).matches() ||
+				CDATA_START_COMMENT.matcher(elementBody).matches() ||
+				JS_CDATA_START_COMMENT.matcher(elementBody).matches()
+			)
+		{
+			shouldWrap = false;
+		}
+
+		return shouldWrap;
+	}
+
 	private boolean shouldProcess(ComponentTag openTag)
 	{
 		// do not wrap in CDATA any <script> which has special MIME type. WICKET-4425

http://git-wip-us.apache.org/repos/asf/wicket/blob/d8060601/wicket-core/src/test/java/org/apache/wicket/markup/parser/filter/StyleAndScriptIdentifierTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/parser/filter/StyleAndScriptIdentifierTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/parser/filter/StyleAndScriptIdentifierTest.java
new file mode 100644
index 0000000..0181ba9
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/parser/filter/StyleAndScriptIdentifierTest.java
@@ -0,0 +1,85 @@
+/*
+ * 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 org.apache.wicket.WicketTestCase;
+import org.apache.wicket.markup.Markup;
+import org.apache.wicket.markup.MarkupElement;
+import org.junit.Test;
+
+/**
+ * @since 1.5.6
+ */
+public class StyleAndScriptIdentifierTest extends WicketTestCase
+{
+	@Test
+	public void showWrapInCdata()
+	{
+		StyleAndScriptIdentifier filter = new StyleAndScriptIdentifier(Markup.NO_MARKUP);
+
+		String elementBody = "<!-- someJS() ";
+		assertFalse(filter.shouldWrapInCdata(elementBody));
+
+		elementBody = "\n<!-- someJS() ";
+		assertFalse(filter.shouldWrapInCdata(elementBody));
+
+		elementBody = "  <!-- someJS() ";
+		assertFalse(filter.shouldWrapInCdata(elementBody));
+
+
+		elementBody = "<![CDATA[ someJS() ";
+		assertFalse(filter.shouldWrapInCdata(elementBody));
+
+		elementBody = "\n<![CDATA[ someJS() ";
+		assertFalse(filter.shouldWrapInCdata(elementBody));
+
+		elementBody = "  <![CDATA[ someJS() ";
+		assertFalse(filter.shouldWrapInCdata(elementBody));
+
+
+		elementBody = "/*<![CDATA[*/ someJS() ";
+		assertFalse(filter.shouldWrapInCdata(elementBody));
+
+		elementBody = "\n/*<![CDATA[ */ someJS() ";
+		assertFalse(filter.shouldWrapInCdata(elementBody));
+
+		elementBody = "  /* <![CDATA[ */ \n someJS() ";
+		assertFalse(filter.shouldWrapInCdata(elementBody));
+	}
+
+	/**
+	 * https://issues.apache.org/jira/browse/WICKET-4453
+	 *
+	 * This test wraps rawMarkup in org.apache.wicket.util.string.JavaScriptUtils#SCRIPT_CONTENT_PREFIX
+	 * twice - once in Markup.of() and second in the explicit call to StyleAndScriptIdentifier.postProcess().
+	 * The second time it realizes that the element body is already wrapped and skips it.
+	 */
+	@Test
+	public void postProcess()
+	{
+		String rawMarkup = "<script>someJS()</script>";
+		Markup createMarkupElementsMarkup = Markup.of(rawMarkup);
+		Markup markup = new Markup(createMarkupElementsMarkup.getMarkupResourceStream());
+		for (MarkupElement markupElement : createMarkupElementsMarkup)
+		{
+			markup.addMarkupElement(markupElement);
+		}
+		StyleAndScriptIdentifier filter = new StyleAndScriptIdentifier(Markup.NO_MARKUP);
+		filter.postProcess(markup);
+		assertEquals("<script>\n/*<![CDATA[*/\nsomeJS()\n/*]]>*/\n</script>", markup.toString(true));
+	}
+}