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