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>