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());
+ }
}