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/24 02:03:09 UTC

svn commit: r747244 - in /incubator/shindig/trunk/java/gadgets/src: main/java/org/apache/shindig/gadgets/parse/caja/ main/java/org/apache/shindig/gadgets/rewrite/ test/java/org/apache/shindig/gadgets/parse/caja/ test/java/org/apache/shindig/gadgets/rew...

Author: lryan
Date: Tue Feb 24 01:03:09 2009
New Revision: 747244

URL: http://svn.apache.org/viewvc?rev=747244&view=rev
Log:
Converting CSS rewriting back to a Caja lexer based solution until the Caja DOM parser becomes more lenient. For examples
of problem cases see CajaCssParserTest

Added:
    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
Modified:
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssParser.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CSSContentRewriter.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/CajaCssParserTest.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

Added: 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=747244&view=auto
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssLexerParser.java (added)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssLexerParser.java Tue Feb 24 01:03:09 2009
@@ -0,0 +1,205 @@
+/*
+ * 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.shindig.gadgets.parse.caja;
+
+import org.apache.shindig.common.cache.Cache;
+import org.apache.shindig.common.cache.CacheProvider;
+import org.apache.shindig.common.util.HashUtil;
+import org.apache.shindig.gadgets.GadgetException;
+
+import com.google.caja.lexer.CharProducer;
+import com.google.caja.lexer.CssLexer;
+import com.google.caja.lexer.CssTokenType;
+import com.google.caja.lexer.InputSource;
+import com.google.caja.lexer.ParseException;
+import com.google.caja.lexer.Token;
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.net.URI;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * A parser that records the stream of CSS lexial tokens from the Caja lexer and creates a
+ * pseudo-DOM from that stream.
+ *
+ * TODO: Remove once Caja CSS DOM parser issues are resolved.
+ */
+public class CajaCssLexerParser {
+
+  private static final Pattern urlMatcher =
+      Pattern.compile("(url\\s*\\(\\s*['\"]?)([^\\)'\"]*)(['\"]?\\s*\\))",
+          Pattern.CASE_INSENSITIVE);
+
+  private static final URI DUMMY_SOURCE = URI.create("http://www.example.org");
+
+  private static final String PARSED_CSS = "parsedCss";
+
+  private Cache<String, List<Object>> parsedCssCache;
+
+  @Inject
+  public void setCacheProvider(CacheProvider cacheProvider) {
+    parsedCssCache = cacheProvider.createCache(PARSED_CSS);
+  }
+
+  public List<Object> parse(String content) throws GadgetException {
+    List<Object> parsedCss = null;
+    boolean shouldCache = shouldCache();
+    String key = null;
+    if (shouldCache) {
+      // TODO - Consider using the source if its under a certain size
+      key = HashUtil.rawChecksum(content.getBytes());
+      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);
+      }
+    }
+
+    if (shouldCache) {
+      List<Object> cloned = Lists.newArrayListWithExpectedSize(parsedCss.size());
+      for (Object o : parsedCss) {
+        if (o instanceof ImportDecl) {
+          cloned.add(new ImportDecl(((ImportDecl) o).getUri()));
+        } else if (o instanceof UriDecl) {
+          cloned.add(new ImportDecl(((UriDecl) o).getUri()));
+        } else {
+          cloned.add(o);
+        }
+      }
+      return cloned;
+    }
+    return parsedCss;
+  }
+
+  /** Serialize a stylesheet to a String */
+  public String serialize(List<Object> styleSheet) {
+    StringWriter writer = new StringWriter();
+    serialize(styleSheet, writer);
+    return writer.toString();
+  }
+
+  /** Serialize a stylesheet to a Writer. */
+  public void serialize(List<Object> styleSheet, Appendable writer) {
+    try {
+      for (Object o : styleSheet) {
+        writer.append(o.toString());
+      }
+    } catch (IOException ioe) {
+      throw new RuntimeException(ioe);
+    }
+  }
+
+
+  private boolean shouldCache() {
+    return parsedCssCache != null && parsedCssCache.getCapacity() != 0;
+  }
+
+  public static class ImportDecl {
+
+    private String uri;
+
+    public ImportDecl(String uri) {
+      this.uri = uri;
+    }
+
+    public String getUri() {
+      return uri;
+    }
+
+    public void setUri(String uri) {
+      this.uri = uri;
+    }
+
+    public String toString() {
+      return "@import url(\"" + uri + "\");\n";
+    }
+  }
+
+  public static class UriDecl {
+
+    private String uri;
+
+    public UriDecl(String uri) {
+      this.uri = uri;
+    }
+
+    public String getUri() {
+      return uri;
+    }
+
+    public void setUri(String uri) {
+      this.uri = uri;
+    }
+
+    public String toString() {
+      return "url(\"" + uri + "\");\n";
+    }
+  }
+}

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssParser.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssParser.java?rev=747244&r1=747243&r2=747244&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssParser.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssParser.java Tue Feb 24 01:03:09 2009
@@ -56,7 +56,8 @@
    */
   private static final URI FAKE_SOURCE = URI.create("http://a.dummy.url");
 
-  private static final String PARSED_CSS = "parsedCss";
+  // Switch to "parsedCss" once CajaCssLexerParser is removed. See ehCacheConfig
+  private static final String PARSED_CSS = "parsedCssDom";
 
   private Cache<String, CssTree.StyleSheet> parsedCssCache;
 

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CSSContentRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CSSContentRewriter.java?rev=747244&r1=747243&r2=747244&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CSSContentRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CSSContentRewriter.java Tue Feb 24 01:03:09 2009
@@ -24,13 +24,9 @@
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
-import org.apache.shindig.gadgets.parse.caja.CajaCssParser;
+import org.apache.shindig.gadgets.parse.caja.CajaCssLexerParser;
 
 import com.google.caja.lexer.ParseException;
-import com.google.caja.parser.AbstractParseTreeNode;
-import com.google.caja.parser.AncestorChain;
-import com.google.caja.parser.Visitor;
-import com.google.caja.parser.css.CssTree;
 import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
@@ -56,12 +52,12 @@
 
   private final ContentRewriterFeatureFactory rewriterFeatureFactory;
   private final String proxyBaseNoGadget;
-  private final CajaCssParser cssParser;
+  private final CajaCssLexerParser cssParser;
 
   @Inject
   public CSSContentRewriter(ContentRewriterFeatureFactory rewriterFeatureFactory,
       @Named("shindig.content-rewrite.proxy-url")String proxyBaseNoGadget,
-      CajaCssParser cssParser) {
+      CajaCssLexerParser cssParser) {
     this.rewriterFeatureFactory = rewriterFeatureFactory;
     this.proxyBaseNoGadget = proxyBaseNoGadget;
     this.cssParser = cssParser;
@@ -102,7 +98,7 @@
     try {
       String original = IOUtils.toString(content);
       try {
-        CssTree.StyleSheet stylesheet = cssParser.parseDom(original);
+        List<Object> stylesheet = cssParser.parse(original);
         List<String> stringList = rewrite(stylesheet, source, rewriter, extractImports);
         // Serialize the stylesheet
         cssParser.serialize(stylesheet, writer);
@@ -134,11 +130,11 @@
   public List<String> rewrite(Element styleNode, Uri source,
       LinkRewriter rewriter, boolean extractImports) {
     try {
-      CssTree.StyleSheet stylesheet = cssParser.parseDom(styleNode.getTextContent());
+      List<Object> stylesheet = cssParser.parse(styleNode.getTextContent());
       List<String> imports = rewrite(stylesheet, source, rewriter, extractImports);
       // Write the rewritten CSS back into the element
       String content = cssParser.serialize(stylesheet);
-      if (StringUtils.isEmpty(content)) {
+      if (StringUtils.isEmpty(content) || StringUtils.isWhitespace(content)) {
         // Remove the owning node
         styleNode.getParentNode().removeChild(styleNode);
       } else {
@@ -165,29 +161,26 @@
    *            referenced URIs.
    * @return Empty list of extracted import URIs.
    */
-  public static List<String> rewrite(CssTree.StyleSheet styleSheet, final Uri source,
+  public static List<String> rewrite(List<Object> styleSheet, final Uri source,
       final LinkRewriter rewriter, final boolean extractImports) {
-    final List<String> imports = Lists.newArrayList();
+    final List<String> imports = Lists.newLinkedList();
 
-    styleSheet.acceptPostOrder(new Visitor() {
-      public boolean visit(AncestorChain<?> chain) {
-        if (extractImports && chain.node instanceof CssTree.Import) {
-          // Extract the import statment, add its URI to the returned list
-          // and remove it from the DOM.
-          CssTree.Import importNode = (CssTree.Import) chain.node;
-          imports.add(importNode.getUri().getValue());
-          ((AbstractParseTreeNode) chain.getParentNode()).removeChild(chain.node);
-        } else if (chain.node instanceof CssTree.UriLiteral) {
-          // If were not extracting imports then rewrite its link
-          if (!(chain.getParentNode() instanceof CssTree.Import && extractImports)) {
-            String rewritten = rewriter
-                .rewrite(((CssTree.UriLiteral) chain.node).getValue(), source);
-            ((CssTree.UriLiteral) chain.node).setValue(rewritten);
-          }
+    for (int i = styleSheet.size() - 1; i >= 0; i--) {
+      if (styleSheet.get(i) instanceof CajaCssLexerParser.ImportDecl) {
+        if (extractImports) {
+          imports.add(0, ((CajaCssLexerParser.ImportDecl)styleSheet.get(i)).getUri());
+          styleSheet.remove(i);
+        } else {
+          CajaCssLexerParser.ImportDecl importDecl = (CajaCssLexerParser.ImportDecl) styleSheet
+              .get(i);
+          importDecl.setUri(rewriter.rewrite(importDecl.getUri(), source));
         }
-        return true;
-      }}, null);
-
+      } else if (styleSheet.get(i) instanceof CajaCssLexerParser.UriDecl) {
+        CajaCssLexerParser.UriDecl uriDecl = (CajaCssLexerParser.UriDecl) styleSheet
+              .get(i);
+          uriDecl.setUri(rewriter.rewrite(uriDecl.getUri(), source));
+      }
+    }
     return imports;
   }
 

Added: 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=747244&view=auto
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/CajaCssLexerParserTest.java (added)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/CajaCssLexerParserTest.java Tue Feb 24 01:03:09 2009
@@ -0,0 +1,52 @@
+/*
+ * 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.shindig.gadgets.parse.caja;
+
+import org.apache.shindig.common.cache.LruCacheProvider;
+
+import junit.framework.TestCase;
+
+import java.util.List;
+
+/**
+ * Basic test of CSS lexer
+ */
+public class CajaCssLexerParserTest extends TestCase {
+
+  private CajaCssLexerParser cajaCssParser;
+
+  @Override
+  protected void setUp() throws Exception {
+    super.setUp();
+    cajaCssParser = new CajaCssLexerParser();
+  }
+
+  public void testBasicCssParse() throws Exception {
+    String css = ".xyz { font : bold; } A { color : #7f7f7f }";
+    List<Object> styleSheet = cajaCssParser.parse(css);
+    assertEquals(cajaCssParser.serialize(styleSheet), css); 
+  }
+
+  public void testClone() throws Exception {
+    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);
+    assertFalse(styleSheet.equals(styleSheet2));
+  }
+}
\ No newline at end of file

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/CajaCssParserTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/CajaCssParserTest.java?rev=747244&r1=747243&r2=747244&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/CajaCssParserTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/CajaCssParserTest.java Tue Feb 24 01:03:09 2009
@@ -17,6 +17,8 @@
  */
 package org.apache.shindig.gadgets.parse.caja;
 
+import org.apache.shindig.gadgets.GadgetException;
+
 import com.google.caja.parser.css.CssTree;
 
 import junit.framework.TestCase;
@@ -44,4 +46,64 @@
     assertEquals(2, selectorList.size());
     assertSame(CssTree.SimpleSelector.class, selectorList.get(0).getClass());
   }
+
+  /**
+   * These tests will fail when Caja successfully parses funky CSS.
+   * They can be converted into a test of success once that happens
+   */
+  public void testCajaParseFailureColonInRValue() {
+    String original = " A {\n"
+        + " -moz-opacity: 0.80;\n"
+        + " filter: alpha(opacity=40);\n"
+        + " filter: progid:DXImageTransform.Microsoft.Alpha(opacity=80);\n"
+        + "}";
+    try {
+      cajaCssParser.parseDom(original);
+      fail();
+    } catch (GadgetException ge) {
+      // Expected
+    }
+  }
+
+  public void testCajaParseFailureNoLValue() {
+    String original = "body, input, td {\n"
+        + "  Arial, sans-serif;\n"
+        + "}";
+    try {
+      cajaCssParser.parseDom(original);
+      fail();
+    } catch (GadgetException ge) {
+      // Expected
+    }
+  }
+
+  public void testCajaParseFailureCommentInContent() {
+    String original = "body { font : bold; } \n//A comment\n A { font : bold; }";
+    try {
+      cajaCssParser.parseDom(original);
+      fail();
+    } catch (GadgetException ge) {
+      // Expected
+    }
+  }
+
+  public void testCajaParseFailureDotInIdent() {
+    String original = "li{list-style:none;.padding-bottom:4px;}";
+    try {
+      cajaCssParser.parseDom(original);
+      fail();
+    } catch (GadgetException ge) {
+      // Expected
+    }
+  }
+
+  public void testCajaParseFailureDotInFunction() {
+    String original = ".iepngfix {behavior: expression(IEPNGFIX.fix(this)); }";
+    try {
+      cajaCssParser.parseDom(original);
+      fail();
+    } catch (GadgetException ge) {
+      // Expected
+    }
+  }
 }

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=747244&r1=747243&r2=747244&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 Tue Feb 24 01:03:09 2009
@@ -22,7 +22,7 @@
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.http.HttpResponseBuilder;
-import org.apache.shindig.gadgets.parse.caja.CajaCssParser;
+import org.apache.shindig.gadgets.parse.caja.CajaCssLexerParser;
 
 import com.google.common.collect.Lists;
 
@@ -46,7 +46,7 @@
         rewriterFeatureFactory.get(createSpecWithRewrite(".*", ".*exclude.*", "HTTP",
             HTMLContentRewriter.TAGS));
     ContentRewriterFeatureFactory factory = mockContentRewriterFeatureFactory(overrideFeature);
-    rewriter = new CSSContentRewriter(factory, DEFAULT_PROXY_BASE, new CajaCssParser());
+    rewriter = new CSSContentRewriter(factory, DEFAULT_PROXY_BASE, new CajaCssLexerParser());
     dummyUri = Uri.parse("http://www.w3c.org");
   }
 
@@ -96,20 +96,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 {\n" +
-            "  list-style-image: url('http\\3A//www.test.com/dir/proxy?url\\3Dhttp%3A%2F%2Fa.b.com%2Fbullet.gif\\26 fp\\3D 1150739864');\n" +
-            "  list-style-position: outside;\n" +
-            "  margin: 5px;\n" +
-            "  padding: 0\n" +
-            "}\n" +
-            ".someid {\n" +
-            "  background-image: url('http\\3A//www.test.com/dir/proxy?url\\3Dhttp%3A%2F%2Fa.b.com%2Fbigimg.png\\26 fp\\3D 1150739864');\n" +
-            "  float: right;\n" +
-            "  width: 165px;\n" +
-            "  height: 23px;\n" +
-            "  margin-top: 4px;\n" +
-            "  margin-left: 5px\n" +
-            "}";
+        "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);
   }
 
@@ -120,15 +110,9 @@
         " div { color: blue; }\n" +
         " p { color: black; }\n" +
         " span { color: red; }";
-    String expected = "div {\n"
-        + "  color: blue;\n"
-        + "}\n"
-        + "p {\n"
-        + "  color: black;\n"
-        + "}\n"
-        + "span {\n"
-        + "  color: red;\n"
-        + "}";
+    String expected = " div { color: blue; }\n" +
+        " p { color: black; }\n" +
+        " span { color: red; }";
     StringWriter sw = new StringWriter();
     List<String> stringList = rewriter
         .rewrite(new StringReader(original), dummyUri, defaultLinkRewriter, sw, true);
@@ -136,49 +120,4 @@
     assertEquals(stringList, Lists.newArrayList("www.example.org/some.css",
         "www.example.org/someother.css", "www.example.org/another.css"));
   }
-
-  /**
-   * These tests will fail when Caja successfully parses funky CSS.
-   * They can be converted into a test of success once that happens
-   */
-  public void testCajaParseFailureColonInRValue() {
-    String original = " A {\n"
-        + " -moz-opacity: 0.80;\n"
-        + " filter: alpha(opacity=40);\n"
-        + " filter: progid:DXImageTransform.Microsoft.Alpha(opacity=80);\n"
-        + "}";
-    StringWriter sw = new StringWriter();
-    rewriter.rewrite(new StringReader(original), dummyUri, defaultLinkRewriter, sw, true);
-    assertEquals(original, sw.toString());
-  }
-
-  public void testCajaParseFailureNoLValue() {
-    String original = "body, input, td {\n"
-        + "  Arial, sans-serif;\n"
-        + "}";
-    StringWriter sw = new StringWriter();
-    rewriter.rewrite(new StringReader(original), dummyUri, defaultLinkRewriter, sw, true);
-    assertEquals(original, sw.toString());
-  }
-
-  public void testCajaParseFailureCommentInContent() {
-    String original = "body { font : bold; } \n//A comment\n A { font : bold; }"; 
-    StringWriter sw = new StringWriter();
-    rewriter.rewrite(new StringReader(original), dummyUri, defaultLinkRewriter, sw, true);
-    assertEquals(original, sw.toString());
-  }
-
-  public void testCajaParseFailureDotInIdent() {
-    String original = "li{list-style:none;.padding-bottom:4px;}";
-    StringWriter sw = new StringWriter();
-    rewriter.rewrite(new StringReader(original), dummyUri, defaultLinkRewriter, sw, true);
-    assertEquals(original, sw.toString());
-  }
-
-  public void testCajaParseFailureDotInFunction() {
-    String original = ".iepngfix {behavior: expression(IEPNGFIX.fix(this)); }";
-    StringWriter sw = new StringWriter();
-    rewriter.rewrite(new StringReader(original), dummyUri, defaultLinkRewriter, sw, true);
-    assertEquals(original, sw.toString());
-  }
 }

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=747244&r1=747243&r2=747244&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 Tue Feb 24 01:03:09 2009
@@ -19,7 +19,7 @@
 
 import org.apache.commons.io.IOUtils;
 import org.apache.shindig.gadgets.http.HttpRequest;
-import org.apache.shindig.gadgets.parse.caja.CajaCssParser;
+import org.apache.shindig.gadgets.parse.caja.CajaCssLexerParser;
 
 import org.easymock.EasyMock;
 import org.w3c.dom.Document;
@@ -38,7 +38,7 @@
             HTMLContentRewriter.TAGS));
     ContentRewriterFeatureFactory factory = mockContentRewriterFeatureFactory(overrideFeature);
     rewriter = new HTMLContentRewriter(factory, DEFAULT_PROXY_BASE, DEFAULT_CONCAT_BASE,
-        new CSSContentRewriter(factory, DEFAULT_PROXY_BASE, new CajaCssParser()));
+        new CSSContentRewriter(factory, DEFAULT_PROXY_BASE, new CajaCssLexerParser()));
   }
 
   public void testScriptsBasic() throws Exception {
@@ -154,7 +154,7 @@
     assertEquals(1, wrapper.getNodeList("//style").getLength());
 
     // All @imports are stripped
-    assertEquals("div {\n  color: black;\n}", wrapper.getValue("//style[1]"));
+    assertEquals("div { color : black; }", wrapper.getValue("//style[1]").trim());
   }
 
   public void testNoRewriteUnknownMimeType() {

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=747244&r1=747243&r2=747244&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 Tue Feb 24 01:03:09 2009
@@ -1,6 +1,11 @@
-@import url('http\3A//www.test.com/dir/proxy?url\3Dhttp%3A%2F%2Fwww.example.org%2Fother1.css\26gadget\3Dhttp%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml\26 fp\3D 1150739864');
-@import url('http\3A//www.test.com/dir/proxy?url\3Dhttp%3A%2F%2Fwww.example.org%2Fpath%2Frelative%2Fother2.css\26gadget\3Dhttp%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml\26 fp\3D 1150739864');
-@import url('http\3A//www.example.org/hostrelative/excluded/other1.css');
+
+/* 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");
 DiV {
   font: arial;
-}
\ No newline at end of file
+}
+
+/* A comment? */
\ No newline at end of file