Author: lryan
Date: Wed Feb 18 23:20:35 2009
New Revision: 745690

URL: http://svn.apache.org/viewvc?rev=745690&view=rev
Log:
Catch parse failures from Caja CSS parser and write original content through.
Reduce verbosity of logging when cloning Caja CSS DOM fails

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/rewrite/CSSContentRewriterTest.java

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=745690&r1=745689&r2=745690&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
 Wed Feb 18 23:20:35 2009
@@ -94,8 +94,8 @@
         return (CssTree.StyleSheet)parsedCss.clone();
       } catch (RuntimeException re) {
         // TODO - FIXME ASAP!
-        log.log(Level.INFO, "Workaround for Caja bug 
http://code.google.com/p/google-caja/issues/detail?id=985&start=200";,
-            re);
+        log.log(Level.INFO,
+            "Workaround for Caja bug 
http://code.google.com/p/google-caja/issues/detail?id=985&start=200\n"; + 
re.getMessage());
         try {
           return parseImpl(content);
         } catch (ParseException pe) {

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=745690&r1=745689&r2=745690&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
 Wed Feb 18 23:20:35 2009
@@ -26,6 +26,7 @@
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.parse.caja.CajaCssParser;
 
+import com.google.caja.lexer.ParseException;
 import com.google.caja.parser.AbstractParseTreeNode;
 import com.google.caja.parser.AncestorChain;
 import com.google.caja.parser.Visitor;
@@ -41,13 +42,18 @@
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.io.Writer;
+import java.util.Collections;
 import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 /**
  * Rewrite links to referenced content in a stylesheet
  */
 public class CSSContentRewriter implements ContentRewriter {
 
+  private static final Logger logger = 
Logger.getLogger(CSSContentRewriter.class.getName());
+
   private final ContentRewriterFeatureFactory rewriterFeatureFactory;
   private final String proxyBaseNoGadget;
   private final CajaCssParser cssParser;
@@ -94,15 +100,25 @@
   public List<String> rewrite(Reader content, Uri source,
       LinkRewriter rewriter, Writer writer, boolean extractImports) {
     try {
-      CssTree.StyleSheet stylesheet = 
cssParser.parseDom(IOUtils.toString(content));
-      List<String> stringList = rewrite(stylesheet, source, rewriter, 
extractImports);
-      // Serialize the stylesheet
-      cssParser.serialize(stylesheet, writer);
-      return stringList;
+      String original = IOUtils.toString(content);
+      try {
+        CssTree.StyleSheet stylesheet = cssParser.parseDom(original);
+        List<String> stringList = rewrite(stylesheet, source, rewriter, 
extractImports);
+        // Serialize the stylesheet
+        cssParser.serialize(stylesheet, writer);
+        return stringList;
+      } catch (GadgetException ge) {
+        if (ge.getCause() instanceof ParseException) {
+          logger.log(Level.WARNING,
+              "Caja CSS parse failure: " + ge.getCause().getMessage() + " for 
" + source);
+          writer.write(original);
+          return Collections.emptyList();
+        } else {
+          throw new RuntimeException(ge);
+        }
+      }
     } catch (IOException ioe) {
       throw new RuntimeException(ioe);
-    } catch (GadgetException ge) {
-      throw new RuntimeException(ge);
     }
   }
 
@@ -130,7 +146,13 @@
       }
       return imports;
     } catch (GadgetException ge) {
-      throw new RuntimeException(ge);
+      if (ge.getCause() instanceof ParseException) {
+        logger.log(Level.WARNING,
+              "Caja CSS parse failure: " + ge.getCause().getMessage() + " for 
" + source);
+        return Collections.emptyList();
+      } else {
+        throw new RuntimeException(ge);
+      }
     }
   }
 

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=745690&r1=745689&r2=745690&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
 Wed Feb 18 23:20:35 2009
@@ -136,4 +136,49 @@
     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());
+  }
 }


Reply via email to