You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by ch...@apache.org on 2010/10/04 20:04:56 UTC

svn commit: r1004342 - in /shindig/trunk: java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/CajaContentRewriterTest.java pom.xml

Author: chirag
Date: Mon Oct  4 18:04:56 2010
New Revision: 1004342

URL: http://svn.apache.org/viewvc?rev=1004342&view=rev
Log:
SHINDIG-1290 | Upgrade to caja r4291 and add unit tests for CajaContentRewriter. 
Code Review: http://codereview.appspot.com/2353041/

Added:
    shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/CajaContentRewriterTest.java
Modified:
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java
    shindig/trunk/pom.xml

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java?rev=1004342&r1=1004341&r2=1004342&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java Mon Oct  4 18:04:56 2010
@@ -191,12 +191,14 @@ public class CajaContentRewriter impleme
         // Content is only used to produce useful snippets with error messages
         createContainerFor(doc,
             formatErrors(doc, is, docContent, mq, true /* visible */));
+        mc.documentChanged();
         logException(e, mq);
         safe = true;
       } finally {
         if (!safe) {
           // Fail safe
           mc.setContent("");
+          mc.documentChanged();
         }
       }
     }

Added: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/CajaContentRewriterTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/CajaContentRewriterTest.java?rev=1004342&view=auto
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/CajaContentRewriterTest.java (added)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/CajaContentRewriterTest.java Mon Oct  4 18:04:56 2010
@@ -0,0 +1,173 @@
+/*
+ * 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.servlet;
+
+import com.google.caja.plugin.PluginCompiler;
+import com.google.caja.plugin.PluginMeta;
+import com.google.caja.reporting.BuildInfo;
+import com.google.caja.reporting.MessageQueue;
+import com.google.inject.internal.ImmutableList;
+import org.apache.shindig.common.cache.CacheProvider;
+import org.apache.shindig.common.cache.LruCacheProvider;
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.gadgets.Gadget;
+import org.apache.shindig.gadgets.GadgetContext;
+import org.apache.shindig.gadgets.GadgetException;
+import org.apache.shindig.gadgets.http.RequestPipeline;
+import org.apache.shindig.gadgets.parse.DefaultHtmlSerializer;
+import org.apache.shindig.gadgets.parse.GadgetHtmlParser;
+import org.apache.shindig.gadgets.parse.ParseModule;
+import org.apache.shindig.gadgets.parse.caja.CajaHtmlParser;
+import org.apache.shindig.gadgets.parse.nekohtml.NekoSimplifiedHtmlParser;
+import org.apache.shindig.gadgets.rewrite.MutableContent;
+import org.apache.shindig.gadgets.rewrite.RewriterTestBase;
+import org.easymock.EasyMock;
+import org.junit.Before;
+import org.junit.Test;
+import org.w3c.dom.DOMImplementation;
+
+import java.util.List;
+
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertTrue;
+
+public class CajaContentRewriterTest extends RewriterTestBase {
+  private List<GadgetHtmlParser> parsers;
+  private CajaContentRewriter rewriter;
+
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+
+    DOMImplementation dom = new ParseModule.DOMImplementationProvider().get();
+    GadgetHtmlParser neko =  new NekoSimplifiedHtmlParser(dom);
+    GadgetHtmlParser caja =  new CajaHtmlParser(dom);
+
+    // FIXME: Caja has trouble with the NekoSimplifiedHtmlParser
+    // Disabling neko for now
+    parsers = ImmutableList.of(/*neko, */caja);
+
+    CacheProvider lru = new LruCacheProvider(3);
+    RequestPipeline pipeline = EasyMock.createNiceMock(RequestPipeline.class);
+    DefaultHtmlSerializer defaultSerializer = new DefaultHtmlSerializer();
+    rewriter = new CajaContentRewriter(lru, pipeline, defaultSerializer) {
+      @Override
+      protected PluginCompiler makePluginCompiler(PluginMeta m, MessageQueue q) {
+        BuildInfo bi = EasyMock.createNiceMock(BuildInfo.class);
+        expect(bi.getBuildInfo()).andReturn("bi").anyTimes();
+        expect(bi.getBuildTimestamp()).andReturn("0").anyTimes();
+        expect(bi.getBuildVersion()).andReturn("0").anyTimes();
+        expect(bi.getCurrentTime()).andReturn(0L).anyTimes();
+        replay(bi);
+        return new PluginCompiler(bi, m, q);
+      }
+    };
+  }
+
+  @Test
+  public void testErrorDuringRewrite() throws Exception {
+    String markup = "<script>var x={}; with(x) {};</script>";
+    String expected = "<html><head></head><body><ul class=\"gadgets-messages\">";
+
+    List<String> messages = ImmutableList.of(
+            "folding element html into parent",
+            "folding element head into parent",
+            "folding element body into parent",
+            "&#34;with&#34; blocks are not allowed");
+    testMarkup(markup, expected, messages);
+  }
+
+  @Test
+  public void testCssExpression() throws Exception {
+    String markup = "<div style='top:expression(alert(0), 0)'>test</div>";
+    String expected = "<html><head></head><body>"
+        + "<div classes=\"g___\" id=\"cajoled-output\" style=\"position: relative;\">"
+        + "<div style=\"\">test</div>"
+        + "<script type=\"text/javascript\">caja___.enable()</script>"
+        + "<script type=\"text/javascript\">{___.loadModule({'instantiate':function(___,IMPORTS___)"
+        + "{return},'cajolerName':'com.google.caja','cajolerVersion':'0','cajoledDate':0})}"
+        + "</script>";
+
+    List<String> messages = ImmutableList.of(
+            "folding element html into parent",
+            "folding element head into parent",
+            "folding element body into parent",
+            "css property top has bad value: ==&gt;expression(alert(0), 0)");
+    testMarkup(markup, expected, messages);
+  }
+  
+  @Test
+  public void testRewrite() throws Exception {
+    String markup = "<script>var a=0;</script>";
+    String expected = "<html><head></head><body>"
+        + "<div classes=\"g___\" id=\"cajoled-output\" style=\"position: relative;\">"
+        + "<script type=\"text/javascript\">caja___.enable()</script>"
+        + "<script type=\"text/javascript\">{___.loadModule({'instantiate':function(___,IMPORTS___){"
+        + "return ___.prepareModule({'instantiate':function(___,IMPORTS___){var\n$v=___.readImport("
+        + "IMPORTS___,'$v',{'getOuters':{'()':{}},'initOuter':{'()':{}},'so':{'()':{}},'ro':{'()':{"
+        + "}}});var\nmoduleResult___,$dis;moduleResult___=___.NO_RESULT;$dis=$v.getOuters();"
+        + "$v.initOuter('onerror');try{{moduleResult___=$v.so('a',0)}}catch(ex___){"
+        + "___.getNewModuleHandler().handleUncaughtException(ex___,$v.ro('onerror'),'unknown','1')}"
+        + "return moduleResult___}";
+
+    List<String> messages = ImmutableList.of(
+            "folding element html into parent",
+            "folding element head into parent",
+            "folding element body into parent");
+    testMarkup(markup, expected, messages);
+  }
+
+  private void testMarkup(String markup, String expected) throws GadgetException{
+    testMarkup(markup, expected, null);
+  }
+
+  private void testMarkup(String markup, String expected, List<String> msgs) throws GadgetException{
+    Gadget gadget = makeGadget();
+    for (GadgetHtmlParser parser : parsers) {
+      MutableContent mc = new MutableContent(parser, markup);
+      rewriter.rewrite(gadget, mc);
+
+      String actual = mc.getContent();
+      assertTrue(actual.contains(expected));
+
+      if (msgs != null) {
+        for (String msg : msgs) {
+          System.out.println("Msg:" + msg);
+          assertTrue(actual.contains(msg));
+        }
+      }
+    }
+  }
+
+  private Gadget makeGadget() throws GadgetException {
+    Gadget gadget = EasyMock.createNiceMock(Gadget.class);
+    GadgetContext context = EasyMock.createNiceMock(GadgetContext.class);
+
+    expect(context.getUrl()).andReturn(Uri.parse("http://example.com/gadget.xml")).anyTimes();
+    expect(context.getContainer()).andReturn("cajaContainer").anyTimes();
+    expect(context.getDebug()).andReturn(false).anyTimes();
+
+    expect(gadget.getContext()).andReturn(context).anyTimes();
+    expect(gadget.getAllFeatures()).andReturn(ImmutableList.of("caja")).anyTimes();
+
+    replay(context, gadget);
+    return gadget;
+  }
+}

Modified: shindig/trunk/pom.xml
URL: http://svn.apache.org/viewvc/shindig/trunk/pom.xml?rev=1004342&r1=1004341&r2=1004342&view=diff
==============================================================================
--- shindig/trunk/pom.xml (original)
+++ shindig/trunk/pom.xml Mon Oct  4 18:04:56 2010
@@ -1490,7 +1490,7 @@
      <dependency>
        <groupId>caja</groupId>
        <artifactId>caja</artifactId>
-       <version>r4280</version>
+       <version>r4291</version>
        <scope>compile</scope>
        <exclusions>
          <!-- force use of xml-apis until caja fixes their pom -->