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/09 22:26:10 UTC

svn commit: r742746 - /incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssParser.java

Author: lryan
Date: Mon Feb  9 21:26:09 2009
New Revision: 742746

URL: http://svn.apache.org/viewvc?rev=742746&view=rev
Log:
Workaround issue cloning CSS dom with current Caja parser

Modified:
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssParser.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=742746&r1=742745&r2=742746&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 Mon Feb  9 21:26:09 2009
@@ -43,10 +43,14 @@
 import java.io.Writer;
 import java.net.URI;
 import java.util.Collections;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 /** A CSS DOM parser using Caja. */
 public class CajaCssParser {
 
+  private static final Logger log = Logger.getLogger(CajaCssParser.class.getName());
+
   /**
    * Dummy URI that is never read from. Needed to construct Caja parser
    */
@@ -77,23 +81,7 @@
     }
     if (parsedCss == null) {
       try {
-        InputSource inputSource = new InputSource(FAKE_SOURCE);
-        CharProducer producer = CharProducer.Factory.create(new StringReader(content),
-            inputSource);
-        TokenStream<CssTokenType> lexer = new CssLexer(producer);
-        TokenQueue<CssTokenType> queue = new TokenQueue<CssTokenType>(lexer, inputSource,
-            new Criterion<Token<CssTokenType>>() {
-              public boolean accept(Token<CssTokenType> t) {
-                return CssTokenType.SPACE != t.type
-                    && CssTokenType.COMMENT != t.type;
-              }
-            });
-        if (queue.isEmpty()) {
-          // Return empty stylesheet
-          return new CssTree.StyleSheet(null, Collections.<CssTree.CssStatement>emptyList());
-        }
-        CssParser parser = new CssParser(queue);
-        parsedCss =  parser.parseStyleSheet();
+        parsedCss = parseImpl(content);
         if (shouldCache) {
           parsedCssCache.addElement(key, parsedCss);
         }
@@ -102,11 +90,42 @@
       }
     }
     if (shouldCache) {
-      return (CssTree.StyleSheet)parsedCss.clone();
+      try {
+        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);
+        try {
+          return parseImpl(content);
+        } catch (ParseException pe) {
+          throw new GadgetException(GadgetException.Code.CSS_PARSE_ERROR, pe); 
+        }
+      }
     }
     return parsedCss;
   }
 
+  private CssTree.StyleSheet parseImpl(String css) throws ParseException {
+    InputSource inputSource = new InputSource(FAKE_SOURCE);
+    CharProducer producer = CharProducer.Factory.create(new StringReader(css),
+        inputSource);
+    TokenStream<CssTokenType> lexer = new CssLexer(producer);
+    TokenQueue<CssTokenType> queue = new TokenQueue<CssTokenType>(lexer, inputSource,
+        new Criterion<Token<CssTokenType>>() {
+          public boolean accept(Token<CssTokenType> t) {
+            return CssTokenType.SPACE != t.type
+                && CssTokenType.COMMENT != t.type;
+          }
+        });
+    if (queue.isEmpty()) {
+      // Return empty stylesheet
+      return new CssTree.StyleSheet(null, Collections.<CssTree.CssStatement>emptyList());
+    }
+    CssParser parser = new CssParser(queue);
+    return parser.parseStyleSheet();
+  }
+
   /** Serialize a stylesheet to a String */
   public String serialize(CssTree.StyleSheet styleSheet) {
     StringWriter writer = new StringWriter();