You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by lr...@apache.org on 2009/02/26 19:54:04 UTC
svn commit: r748271 - in /incubator/shindig/trunk/java/gadgets/src:
main/java/org/apache/shindig/gadgets/parse/caja/
test/java/org/apache/shindig/gadgets/parse/caja/
test/java/org/apache/shindig/gadgets/rewrite/
test/resources/org/apache/shindig/gadget...
Author: lryan
Date: Thu Feb 26 18:54:04 2009
New Revision: 748271
URL: http://svn.apache.org/viewvc?rev=748271&view=rev
Log:
Fix for bug in CSS parser which cloned a Uri declaration to an Import declaration. SHINDIG-953
Added unit tests to cover issues cloning CSS pseduo-DOM
Output CSS URLs quoted with '' instead of "" to be more HTML attribute friendly.
Added:
incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritestyle2-expected.html
incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritestyle2.html
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssLexerParser.java
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/CajaCssLexerParserTest.java
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CSSContentRewriterTest.java
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriterTest.java
incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritebasic-expected.css
incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritebasic.css
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssLexerParser.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssLexerParser.java?rev=748271&r1=748270&r2=748271&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssLexerParser.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssLexerParser.java Thu Feb 26 18:54:04 2009
@@ -72,53 +72,9 @@
parsedCss = parsedCssCache.getElement(key);
}
if (parsedCss == null) {
- parsedCss = Lists.newArrayList();
- CharProducer producer = CharProducer.Factory.create(new StringReader(content),
- new InputSource(DUMMY_SOURCE));
- CssLexer lexer = new CssLexer(producer);
- try {
- StringBuilder builder = new StringBuilder();
- boolean inImport = false;
- while (lexer.hasNext()) {
- Token<CssTokenType> token = lexer.next();
- if (token.type == CssTokenType.SYMBOL && token.text.equalsIgnoreCase("@import")) {
- parsedCss.add(builder.toString());
- builder.setLength(0);
- inImport = true;
- } else if (inImport) {
- if (token.type == CssTokenType.URI) {
- parsedCss.add(builder.toString());
- builder.setLength(0);
- Matcher matcher = urlMatcher.matcher(token.text);
- if (matcher.find()) {
- parsedCss.add(new ImportDecl(matcher.group(2).trim()));
- }
- } else if (token.type != CssTokenType.SPACE && token.type != CssTokenType.PUNCTUATION) {
- inImport = false;
- builder.append(token.text);
- } else {
- //builder.append(token.text);
- }
- } else if (token.type == CssTokenType.URI) {
- Matcher matcher = urlMatcher.matcher(token.text);
- if (!matcher.find()) {
- builder.append(token.text);
- } else {
- parsedCss.add(builder.toString());
- builder.setLength(0);
- parsedCss.add(new UriDecl(matcher.group(2).trim()));
- }
- } else {
- builder.append(token.text);
- }
- }
- parsedCss.add(builder.toString());
-
- if (shouldCache) {
- parsedCssCache.addElement(key, parsedCss);
- }
- } catch (ParseException pe) {
- throw new GadgetException(GadgetException.Code.CSS_PARSE_ERROR, pe);
+ parsedCss = parseImpl(content);
+ if (shouldCache) {
+ parsedCssCache.addElement(key, parsedCss);
}
}
@@ -128,7 +84,7 @@
if (o instanceof ImportDecl) {
cloned.add(new ImportDecl(((ImportDecl) o).getUri()));
} else if (o instanceof UriDecl) {
- cloned.add(new ImportDecl(((UriDecl) o).getUri()));
+ cloned.add(new UriDecl(((UriDecl) o).getUri()));
} else {
cloned.add(o);
}
@@ -138,6 +94,54 @@
return parsedCss;
}
+ List<Object> parseImpl(String content) throws GadgetException {
+ List<Object> parsedCss = Lists.newArrayList();
+ CharProducer producer = CharProducer.Factory.create(new StringReader(content),
+ new InputSource(DUMMY_SOURCE));
+ CssLexer lexer = new CssLexer(producer);
+ try {
+ StringBuilder builder = new StringBuilder();
+ boolean inImport = false;
+ while (lexer.hasNext()) {
+ Token<CssTokenType> token = lexer.next();
+ if (token.type == CssTokenType.SYMBOL && token.text.equalsIgnoreCase("@import")) {
+ parsedCss.add(builder.toString());
+ builder.setLength(0);
+ inImport = true;
+ } else if (inImport) {
+ if (token.type == CssTokenType.URI) {
+ parsedCss.add(builder.toString());
+ builder.setLength(0);
+ Matcher matcher = urlMatcher.matcher(token.text);
+ if (matcher.find()) {
+ parsedCss.add(new ImportDecl(matcher.group(2).trim()));
+ }
+ } else if (token.type != CssTokenType.SPACE && token.type != CssTokenType.PUNCTUATION) {
+ inImport = false;
+ builder.append(token.text);
+ } else {
+ //builder.append(token.text);
+ }
+ } else if (token.type == CssTokenType.URI) {
+ Matcher matcher = urlMatcher.matcher(token.text);
+ if (!matcher.find()) {
+ builder.append(token.text);
+ } else {
+ parsedCss.add(builder.toString());
+ builder.setLength(0);
+ parsedCss.add(new UriDecl(matcher.group(2).trim()));
+ }
+ } else {
+ builder.append(token.text);
+ }
+ }
+ parsedCss.add(builder.toString());
+ } catch (ParseException pe) {
+ throw new GadgetException(GadgetException.Code.CSS_PARSE_ERROR, pe);
+ }
+ return parsedCss;
+ }
+
/** Serialize a stylesheet to a String */
public String serialize(List<Object> styleSheet) {
StringWriter writer = new StringWriter();
@@ -178,7 +182,7 @@
}
public String toString() {
- return "@import url(\"" + uri + "\");\n";
+ return "@import url('" + uri + "');\n";
}
}
@@ -199,7 +203,7 @@
}
public String toString() {
- return "url(\"" + uri + "\");\n";
+ return "url('" + uri + "')";
}
}
}
Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/CajaCssLexerParserTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/CajaCssLexerParserTest.java?rev=748271&r1=748270&r2=748271&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/CajaCssLexerParserTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/CajaCssLexerParserTest.java Thu Feb 26 18:54:04 2009
@@ -30,6 +30,10 @@
private CajaCssLexerParser cajaCssParser;
+ private static final String CSS = "@import url('www.example.org/someother.css');\n" +
+ ".xyz { background-image : url(http://www.example.org/someimage.gif); }\n" +
+ "A { color : #7f7f7f }\n";
+
@Override
protected void setUp() throws Exception {
super.setUp();
@@ -43,10 +47,22 @@
}
public void testClone() throws Exception {
+ // Set the cache so we force cloning
cajaCssParser.setCacheProvider(new LruCacheProvider(100));
- String css = "@import url('www.example.org/someother.css'); .xyz { font : bold; } A { color : #7f7f7f }";
- List<Object> styleSheet = cajaCssParser.parse(css);
- List<Object> styleSheet2 = cajaCssParser.parse(css);
+
+ // Compare the raw parsed structure to a cloned one
+ List<Object> styleSheet = cajaCssParser.parseImpl(CSS);
+ List<Object> styleSheet2 = cajaCssParser.parse(CSS);
+ assertEquals(cajaCssParser.serialize(styleSheet), cajaCssParser.serialize(styleSheet2));
+ }
+
+ public void testCache() throws Exception {
+ cajaCssParser.setCacheProvider(new LruCacheProvider(100));
+ // Ensure that we return cloned instances and not the original out of the cache. Cloned
+ // instances intentionally do not compare equal but should produce the same output
+ List<Object> styleSheet = cajaCssParser.parse(CSS);
+ List<Object> styleSheet2 = cajaCssParser.parse(CSS);
assertFalse(styleSheet.equals(styleSheet2));
+ assertEquals(cajaCssParser.serialize(styleSheet), cajaCssParser.serialize(styleSheet2));
}
}
\ No newline at end of file
Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CSSContentRewriterTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CSSContentRewriterTest.java?rev=748271&r1=748270&r2=748271&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CSSContentRewriterTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CSSContentRewriterTest.java Thu Feb 26 18:54:04 2009
@@ -26,6 +26,7 @@
import org.apache.shindig.gadgets.parse.caja.CajaCssLexerParser;
import com.google.common.collect.Lists;
+
import org.easymock.EasyMock;
import java.io.StringReader;
@@ -98,10 +99,10 @@
"div {list-style-image:url('http://a.b.com/bullet.gif');list-style-position:outside;margin:5px;padding:0}\n" +
".someid {background-image:url(http://a.b.com/bigimg.png);float:right;width:165px;height:23px;margin-top:4px;margin-left:5px}";
String rewritten =
- "div {list-style-image:url(\"http://www.test.com/dir/proxy?url=http%3A%2F%2Fa.b.com%2Fbullet.gif&fp=1150739864\");\n"
- + ";list-style-position:outside;margin:5px;padding:0}\n"
- + ".someid {background-image:url(\"http://www.test.com/dir/proxy?url=http%3A%2F%2Fa.b.com%2Fbigimg.png&fp=1150739864\");\n"
- + ";float:right;width:165px;height:23px;margin-top:4px;margin-left:5px}";
+ "div {list-style-image:url('http://www.test.com/dir/proxy?url=http%3A%2F%2Fa.b.com%2Fbullet.gif&fp=1150739864');\n"
+ + "list-style-position:outside;margin:5px;padding:0}\n"
+ + ".someid {background-image:url('http://www.test.com/dir/proxy?url=http%3A%2F%2Fa.b.com%2Fbigimg.png&fp=1150739864');\n"
+ + "float:right;width:165px;height:23px;margin-top:4px;margin-left:5px}";
validateRewritten(original, rewritten);
}
Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriterTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriterTest.java?rev=748271&r1=748270&r2=748271&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriterTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriterTest.java Thu Feb 26 18:54:04 2009
@@ -127,7 +127,8 @@
public void testStyleBasic() throws Exception {
String content = IOUtils.toString(this.getClass().getClassLoader().
getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritestylebasic.html"));
- Document doc = rewriteContent(rewriter, content).getDocument();
+ MutableContent mc = rewriteContent(rewriter, content);
+ Document doc = mc.getDocument();
XPathWrapper wrapper = new XPathWrapper(doc);
@@ -157,6 +158,15 @@
assertEquals("div { color : black; }", wrapper.getValue("//style[1]").trim());
}
+ public void testStyleBasic2() throws Exception {
+ String content = IOUtils.toString(this.getClass().getClassLoader().
+ getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritestyle2.html"));
+ String expected = IOUtils.toString(this.getClass().getClassLoader().
+ getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritestyle2-expected.html"));
+ MutableContent mc = rewriteContent(rewriter, content);
+ assertEquals(mc.getContent(), expected);
+ }
+
public void testNoRewriteUnknownMimeType() {
// Strict mock as we expect no calls
MutableContent mc = mock(MutableContent.class, true);
Modified: incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritebasic-expected.css
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritebasic-expected.css?rev=748271&r1=748270&r2=748271&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritebasic-expected.css (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritebasic-expected.css Thu Feb 26 18:54:04 2009
@@ -1,11 +1,12 @@
/* Rewrite various url forms in input statements, absolute and host/path relative.
Test exclusions */
-@import url("http://www.test.com/dir/proxy?url=http%3A%2F%2Fwww.example.org%2Fother1.css&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864");
-@import url("http://www.test.com/dir/proxy?url=http%3A%2F%2Fwww.example.org%2Fpath%2Frelative%2Fother2.css&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864");
-@import url("http://www.example.org/hostrelative/excluded/other1.css");
+@import url('http://www.test.com/dir/proxy?url=http%3A%2F%2Fwww.example.org%2Fother1.css&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864');
+@import url('http://www.test.com/dir/proxy?url=http%3A%2F%2Fwww.example.org%2Fpath%2Frelative%2Fother2.css&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864');
+@import url('http://www.example.org/hostrelative/excluded/other1.css');
DiV {
font: arial;
+ background-image : url('http://www.test.com/dir/proxy?url=http%3A%2F%2Fwww.some.site%2Fimage.gif&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864');
}
/* A comment? */
\ No newline at end of file
Modified: incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritebasic.css
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritebasic.css?rev=748271&r1=748270&r2=748271&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritebasic.css (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritebasic.css Thu Feb 26 18:54:04 2009
@@ -7,6 +7,7 @@
DiV {
font: arial;
+ background-image : url("http://www.some.site/image.gif");
}
/* A comment? */
\ No newline at end of file
Added: incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritestyle2-expected.html
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritestyle2-expected.html?rev=748271&view=auto
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritestyle2-expected.html (added)
+++ incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritestyle2-expected.html Thu Feb 26 18:54:04 2009
@@ -0,0 +1,11 @@
+<html><head><style>
+ .testclass {
+ background-image: url('http://www.test.com/dir/proxy?url=http%3A%2F%2Fwww.example.org%2Fimage.jpg&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864');
+ }
+</style></head><body>
+<div class="testclass">Background image Style</div><br>
+<div style="background-image:url(http://www.example.org/image2.jpg);">Background image Inline
+</div><br>
+<script type="text/javascript">
+ somescript();
+</script></body></html>
\ No newline at end of file
Added: incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritestyle2.html
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritestyle2.html?rev=748271&view=auto
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritestyle2.html (added)
+++ incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritestyle2.html Thu Feb 26 18:54:04 2009
@@ -0,0 +1,11 @@
+<style>
+ .testclass {
+ background-image: url( http://www.example.org/image.jpg );
+ }
+</style>
+<div class="testclass">Background image Style</div><br/>
+<div style="background-image:url(http://www.example.org/image2.jpg);">Background image Inline
+</div><br/>
+<script type="text/javascript">
+ somescript();
+</script>
\ No newline at end of file