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 2021/03/22 14:15:13 UTC

[wicket] branch wicket-8.x updated: WICKET-6815 Incorrect parsing of html attributes

This is an automated email from the ASF dual-hosted git repository.

mgrigorov pushed a commit to branch wicket-8.x
in repository https://gitbox.apache.org/repos/asf/wicket.git


The following commit(s) were added to refs/heads/wicket-8.x by this push:
     new a7d3c95  WICKET-6815 Incorrect parsing of html attributes
a7d3c95 is described below

commit a7d3c954864308d9f65037de7c09df6adc35e30e
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
AuthorDate: Mon Mar 22 16:12:16 2021 +0200

    WICKET-6815 Incorrect parsing of html attributes
    
    Allow '-' in namespaces.
    Allow ':' and '@' as start char in attribute names.
    
    (cherry picked from commit 19eee9d1451d17c72319a696241e3db71c91d7ce)
---
 .../wicket/util/parse/metapattern/MetaPattern.java |  7 ++-
 .../parsers/VariableAssignmentParserTest.java      | 50 ++++++++++++++++++++--
 2 files changed, 52 insertions(+), 5 deletions(-)

diff --git a/wicket-util/src/main/java/org/apache/wicket/util/parse/metapattern/MetaPattern.java b/wicket-util/src/main/java/org/apache/wicket/util/parse/metapattern/MetaPattern.java
index de61148..7d570b4 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/parse/metapattern/MetaPattern.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/parse/metapattern/MetaPattern.java
@@ -62,8 +62,11 @@ public class MetaPattern implements IClusterable
 	private static final String _STRING = "(?:[\\w\\-\\.]+|" + _DOUBLE_QUOTED_STRING + "|" +
 		_SINGLE_QUOTED_STRING + ")";
 	private static final String _OPTIONAL_STRING = _STRING + "?";
-	private static final String _VARIABLE_NAME = "[A-Za-z_][A-Za-z0-9_]*";
-	private static final String _XML_NAME = "[A-Za-z_][A-Za-z0-9_.-]*";
+	private static final String _VARIABLE_NAME = "[A-Za-z_][A-Za-z0-9_-]*";
+
+	// '@' char is not allowed by https://www.w3.org/TR/REC-xml/#NT-NameStartChar
+	// but we allow it to be friendlier with VueJS
+	private static final String _XML_NAME = "[A-Za-z_:@][A-Za-z0-9_.-]*";
 
 	// Delimiters and punctuation
 	/** Constant for whitespace. */
diff --git a/wicket-util/src/test/java/org/apache/wicket/util/parse/metapattern/parsers/VariableAssignmentParserTest.java b/wicket-util/src/test/java/org/apache/wicket/util/parse/metapattern/parsers/VariableAssignmentParserTest.java
index 9ff73b9..821d16b 100644
--- a/wicket-util/src/test/java/org/apache/wicket/util/parse/metapattern/parsers/VariableAssignmentParserTest.java
+++ b/wicket-util/src/test/java/org/apache/wicket/util/parse/metapattern/parsers/VariableAssignmentParserTest.java
@@ -36,20 +36,64 @@ public class VariableAssignmentParserTest extends Assert
 
 		VariableAssignmentParser parser = new VariableAssignmentParser(tagName + " name='value'");
 
-		parser.matcher().find(tagName.length());
+		assertTrue(parser.matcher().find(tagName.length()));
 		assertEquals("name", parser.getKey());
 		assertEquals("'value'", parser.getValue());
 
 		parser = new VariableAssignmentParser(tagName + " namespace:name='value'");
 
-		parser.matcher().find(tagName.length());
+		assertTrue(parser.matcher().find(tagName.length()));
 		assertEquals("namespace:name", parser.getKey());
 		assertEquals("'value'", parser.getValue());
 
 		parser = new VariableAssignmentParser(tagName + " namespace:name:subname='value'");
 
-		parser.matcher().find(tagName.length());
+		assertTrue(parser.matcher().find(tagName.length()));
 		assertEquals("namespace:name:subname", parser.getKey());
 		assertEquals("'value'", parser.getValue());
 	}
+
+	/**
+	 * https://issues.apache.org/jira/browse/WICKET-6815
+	 */
+	@Test
+	public void testTagAttributeParsing()
+	{
+		String tag = "label wicket:id=\"myid\" bind:test=\"test\" v-bind:test2=\"test2\" :test3=\"test3\" @test4=\"test4\"";
+		VariableAssignmentParser attributeParser = new VariableAssignmentParser(tag);
+		int pos = 5;
+		assertTrue(attributeParser.matcher().find(pos));
+		String key = attributeParser.getKey();
+		String value = attributeParser.getValue();
+		pos = attributeParser.matcher().end(0);
+		assertEquals("wicket:id", key);
+		assertEquals("\"myid\"", value);
+
+		assertTrue(attributeParser.matcher().find(pos));
+		key = attributeParser.getKey();
+		value = attributeParser.getValue();
+		pos = attributeParser.matcher().end(0);
+		assertEquals("bind:test", key);
+		assertEquals("\"test\"", value);
+
+		assertTrue(attributeParser.matcher().find(pos));
+		key = attributeParser.getKey();
+		value = attributeParser.getValue();
+		pos = attributeParser.matcher().end(0);
+		assertEquals("v-bind:test2", key);
+		assertEquals("\"test2\"", value);
+
+		assertTrue(attributeParser.matcher().find(pos));
+		key = attributeParser.getKey();
+		value = attributeParser.getValue();
+		pos = attributeParser.matcher().end(0);
+		assertEquals(":test3", key);
+		assertEquals("\"test3\"", value);
+
+		assertTrue(attributeParser.matcher().find(pos));
+		key = attributeParser.getKey();
+		value = attributeParser.getValue();
+		assertEquals("@test4", key);
+		assertEquals("\"test4\"", value);
+	}
 }