You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by li...@apache.org on 2010/06/11 20:34:12 UTC

svn commit: r953814 - in /shindig/trunk/java/gadgets/src: main/java/org/apache/shindig/gadgets/rewrite/old/ test/java/org/apache/shindig/gadgets/rewrite/old/ test/resources/org/apache/shindig/gadgets/rewrite/

Author: lindner
Date: Fri Jun 11 18:34:11 2010
New Revision: 953814

URL: http://svn.apache.org/viewvc?rev=953814&view=rev
Log:
SHINDIG-1085 | Patch from Henry Saputra | tylesheets with different media attribute shouldn't be merged

Added:
    shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritestylemedia-expected.html
    shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritestylemedia.html
Modified:
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriter.java
    shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriterTest.java

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriter.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriter.java?rev=953814&r1=953813&r2=953814&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriter.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriter.java Fri Jun 11 18:34:11 2010
@@ -35,6 +35,7 @@ import org.w3c.dom.Node;
 
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import com.google.common.base.Predicate;
@@ -42,6 +43,7 @@ import com.google.common.collect.Immutab
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 
@@ -53,15 +55,14 @@ import com.google.inject.Inject;
  * - Proxying referred content of images and embeds
  */
 public class HTMLContentRewriter implements GadgetRewriter, ResponseRewriter {
-  
-  private final static String JS_MIME_TYPE = "text/javascript";
 
   public final static Set<String> TAGS = ImmutableSet.of("img", "embed", "link", "script", "style");
 
-  private final static ImmutableMap<String, ImmutableSet<String>> LINKING_TAG_ATTRS = ImmutableMap.of(
-      "img", ImmutableSet.of("src"),
-      "embed", ImmutableSet.of("src")
-  );
+  private final static String JS_MIME_TYPE = "text/javascript";
+  private final static String CSS_MIME_TYPE = "text/css";
+
+  private final static ImmutableMap<String, ImmutableSet<String>> LINKING_TAG_ATTRS =
+      ImmutableMap.of("img", ImmutableSet.of("src"), "embed", ImmutableSet.of("src"));
 
   private final ContentRewriterFeature.Factory rewriterFeatureFactory;
   private final CssRequestRewriter cssRewriter;
@@ -122,15 +123,17 @@ public class HTMLContentRewriter impleme
 
     boolean mutated = false;
 
-
     // 1st step. Rewrite links in all embedded style tags. Convert @import statements into
     // links and add them to the tag list.
     // Move all style and link tags into head and concat the link tags
-    mutated = rewriteStyleTags(head, tagList, feature, gadgetUri, contentBase, container, debug, ignoreCache);
+    mutated = rewriteStyleTags(head, tagList, feature, gadgetUri, contentBase, container,
+        debug, ignoreCache);
     // Concat script links
-    mutated |= rewriteJsTags(tagList, feature, gadgetUri, contentBase, container, debug, ignoreCache);
+    mutated |= rewriteJsTags(tagList, feature, gadgetUri, contentBase, container,
+        debug, ignoreCache);
     // Rewrite links in images, embeds etc
-    mutated |= rewriteContentReferences(tagList, feature, gadgetUri, contentBase, container, debug, ignoreCache);
+    mutated |= rewriteContentReferences(tagList, feature, gadgetUri, contentBase, container,
+        debug, ignoreCache);
 
     if (mutated) {
       MutableContent.notifyEdit(content.getDocument());
@@ -142,10 +145,11 @@ public class HTMLContentRewriter impleme
   protected boolean rewriteStyleTags(Element head, List<Element> elementList,
       ContentRewriterFeature.Config feature, Uri gadgetUri, Uri contentBase, String container,
       boolean debug, boolean ignoreCache) throws RewritingException {
-    if (!feature.getIncludedTags().contains("style")) {
-      return false;
-    }
     boolean mutated = false;
+    if (!feature.getIncludedTags().contains("style") &&
+        !feature.getIncludedTags().contains("link")) {
+      return mutated;
+    }
 
     // Filter to just style tags
     Iterable<Element> styleTags = Lists.newArrayList(Iterables.filter(elementList,
@@ -171,7 +175,7 @@ public class HTMLContentRewriter impleme
         // Add extracted urls as link elements to head
         Element newLink = head.getOwnerDocument().createElement("link");
         newLink.setAttribute("rel", "stylesheet");
-        newLink.setAttribute("type", "text/css");
+        newLink.setAttribute("type", CSS_MIME_TYPE);
         newLink.setAttribute("href", extractedUrl);
         head.appendChild(newLink);
         elementList.add(newLink);
@@ -188,7 +192,13 @@ public class HTMLContentRewriter impleme
           }
         }));
 
-    concatenateTags(feature, linkTags, gadgetUri, contentBase, "text/css", "href", container, debug, ignoreCache);
+    // group link tags based on media attribute and concatenate for each media type
+    Map<String, List<Element>> mediaToElemsMap = groupTagsOnAttribute("media", linkTags);
+    for (Map.Entry<String, List<Element>> entry : mediaToElemsMap.entrySet()) {
+      mutated |= true;
+      concatenateTags(feature, entry.getValue(), gadgetUri, contentBase,
+          CSS_MIME_TYPE, "href", container, debug, ignoreCache);
+    }
 
     return mutated;
   }
@@ -226,15 +236,18 @@ public class HTMLContentRewriter impleme
         if (nextSciptTag == null ||
             !nextSciptTag.equals(getNextSiblingElement(scriptTag))) {
           // Next tag is not concatenateable
-          concatenateTags(feature, concatenateable, gadgetUri, contentBase, JS_MIME_TYPE, "src", container, debug, ignoreCache);
+          concatenateTags(feature, concatenateable, gadgetUri, contentBase, JS_MIME_TYPE, "src",
+              container, debug, ignoreCache);
           concatenateable.clear();
         }
       } else {
-        concatenateTags(feature, concatenateable, gadgetUri, contentBase, JS_MIME_TYPE, "src", container, debug, ignoreCache);
+        concatenateTags(feature, concatenateable, gadgetUri, contentBase, JS_MIME_TYPE, "src",
+            container, debug, ignoreCache);
         concatenateable.clear();
       }
     }
-    concatenateTags(feature, concatenateable, gadgetUri, contentBase, JS_MIME_TYPE, "src", container, debug, ignoreCache);
+    concatenateTags(feature, concatenateable, gadgetUri, contentBase, JS_MIME_TYPE, "src",
+        container, debug, ignoreCache);
     return mutated;
   }
 
@@ -290,13 +303,13 @@ public class HTMLContentRewriter impleme
       }
     }
 
-    List<Uri> concatented = concatLinkRewriterFactory.create(gadgetUri,
+    List<Uri> concatenated = concatLinkRewriterFactory.create(gadgetUri,
         feature, container, debug, ignoreCache).rewrite(mimeType, nodeRefList);
     
     for (int i = 0; i < tags.size(); i++) {
-      if (i < concatented.size()) {
+      if (i < concatenated.size()) {
         // Set new URLs into existing tags
-        tags.get(i).setAttribute(attr, concatented.get(i).toString());
+        tags.get(i).setAttribute(attr, concatenated.get(i).toString());
       } else {
         // Remove remainder
         tags.get(i).getParentNode().removeChild(tags.get(i));
@@ -304,7 +317,6 @@ public class HTMLContentRewriter impleme
     }
   }
 
-
   private Element getNextSiblingElement(Element elem) {
     Node n = elem;
     n = n.getNextSibling();
@@ -313,4 +325,25 @@ public class HTMLContentRewriter impleme
     }
     return (Element)n;
   }
+
+  private Map<String, List<Element>> groupTagsOnAttribute(String attribute,
+      List<Element> linkTags) {
+    Map<String, List<Element>> mediaToLinkElementsMap = Maps.newHashMap();
+    List<Element> tagsOnAttributeList;
+    for (Element tag : linkTags) {
+      // get the attribute value which will be used as key.
+      String attributeValue = tag.getAttribute(attribute);
+
+      // store the tag in the list.
+      if(!mediaToLinkElementsMap.containsKey(attributeValue)) {
+        tagsOnAttributeList = Lists.newLinkedList();
+        mediaToLinkElementsMap.put(attributeValue, tagsOnAttributeList);
+      } else {
+        tagsOnAttributeList = mediaToLinkElementsMap.get(attributeValue);
+      }
+      tagsOnAttributeList.add(tag);
+    }
+
+    return mediaToLinkElementsMap;
+  }
 }

Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriterTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriterTest.java?rev=953814&r1=953813&r2=953814&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriterTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriterTest.java Fri Jun 11 18:34:11 2010
@@ -409,4 +409,15 @@ public class HTMLContentRewriterTest ext
     rewriter.rewrite(req, fakeResponse);
     control.verify();
   }
+
+  @Test
+  public void testStyleWithDifferentMedia() throws Exception {
+    String content = IOUtils.toString(this.getClass().getClassLoader().
+        getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritestylemedia.html"));
+     String expected = IOUtils.toString(this.getClass().getClassLoader().
+        getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritestylemedia-expected.html"));
+    MutableContent mc = rewriteContent(rewriter, content, "default");
+    assertEquals(StringUtils.deleteWhitespace(mc.getContent()),
+                 StringUtils.deleteWhitespace(expected));
+  }
 }

Added: shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritestylemedia-expected.html
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritestylemedia-expected.html?rev=953814&view=auto
==============================================================================
--- shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritestylemedia-expected.html (added)
+++ shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritestylemedia-expected.html Fri Jun 11 18:34:11 2010
@@ -0,0 +1,10 @@
+<html>
+  <head>
+    <link href="http://www.test.com/dir/concat?rewriteMime=text/css&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&container=default&refresh=3600&1=http%3A%2F%2Fwww.example.org%2Flinkedstyle1.css" rel="stylesheet" type="text/css">
+    <link href="http://www.test.com/dir/concat?rewriteMime=text/css&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&container=default&refresh=3600&1=http%3A%2F%2Fwww.example.org%2Flinkedstyle2.css" media="screen" rel="stylesheet" type="text/css">
+    <link href="http://www.test.com/dir/concat?rewriteMime=text/css&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&container=default&refresh=3600&1=http%3A%2F%2Fwww.example.org%2Flinkedstyle3.css" media="print" rel="stylesheet" type="text/css">
+  </head>
+  <body>
+    <div>somecontent</div>
+  </body>
+</html>

Added: shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritestylemedia.html
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritestylemedia.html?rev=953814&view=auto
==============================================================================
--- shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritestylemedia.html (added)
+++ shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/rewritestylemedia.html Fri Jun 11 18:34:11 2010
@@ -0,0 +1,10 @@
+<html>
+  <head>
+    <link rel="stylesheet" type="text/css" href="http://www.example.org/linkedstyle1.css">
+    <link media="screen" rel="stylesheet" type="text/css" href="http://www.example.org/linkedstyle2.css">
+    <link media="print" rel="stylesheet" type="text/css" href="http://www.example.org/linkedstyle3.css">
+  </head>
+  <body>
+    <div>somecontent</div>
+  </body>
+</html>