On 10/09/2015 14:18, ma...@apache.org wrote: > Author: markt > Date: Thu Sep 10 13:18:02 2015 > New Revision: 1702244 > > URL: http://svn.apache.org/r1702244
Reviews particularly welcome for this commit since it changes a number of EL in JSP edge cases. The intention is to better adhere to the specs. I'll give it a couple of days before back-porting this to give folks a chance to look at it and comment. Mark > Log: > For EL expressions used within attribute values: > a) attribute escaping (e.g. for quotes) DOES NOT apply inside the EL > expression > b) EL expressions can not be used with scriptlets (<%= ... %>) > > For EL expressions in JSP > c) '\$' is an escape for '$' rather than '\${' being an escape for '${' > d) '\#' is an escape for '#' rather than '\#{' being an escape for '#{' > > The implications of this include: > 1. Due to a) > <tags:echo echo="10-${'hello "world'}" /> > is treated as valid (previously the double quote had to be escaped) > > 2. Due to c) (and similarly for d)) > <p>04-\$500</p> > will now render as > <p>04-$500</p> > whereas previously it rendered unchanged > > 3. Due to a) > <tags:echo echo="01-${\"hello world\"}" /> > will now trigger an error > > Modified: > tomcat/trunk/java/org/apache/jasper/compiler/AttributeParser.java > tomcat/trunk/java/org/apache/jasper/compiler/ELParser.java > tomcat/trunk/java/org/apache/jasper/compiler/JspDocumentParser.java > tomcat/trunk/java/org/apache/jasper/compiler/JspReader.java > tomcat/trunk/java/org/apache/jasper/compiler/Parser.java > tomcat/trunk/test/org/apache/el/TestELInJsp.java > tomcat/trunk/test/org/apache/jasper/compiler/TestAttributeParser.java > tomcat/trunk/test/org/apache/jasper/compiler/TestELParser.java > tomcat/trunk/test/org/apache/jasper/compiler/TestParser.java > tomcat/trunk/test/webapp/bug45nnn/bug45427.jsp > tomcat/trunk/test/webapp/bug45nnn/bug45451.jspf > tomcat/trunk/test/webapp/bug45nnn/bug45451a.jsp > tomcat/trunk/test/webapp/el-method.jsp > tomcat/trunk/test/webapp/el-misc.jsp > > Modified: tomcat/trunk/java/org/apache/jasper/compiler/AttributeParser.java > URL: > http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/compiler/AttributeParser.java?rev=1702244&r1=1702243&r2=1702244&view=diff > ============================================================================== > --- tomcat/trunk/java/org/apache/jasper/compiler/AttributeParser.java > (original) > +++ tomcat/trunk/java/org/apache/jasper/compiler/AttributeParser.java Thu Sep > 10 13:18:02 2015 > @@ -202,11 +202,11 @@ public class AttributeParser { > } > > /* > - * For EL need to unquote everything but no need to convert anything. The > - * EL is terminated by '}'. The only other valid location for '}' is > inside > - * a StringLiteral. The literals are delimited by '\'' or '\"'. The only > - * other valid location for '\'' or '\"' is also inside a StringLiteral. > A > - * quote character inside a StringLiteral must be escaped if the same > quote > + * Once inside EL, no need to unquote or convert anything. The EL is > + * terminated by '}'. The only other valid location for '}' is inside a > + * StringLiteral. The literals are delimited by '\'' or '\"'. The only > other > + * valid location for '\'' or '\"' is also inside a StringLiteral. A > quote > + * character inside a StringLiteral must be escaped if the same quote > * character is used to delimit the StringLiteral. > */ > private void parseEL() { > @@ -214,7 +214,7 @@ public class AttributeParser { > boolean insideLiteral = false; > char literalQuote = 0; > while (i < size && !endEL) { > - char ch = nextChar(); > + char ch = input.charAt(i++); > if (ch == '\'' || ch == '\"') { > if (insideLiteral) { > if (literalQuote == ch) { > @@ -228,7 +228,7 @@ public class AttributeParser { > } else if (ch == '\\') { > result.append(ch); > if (insideLiteral && size < i) { > - ch = nextChar(); > + ch = input.charAt(i++); > result.append(ch); > } > } else if (ch == '}') { > > Modified: tomcat/trunk/java/org/apache/jasper/compiler/ELParser.java > URL: > http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/compiler/ELParser.java?rev=1702244&r1=1702243&r2=1702244&view=diff > ============================================================================== > --- tomcat/trunk/java/org/apache/jasper/compiler/ELParser.java (original) > +++ tomcat/trunk/java/org/apache/jasper/compiler/ELParser.java Thu Sep 10 > 13:18:02 2015 > @@ -205,11 +205,9 @@ public class ELParser { > while (hasNextChar()) { > char ch = nextChar(); > if (ch == '\\') { > - // Is this the start of a "\${" or "\#{" escape sequence? > + // Is this the start of a "\$" or "\#" escape sequence? > char p0 = peek(0); > - char p1 = peek(1); > - if ((p0 == '$' || (p0 == '#' && > !isDeferredSyntaxAllowedAsLiteral)) && p1 == '{') { > - buf.append(nextChar()); > + if (p0 == '$' || (p0 == '#' && > !isDeferredSyntaxAllowedAsLiteral)) { > buf.append(nextChar()); > } else { > buf.append(ch); > @@ -229,7 +227,8 @@ public class ELParser { > > /** > * Escape '$' and '#', inverting the unescaping performed in > - * {@link #skipUntilEL()}. > + * {@link #skipUntilEL()} but only for ${ and #{ sequences since escaping > + * for $ and # is optional. > * > * @param input Non-EL input to be escaped > * @param isDeferredSyntaxAllowedAsLiteral > > Modified: tomcat/trunk/java/org/apache/jasper/compiler/JspDocumentParser.java > URL: > http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/compiler/JspDocumentParser.java?rev=1702244&r1=1702243&r2=1702244&view=diff > ============================================================================== > --- tomcat/trunk/java/org/apache/jasper/compiler/JspDocumentParser.java > (original) > +++ tomcat/trunk/java/org/apache/jasper/compiler/JspDocumentParser.java Thu > Sep 10 13:18:02 2015 > @@ -605,11 +605,7 @@ class JspDocumentParser > lastCh = ch; > } > } else if (lastCh == '\\' && (ch == '$' || ch == '#')) { > - if (i + 1 < charBuffer.length() && charBuffer.charAt(i + > 1) == '{') { > - if (pageInfo.isELIgnored()) { > - ttext.write('\\'); > - } > - } else { > + if (pageInfo.isELIgnored()) { > ttext.write('\\'); > } > ttext.write(ch); > > Modified: tomcat/trunk/java/org/apache/jasper/compiler/JspReader.java > URL: > http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/compiler/JspReader.java?rev=1702244&r1=1702243&r2=1702244&view=diff > ============================================================================== > --- tomcat/trunk/java/org/apache/jasper/compiler/JspReader.java (original) > +++ tomcat/trunk/java/org/apache/jasper/compiler/JspReader.java Thu Sep 10 > 13:18:02 2015 > @@ -436,15 +436,17 @@ class JspReader { > > /** > * Skip until the given string is matched in the stream, but ignoring > - * chars initially escaped by a '\'. > + * chars initially escaped by a '\' and any EL expressions. > * When returned, the context is positioned past the end of the match. > * > * @param s The String to match. > + * @param ignoreEL <code>true</code> if something that looks like EL > should > + * not be treated as EL. > * @return A non-null <code>Mark</code> instance (positioned immediately > * before the search string) if found, <strong>null</strong> > * otherwise. > */ > - Mark skipUntilIgnoreEsc(String limit) { > + Mark skipUntilIgnoreEsc(String limit, boolean ignoreEL) { > Mark ret = mark(); > int limlen = limit.length(); > int ch; > @@ -454,6 +456,12 @@ class JspReader { > for (ch = nextChar(ret) ; ch != -1 ; prev = ch, ch = nextChar(ret)) { > if (ch == '\\' && prev == '\\') { > ch = 0; // Double \ is not an escape char > anymore > + } else if (prev == '\\') { > + continue; > + } else if (!ignoreEL && (ch == '$' || ch == '#') && peekChar() > == '{' ) { > + // Move beyond the '{' > + nextChar(); > + skipELExpression(); > } else if (ch == firstChar && prev != '\\') { > for (int i = 1 ; i < limlen ; i++) { > if (peekChar() == limit.charAt(i)) > > Modified: tomcat/trunk/java/org/apache/jasper/compiler/Parser.java > URL: > http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/compiler/Parser.java?rev=1702244&r1=1702243&r2=1702244&view=diff > ============================================================================== > --- tomcat/trunk/java/org/apache/jasper/compiler/Parser.java (original) > +++ tomcat/trunk/java/org/apache/jasper/compiler/Parser.java Thu Sep 10 > 13:18:02 2015 > @@ -199,6 +199,8 @@ class Parser implements TagConstants { > if (qName == null) > return false; > > + boolean ignoreEL = pageInfo.isELIgnored(); > + > // Determine prefix and local name components > String localName = qName; > String uri = ""; > @@ -223,11 +225,14 @@ class Parser implements TagConstants { > err.jspError(reader.mark(), "jsp.error.attribute.noquote"); > > String watchString = ""; > - if (reader.matches("<%=")) > + if (reader.matches("<%=")) { > watchString = "%>"; > + // Can't embed EL in a script expression > + ignoreEL = true; > + } > watchString = watchString + quote; > > - String attrValue = parseAttributeValue(watchString); > + String attrValue = parseAttributeValue(watchString, ignoreEL); > attrs.addAttribute(uri, localName, qName, "CDATA", attrValue); > return true; > } > @@ -258,9 +263,9 @@ class Parser implements TagConstants { > * RTAttributeValueDouble ::= ((QuotedChar - '"')* - > ((QuotedChar-'"')'%>"') > * ('%>"' | TRANSLATION_ERROR) > */ > - private String parseAttributeValue(String watch) throws JasperException { > + private String parseAttributeValue(String watch, boolean ignoreEL) > throws JasperException { > Mark start = reader.mark(); > - Mark stop = reader.skipUntilIgnoreEsc(watch); > + Mark stop = reader.skipUntilIgnoreEsc(watch, ignoreEL); > if (stop == null) { > err.jspError(start, "jsp.error.attribute.unterminated", watch); > } > @@ -1275,7 +1280,11 @@ class Parser implements TagConstants { > > /* > * Parse for a template text string until '<' or "${" or "#{" is > encountered, > - * recognizing escape sequences "<\%", "\${", and "\#{". > + * recognizing escape sequences "<\%", "\$", and "\#". > + * > + * Note: JSP uses '\$' as an escape for '$' and '\#' for '#' whereas EL > uses > + * '\${' for '${' and '\#{' for '#{'. We are processing JSP > template > + * test here so the JSP escapes apply. > */ > private void parseTemplateText(Node parent) { > > @@ -1304,13 +1313,7 @@ class Parser implements TagConstants { > } else if (ch == '\\' && !pageInfo.isELIgnored()) { > int next = reader.peekChar(0); > if (next == '$' || next == '#') { > - if (reader.peekChar(1) == '{') { > - ttext.write(reader.nextChar()); > - ttext.write(reader.nextChar()); > - } else { > - ttext.write(ch); > - ttext.write(reader.nextChar()); > - } > + ttext.write(reader.nextChar()); > } else { > ttext.write(ch); > } > @@ -1362,10 +1365,7 @@ class Parser implements TagConstants { > } else if (ch == '\\') { > int next = reader.peekChar(0); > if (next == '$' || next =='#') { > - if (reader.peekChar(1) == '{') { > - ttext.write(reader.nextChar()); > - ttext.write(reader.nextChar()); > - } > + ttext.write(reader.nextChar()); > } else { > ttext.write('\\'); > } > > Modified: tomcat/trunk/test/org/apache/el/TestELInJsp.java > URL: > http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/el/TestELInJsp.java?rev=1702244&r1=1702243&r2=1702244&view=diff > ============================================================================== > --- tomcat/trunk/test/org/apache/el/TestELInJsp.java (original) > +++ tomcat/trunk/test/org/apache/el/TestELInJsp.java Thu Sep 10 13:18:02 2015 > @@ -93,21 +93,19 @@ public class TestELInJsp extends TomcatB > assertEcho(result, "00-hello world"); > assertEcho(result, "01-hello 'world"); > assertEcho(result, "02-hello \"world"); > - assertEcho(result, "03-hello world"); > - assertEcho(result, "04-hello 'world"); > - assertEcho(result, "05-hello \"world"); > - assertEcho(result, "06-hello world"); > - assertEcho(result, "07-hello 'world"); > - assertEcho(result, "08-hello \"world"); > - assertEcho(result, "09-hello world"); > - assertEcho(result, "10-hello 'world"); > + assertEcho(result, "03-hello \"world"); > + assertEcho(result, "04-hello world"); > + assertEcho(result, "05-hello 'world"); > + assertEcho(result, "06-hello 'world"); > + assertEcho(result, "07-hello \"world"); > + assertEcho(result, "08-hello world"); > + assertEcho(result, "09-hello 'world"); > + assertEcho(result, "10-hello \"world"); > assertEcho(result, "11-hello \"world"); > assertEcho(result, "12-hello world"); > assertEcho(result, "13-hello 'world"); > - assertEcho(result, "14-hello \"world"); > - assertEcho(result, "15-hello world"); > - assertEcho(result, "16-hello 'world"); > - assertEcho(result, "17-hello \"world"); > + assertEcho(result, "14-hello 'world"); > + assertEcho(result, "15-hello \"world"); > } > > @Test > @@ -121,8 +119,6 @@ public class TestELInJsp extends TomcatB > // Warning: JSP attribute escaping != Java String escaping > assertEcho(result, "00-\\'hello world\\'"); > assertEcho(result, "01-\\'hello world\\'"); > - assertEcho(result, "02-\\'hello world\\'"); > - assertEcho(result, "03-\\'hello world\\'"); > > res = getUrl("http://localhost:" + getPort() + > "/test/bug45nnn/bug45451b.jsp"); > result = res.toString(); > @@ -133,18 +129,25 @@ public class TestELInJsp extends TomcatB > assertEcho(result, "01-${1+1}"); > assertEcho(result, "02-\\${1+1}"); > assertEcho(result, "03-\\\\${1+1}"); > - assertEcho(result, "04-\\$500"); > + assertEcho(result, "04-$500"); > + // Inside an EL literal '\' is only used to escape '\', ''' and '"' > + assertEcho(result, "05-\\$"); > + assertEcho(result, "06-\\${"); > assertEcho(result, "10-2"); > assertEcho(result, "11-${1+1}"); > assertEcho(result, "12-\\2"); > assertEcho(result, "13-\\${1+1}"); > assertEcho(result, "14-\\\\2"); > - assertEcho(result, "15-\\$500"); > + assertEcho(result, "15-$500"); > + assertEcho(result, "16-\\$"); > + assertEcho(result, "17-\\${"); > assertEcho(result, "20-2"); > assertEcho(result, "21-#{1+1}"); > assertEcho(result, "22-\\2"); > assertEcho(result, "23-\\#{1+1}"); > assertEcho(result, "24-\\\\2"); > + assertEcho(result, "25-\\#"); > + assertEcho(result, "26-\\#{"); > > res = getUrl("http://localhost:" + getPort() + > "/test/bug45nnn/bug45451c.jsp"); > result = res.toString(); > @@ -176,13 +179,13 @@ public class TestELInJsp extends TomcatB > assertEcho(result, "01-${1+1}"); > assertEcho(result, "02-\\${1+1}"); > assertEcho(result, "03-\\\\${1+1}"); > - assertEcho(result, "04-\\$500"); > + assertEcho(result, "04-$500"); > assertEcho(result, "10-2"); > assertEcho(result, "11-${1+1}"); > assertEcho(result, "12-\\${1+1}"); > assertEcho(result, "13-\\\\${1+1}"); > assertEcho(result, "14-\\\\\\${1+1}"); > - assertEcho(result, "15-\\$500"); > + assertEcho(result, "15-$500"); > assertEcho(result, "20-2"); > assertEcho(result, "21-#{1+1}"); > assertEcho(result, "22-\\#{1+1}"); > @@ -198,13 +201,13 @@ public class TestELInJsp extends TomcatB > assertEcho(result, "01-${1+1}"); > assertEcho(result, "02-\\${1+1}"); > assertEcho(result, "03-\\\\${1+1}"); > - assertEcho(result, "04-\\$500"); > + assertEcho(result, "04-$500"); > assertEcho(result, "10-2"); > assertEcho(result, "11-${1+1}"); > assertEcho(result, "12-\\2"); > assertEcho(result, "13-\\${1+1}"); > assertEcho(result, "14-\\\\2"); > - assertEcho(result, "15-\\$500"); > + assertEcho(result, "15-$500"); > assertEcho(result, "20-#{1+1}"); > assertEcho(result, "21-\\#{1+1}"); > assertEcho(result, "22-\\#{1+1}"); > @@ -303,13 +306,13 @@ public class TestELInJsp extends TomcatB > assertEcho(result, "08-a2z"); > assertEcho(result, "09-az2"); > assertEcho(result, "10-${'foo'}bar"); > - assertEcho(result, "11-\"}"); > + assertEcho(result, "11-\\\"}"); > assertEcho(result, "12-foo\\bar\\baz"); > assertEcho(result, "13-foo\\bar\\baz"); > assertEcho(result, "14-foo\\bar\\baz"); > assertEcho(result, "15-foo\\bar\\baz"); > assertEcho(result, "16-foo\\bar\\baz"); > - assertEcho(result, "17-foo\\bar\\baz"); > + assertEcho(result, "17-foo\\'bar'\\"baz""); > assertEcho(result, "18-3"); > assertEcho(result, "19-4"); > assertEcho(result, "20-4"); > > Modified: > tomcat/trunk/test/org/apache/jasper/compiler/TestAttributeParser.java > URL: > http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/jasper/compiler/TestAttributeParser.java?rev=1702244&r1=1702243&r2=1702244&view=diff > ============================================================================== > --- tomcat/trunk/test/org/apache/jasper/compiler/TestAttributeParser.java > (original) > +++ tomcat/trunk/test/org/apache/jasper/compiler/TestAttributeParser.java Thu > Sep 10 13:18:02 2015 > @@ -127,19 +127,15 @@ public class TestAttributeParser { > // list and looking at the spec to find some edge cases > > // '\' is only an escape character inside a StringLiteral > - assertEquals("\\", evalAttr("${'\\\\\\\\'}", '\"')); > - assertEquals("\\", evalAttr("${\"\\\\\\\\\"}", '\"')); > + // Attribute escaping does not apply inside EL expressions > + assertEquals("\\", evalAttr("${'\\\\'}", '\"')); > > // Can use ''' inside '"' when quoting with '"' and vice versa > without > // escaping > - assertEquals("\\\"", evalAttr("${'\\\\\\\\\\\"'}", '\"')); > - assertEquals("\"\\", evalAttr("${'\\\"\\\\\\\\'}", '\"')); > - assertEquals("\\'", evalAttr("${'\\\\\\\\\\\\''}", '\"')); > - assertEquals("'\\", evalAttr("${'\\\\'\\\\\\\\'}", '\"')); > - assertEquals("\\'", evalAttr("${\\\"\\\\\\\\'\\\"}", '\"')); > - assertEquals("'\\", evalAttr("${\\\"'\\\\\\\\\\\"}", '\"')); > - assertEquals("\\\"", evalAttr("${\\\"\\\\\\\\\\\\\\\"\\\"}", '\"')); > - assertEquals("\"\\", evalAttr("${\\\"\\\\\\\"\\\\\\\\\\\"}", '\"')); > + assertEquals("\\\"", evalAttr("${'\\\\\"'}", '\"')); > + assertEquals("\"\\", evalAttr("${'\\\"\\\\'}", '\"')); > + assertEquals("\\'", evalAttr("${'\\\\\\''}", '\"')); > + assertEquals("'\\", evalAttr("${'\\'\\\\'}", '\"')); > > // Quoting <% and %> > assertEquals("hello <% world", evalAttr("hello <\\% world", '\"')); > @@ -156,9 +152,8 @@ public class TestAttributeParser { > // expression that follows from being evaluated. > // > assertEquals("foo\\bar\\baz", > evalAttr("${\'foo\'}\\\\${\'bar\'}\\\\${\'baz\'}", '\"')); > - assertEquals("foo\\bar\\baz", > evalAttr("${\'foo\'}\\\\${\\\"bar\\\"}\\\\${\'baz\'}", '\"')); > - assertEquals("foo\\bar\\baz", > evalAttr("${\\\"foo\\\"}\\\\${\'bar\'}\\\\${\\\"baz\\\"}", '\"')); > - assertEquals("foo\\bar\\baz", > evalAttr("${\"foo\"}\\\\${\\\'bar\\\'}\\\\${\"baz\"}", '\'')); > + assertEquals("foo\\bar\\baz", > evalAttr("${\'foo\'}\\\\${\"bar\"}\\\\${\'baz\'}", '\"')); > + assertEquals("foo\\bar\\baz", > evalAttr("${\"foo\"}\\\\${\'bar\'}\\\\${\"baz\"}", '\"')); > } > > @Test > > Modified: tomcat/trunk/test/org/apache/jasper/compiler/TestELParser.java > URL: > http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/jasper/compiler/TestELParser.java?rev=1702244&r1=1702243&r2=1702244&view=diff > ============================================================================== > --- tomcat/trunk/test/org/apache/jasper/compiler/TestELParser.java (original) > +++ tomcat/trunk/test/org/apache/jasper/compiler/TestELParser.java Thu Sep 10 > 13:18:02 2015 > @@ -238,13 +238,15 @@ public class TestELParser { > > @Test > public void testEscape04() throws JasperException { > - doTestParser("\\$", "\\$"); > + // When parsed as EL in JSP the escaping of $ as \$ is optional > + doTestParser("\\$", "\\$", "$"); > } > > > @Test > public void testEscape05() throws JasperException { > - doTestParser("\\#", "\\#"); > + // When parsed as EL in JSP the escaping of # as \# is optional > + doTestParser("\\#", "\\#", "#"); > } > > > @@ -280,18 +282,23 @@ public class TestELParser { > > > private void doTestParser(String input, String expected) throws > JasperException { > + doTestParser(input, expected, input); > + } > + > + private void doTestParser(String input, String expectedResult, String > expectedBuilderOutput) throws JasperException { > + > ELException elException = null; > String elResult = null; > > // Don't try and evaluate expressions that depend on variables or > functions > - if (expected != null) { > + if (expectedResult != null) { > try { > ELManager manager = new ELManager(); > ELContext context = manager.getELContext(); > ExpressionFactory factory = ELManager.getExpressionFactory(); > ValueExpression ve = factory.createValueExpression(context, > input, String.class); > elResult = ve.getValue(context).toString(); > - Assert.assertEquals(expected, elResult); > + Assert.assertEquals(expectedResult, elResult); > } catch (ELException ele) { > elException = ele; > } > @@ -312,6 +319,6 @@ public class TestELParser { > > nodes.visit(textBuilder); > > - Assert.assertEquals(input, textBuilder.getText()); > + Assert.assertEquals(expectedBuilderOutput, textBuilder.getText()); > } > } > > Modified: tomcat/trunk/test/org/apache/jasper/compiler/TestParser.java > URL: > http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/jasper/compiler/TestParser.java?rev=1702244&r1=1702243&r2=1702244&view=diff > ============================================================================== > --- tomcat/trunk/test/org/apache/jasper/compiler/TestParser.java (original) > +++ tomcat/trunk/test/org/apache/jasper/compiler/TestParser.java Thu Sep 10 > 13:18:02 2015 > @@ -285,9 +285,9 @@ public class TestParser extends TomcatBa > Assert.assertTrue(result, result.contains("<set > data-value=\"03b\\\\x\\?resize03b\"/>")); > Assert.assertTrue(result, result.contains("<04a\\?resize04a/>")); > Assert.assertTrue(result, > result.contains("<04b\\\\x\\?resize04b/>")); > - Assert.assertTrue(result, result.contains("<set > data-value=\"05a\\$${&\"/>")); > - Assert.assertTrue(result, result.contains("<set > data-value=\"05b\\$${&2\"/>")); > - Assert.assertTrue(result, result.contains("<set > data-value=\"05c\\##{>hello<\"/>")); > + Assert.assertTrue(result, result.contains("<set > data-value=\"05a$${&\"/>")); > + Assert.assertTrue(result, result.contains("<set > data-value=\"05b$${&2\"/>")); > + Assert.assertTrue(result, result.contains("<set > data-value=\"05c##{>hello<\"/>")); > Assert.assertTrue(result, result.contains("05x:<set > data-value=\"\"/>")); > Assert.assertTrue(result, result.contains("<set > xmlns:foo=\"urn:06a\\bar\\baz\"/>")); > Assert.assertTrue(result, result.contains("07a:<set > data-value=\"\\?resize\"/>")); > > Modified: tomcat/trunk/test/webapp/bug45nnn/bug45427.jsp > URL: > http://svn.apache.org/viewvc/tomcat/trunk/test/webapp/bug45nnn/bug45427.jsp?rev=1702244&r1=1702243&r2=1702244&view=diff > ============================================================================== > --- tomcat/trunk/test/webapp/bug45nnn/bug45427.jsp (original) > +++ tomcat/trunk/test/webapp/bug45nnn/bug45427.jsp Thu Sep 10 13:18:02 2015 > @@ -21,21 +21,19 @@ > <p>00-${'hello world'}</p> > <p>01-${'hello \'world'}</p> > <p>02-${'hello "world'}</p> > - <p>03-${"hello world"}</p> > - <p>04-${"hello 'world"}</p> > - <p>05-${"hello \"world"}</p> > + <p>03-${'hello \"world'}</p> > + <p>04-${"hello world"}</p> > + <p>05-${"hello 'world"}</p> > + <p>06-${"hello \'world"}</p> > + <p>07-${"hello \"world"}</p> > > - <tags:echo echo="06-${'hello world'}" /> > - <tags:echo echo="07-${'hello \\\'world'}" /> > - <tags:echo echo="08-${'hello \"world'}" /> > - <tags:echo echo="09-${\"hello world\"}" /> > - <tags:echo echo="10-${\"hello 'world\"}" /> > - <tags:echo echo="11-${\"hello \\\"world\"}" /> > - <tags:echo echo='12-${\'hello world\'}' /> > - <tags:echo echo='13-${\'hello \\\'world\'}' /> > - <tags:echo echo='14-${\'hello "world\'}' /> > - <tags:echo echo='15-${"hello world"}' /> > - <tags:echo echo='16-${"hello \'world"}' /> > - <tags:echo echo='17-${"hello \\\"world"}' /> > + <tags:echo echo="08-${'hello world'}" /> > + <tags:echo echo="09-${'hello \'world'}" /> > + <tags:echo echo="10-${'hello "world'}" /> > + <tags:echo echo="11-${'hello \"world'}" /> > + <tags:echo echo='12-${"hello world"}' /> > + <tags:echo echo='13-${"hello 'world"}' /> > + <tags:echo echo='14-${"hello \'world"}' /> > + <tags:echo echo='15-${"hello \"world"}' /> > </body> > </html> > \ No newline at end of file > > Modified: tomcat/trunk/test/webapp/bug45nnn/bug45451.jspf > URL: > http://svn.apache.org/viewvc/tomcat/trunk/test/webapp/bug45nnn/bug45451.jspf?rev=1702244&r1=1702243&r2=1702244&view=diff > ============================================================================== > --- tomcat/trunk/test/webapp/bug45nnn/bug45451.jspf (original) > +++ tomcat/trunk/test/webapp/bug45nnn/bug45451.jspf Thu Sep 10 13:18:02 2015 > @@ -19,14 +19,20 @@ > <p>02-\\${1+1}</p> > <p>03-\\\${1+1}</p> > <p>04-\$500</p> > +<p>05-${'\\$'}</p> > +<p>06-${'\\${'}</p> > <tags:echo echo="10-${1+1}" /> > <tags:echo echo="11-\${1+1}" /> > <tags:echo echo="12-\\${1+1}" /> > <tags:echo echo="13-\\\${1+1}" /> > <tags:echo echo="14-\\\\${1+1}" /> > <tags:echo echo="15-\$500" /> > +<tags:echo echo="16-${'\\$'}" /> > +<tags:echo echo="17-${'\\${'}" /> > <tags:echo-deferred echo="20-#{1+1}" /> > <tags:echo-deferred echo="21-\#{1+1}" /> > <tags:echo-deferred echo="22-\\#{1+1}" /> > <tags:echo-deferred echo="23-\\\#{1+1}" /> > -<tags:echo-deferred echo="24-\\\\#{1+1}" /> > \ No newline at end of file > +<tags:echo-deferred echo="24-\\\\#{1+1}" /> > +<tags:echo-deferred echo="25-#{'\\#'}" /> > +<tags:echo-deferred echo="26-#{'\\#{'}" /> > \ No newline at end of file > > Modified: tomcat/trunk/test/webapp/bug45nnn/bug45451a.jsp > URL: > http://svn.apache.org/viewvc/tomcat/trunk/test/webapp/bug45nnn/bug45451a.jsp?rev=1702244&r1=1702243&r2=1702244&view=diff > ============================================================================== > --- tomcat/trunk/test/webapp/bug45nnn/bug45451a.jsp (original) > +++ tomcat/trunk/test/webapp/bug45nnn/bug45451a.jsp Thu Sep 10 13:18:02 2015 > @@ -19,8 +19,6 @@ > <head><title>Bug 45451 test case</title></head> > <body> > <tags:echo echo="00-\\\'${'hello world'}\\\'" /> > - <tags:echo echo="01-\\\'${\"hello world\"}\\\'" /> > - <tags:echo echo='02-\\\'${\'hello world\'}\\\'' /> > - <tags:echo echo='03-\\\'${"hello world"}\\\'' /> > + <tags:echo echo='01-\\\'${"hello world"}\\\'' /> > </body> > </html> > \ No newline at end of file > > Modified: tomcat/trunk/test/webapp/el-method.jsp > URL: > http://svn.apache.org/viewvc/tomcat/trunk/test/webapp/el-method.jsp?rev=1702244&r1=1702243&r2=1702244&view=diff > ============================================================================== > --- tomcat/trunk/test/webapp/el-method.jsp (original) > +++ tomcat/trunk/test/webapp/el-method.jsp Thu Sep 10 13:18:02 2015 > @@ -28,10 +28,10 @@ > pageContext.setAttribute("testBeanA", beanA, PageContext.REQUEST_SCOPE); > pageContext.setAttribute("testBeanB", beanB, PageContext.REQUEST_SCOPE); > %> > - <tags:echo echo="00-${testBeanA[\"bean\"].sayHello('JUnit')}" /> > + <tags:echo echo="00-${testBeanA["bean"].sayHello('JUnit')}" /> > <tags:echo echo="01-${testBeanA.bean.sayHello('JUnit')}" /> > <tags:echo echo="02-${testBeanB.sayHello('JUnit')}" /> > - <tags:echo-deferred echo="03-#{testBeanA[\"bean\"].sayHello('JUnit')}" /> > + <tags:echo-deferred echo="03-#{testBeanA["bean"].sayHello('JUnit')}" /> > <tags:echo-deferred echo="04-#{testBeanA.bean.sayHello('JUnit')}" /> > <tags:echo-deferred echo="05-#{testBeanB.sayHello('JUnit')}" /> > </body> > > Modified: tomcat/trunk/test/webapp/el-misc.jsp > URL: > http://svn.apache.org/viewvc/tomcat/trunk/test/webapp/el-misc.jsp?rev=1702244&r1=1702243&r2=1702244&view=diff > ============================================================================== > --- tomcat/trunk/test/webapp/el-misc.jsp (original) > +++ tomcat/trunk/test/webapp/el-misc.jsp Thu Sep 10 13:18:02 2015 > @@ -25,17 +25,17 @@ > <tags:echo echo="${'2'}az-04" /> > <tags:echo echo="05-a${'2'}z" /> > <tags:echo echo="06-az${'2'}" /> > - <tags:echo echo="${\"2\"}az-07" /> > - <tags:echo echo="08-a${\"2\"}z" /> > - <tags:echo echo="09-az${\"2\"}" /> > + <tags:echo echo="${"2"}az-07" /> > + <tags:echo echo="08-a${"2"}z" /> > + <tags:echo echo="09-az${"2"}" /> > <tags:echo echo="10-\${'foo'}${'bar'}" /> > - <tags:echo echo="11-${\"\\\"}\"}" /> > + <tags:echo echo="11-${"\\"}\"}" /> > <tags:echo echo="12-${'foo'}\\${'bar'}\\${'baz'}" /> > - <tags:echo echo="13-${'foo'}\\${\"bar\"}\\${'baz'}" /> > - <tags:echo echo="14-${\"foo\"}\\${'bar'}\\${\"baz\"}" /> > - <tags:echo echo='15-${\'foo\'}\\${"bar"}\\${\'baz\'}' /> > - <tags:echo echo='16-${"foo"}\\${\'bar\'}\\${"baz"}' /> > - <tags:echo echo='17-${"foo"}\\${'bar'}\\${"baz"}' /> > + <tags:echo echo="13-${'foo'}\\${"bar"}\\${'baz'}" /> > + <tags:echo echo="14-${"foo"}\\${'bar'}\\${"baz"}" /> > + <tags:echo echo='15-${'foo'}\\${"bar"}\\${'baz'}' /> > + <tags:echo echo='16-${"foo"}\\${'bar'}\\${"baz"}' /> > + <tags:echo > echo='17-${"foo"}\\${"'bar'"}\\${""baz""}' /> > <tags:echo echo='18-${((x,y)->x+y)(1,2)}' /> > <tags:echo echo='19-${{1,2,3,4}.stream().max().orElse(-1)}' /> > <p>20-${{1,2,3,4}.stream().max().orElse(-1)}</p> > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org > For additional commands, e-mail: dev-h...@tomcat.apache.org > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org