Updated Branches: refs/heads/master 7ca927c17 -> f97fb9c8b
WICKET-4348 Add a method to IHeaderResponse to create IE conditional commented link to JavaScript resource Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/f97fb9c8 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/f97fb9c8 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/f97fb9c8 Branch: refs/heads/master Commit: f97fb9c8b39b7966349e4fc502fded399c80a3b7 Parents: b6db499 Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Mon Jan 30 16:02:55 2012 +0200 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Mon Jan 30 16:02:55 2012 +0200 ---------------------------------------------------------------------- .../wicket/markup/head/CssContentHeaderItem.java | 17 ++- .../apache/wicket/markup/head/CssHeaderItem.java | 45 ++++++- .../wicket/markup/head/CssReferenceHeaderItem.java | 13 +-- .../markup/head/CssUrlReferenceHeaderItem.java | 11 +-- .../markup/head/JavaScriptContentHeaderItem.java | 18 +++- .../wicket/markup/head/JavaScriptHeaderItem.java | 107 ++++++++++++++- .../markup/head/JavaScriptReferenceHeaderItem.java | 5 +- .../head/JavaScriptUrlReferenceHeaderItem.java | 7 +- .../markup/html/internal/HeaderResponseTest.java | 73 ++++++++++- 9 files changed, 259 insertions(+), 37 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/f97fb9c8/wicket-core/src/main/java/org/apache/wicket/markup/head/CssContentHeaderItem.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/head/CssContentHeaderItem.java b/wicket-core/src/main/java/org/apache/wicket/markup/head/CssContentHeaderItem.java index 4ef6542..47d44d4 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/head/CssContentHeaderItem.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/head/CssContentHeaderItem.java @@ -42,8 +42,9 @@ public class CssContentHeaderItem extends CssHeaderItem * unique id for the <style> element. This can be <code>null</code>, however in * that case the ajax header contribution can't detect duplicate CSS fragments. */ - public CssContentHeaderItem(CharSequence css, String id) + public CssContentHeaderItem(CharSequence css, String id, String condition) { + super(condition); this.css = css; this.id = id; } @@ -67,7 +68,21 @@ public class CssContentHeaderItem extends CssHeaderItem @Override public void render(Response response) { + boolean hasCondition = Strings.isEmpty(getCondition()) == false; + if (hasCondition) + { + response.write("<!--[if "); + response.write(getCondition()); + response.write("]>"); + } + CssUtils.writeCss(response, getCss(), getId()); + + if (hasCondition) + { + response.write("<![endif]-->"); + response.write("\n"); + } } @Override http://git-wip-us.apache.org/repos/asf/wicket/blob/f97fb9c8/wicket-core/src/main/java/org/apache/wicket/markup/head/CssHeaderItem.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/head/CssHeaderItem.java b/wicket-core/src/main/java/org/apache/wicket/markup/head/CssHeaderItem.java index 4c88a7b..42d05ca 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/head/CssHeaderItem.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/head/CssHeaderItem.java @@ -31,6 +31,25 @@ import org.apache.wicket.util.string.Strings; public abstract class CssHeaderItem extends HeaderItem { /** + * The condition to use for Internet Explorer conditional comments. E.g. "IE 7". + * {@code null} or empty string for no condition. + */ + private final String condition; + + protected CssHeaderItem(String condition) + { + this.condition = condition; + } + + /** + * @return the condition to use for Internet Explorer conditional comments. E.g. "IE 7". + */ + public String getCondition() + { + return condition; + } + + /** * Creates a {@link CssReferenceHeaderItem} for the given reference. * * @param reference @@ -104,9 +123,27 @@ public abstract class CssHeaderItem extends HeaderItem */ public static CssContentHeaderItem forCSS(CharSequence css, String id) { - return new CssContentHeaderItem(css, id); + return forCSS(css, id, null); } + + /** + * Creates a {@link CssContentHeaderItem} for the given content. + * + * @param css + * css content to be rendered. + * @param id + * unique id for the <style> element. This can be <code>null</code>, however in + * that case the ajax header contribution can't detect duplicate CSS fragments. + * @param condition + * the condition to use for Internet Explorer conditional comments. E.g. "IE 7". + * @return A newly created {@link CssContentHeaderItem} for the given content. + */ + public static CssContentHeaderItem forCSS(CharSequence css, String id, String condition) + { + return new CssContentHeaderItem(css, id, condition); + } + /** * Creates a {@link CssUrlReferenceHeaderItem} for the given url. * @@ -155,7 +192,9 @@ public abstract class CssHeaderItem extends HeaderItem Args.notEmpty(url, "url"); String urlWoSessionId = Strings.stripJSessionId(url); - if (Strings.isEmpty(condition) == false) + + boolean hasCondition = Strings.isEmpty(condition) == false; + if (hasCondition) { response.write("<!--[if "); response.write(condition); @@ -171,7 +210,7 @@ public abstract class CssHeaderItem extends HeaderItem response.write("\""); } response.write(" />"); - if (Strings.isEmpty(condition) == false) + if (hasCondition) { response.write("<![endif]-->"); } http://git-wip-us.apache.org/repos/asf/wicket/blob/f97fb9c8/wicket-core/src/main/java/org/apache/wicket/markup/head/CssReferenceHeaderItem.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/head/CssReferenceHeaderItem.java b/wicket-core/src/main/java/org/apache/wicket/markup/head/CssReferenceHeaderItem.java index 62b2082..732a7df 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/head/CssReferenceHeaderItem.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/head/CssReferenceHeaderItem.java @@ -37,7 +37,6 @@ public class CssReferenceHeaderItem extends CssHeaderItem implements IReferenceH private final ResourceReference reference; private final String media; private final PageParameters pageParameters; - private final String condition; /** * Creates a new {@code CSSReferenceHeaderItem}. @@ -54,10 +53,10 @@ public class CssReferenceHeaderItem extends CssHeaderItem implements IReferenceH public CssReferenceHeaderItem(ResourceReference reference, PageParameters pageParameters, String media, String condition) { + super(condition); this.reference = reference; this.pageParameters = pageParameters; this.media = media; - this.condition = condition; } /** @@ -86,14 +85,6 @@ public class CssReferenceHeaderItem extends CssHeaderItem implements IReferenceH return pageParameters; } - /** - * @return the condition to use for Internet Explorer conditional comments. E.g. "IE 7". - */ - public String getCondition() - { - return condition; - } - @Override public Iterable<? extends HeaderItem> getDependencies() { @@ -111,7 +102,7 @@ public class CssReferenceHeaderItem extends CssHeaderItem implements IReferenceH @Override public void render(Response response) { - internalRenderCSSReference(response, getUrl(), media, condition); + internalRenderCSSReference(response, getUrl(), media, getCondition()); } @Override http://git-wip-us.apache.org/repos/asf/wicket/blob/f97fb9c8/wicket-core/src/main/java/org/apache/wicket/markup/head/CssUrlReferenceHeaderItem.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/head/CssUrlReferenceHeaderItem.java b/wicket-core/src/main/java/org/apache/wicket/markup/head/CssUrlReferenceHeaderItem.java index b799d9a..a107c4a 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/head/CssUrlReferenceHeaderItem.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/head/CssUrlReferenceHeaderItem.java @@ -32,7 +32,6 @@ public class CssUrlReferenceHeaderItem extends CssHeaderItem { private final String url; private final String media; - private final String condition; /** * Creates a new {@code CSSUrlReferenceHeaderItem}. @@ -46,9 +45,9 @@ public class CssUrlReferenceHeaderItem extends CssHeaderItem */ public CssUrlReferenceHeaderItem(String url, String media, String condition) { + super(condition); this.url = url; this.media = media; - this.condition = condition; } /** @@ -67,14 +66,6 @@ public class CssUrlReferenceHeaderItem extends CssHeaderItem return media; } - /** - * @return the condition to use for Internet Explorer conditional comments. E.g. "IE 7". - */ - public String getCondition() - { - return condition; - } - @Override public void render(Response response) { http://git-wip-us.apache.org/repos/asf/wicket/blob/f97fb9c8/wicket-core/src/main/java/org/apache/wicket/markup/head/JavaScriptContentHeaderItem.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/head/JavaScriptContentHeaderItem.java b/wicket-core/src/main/java/org/apache/wicket/markup/head/JavaScriptContentHeaderItem.java index c9fcd73..70b2922 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/head/JavaScriptContentHeaderItem.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/head/JavaScriptContentHeaderItem.java @@ -41,9 +41,12 @@ public class JavaScriptContentHeaderItem extends JavaScriptHeaderItem * @param id * unique id for the javascript element. This can be null, however in that case the * ajax header contribution can't detect duplicate script fragments. + * @param condition + * the condition to use for Internet Explorer conditional comments. E.g. "IE 7". */ - public JavaScriptContentHeaderItem(CharSequence javaScript, String id) + public JavaScriptContentHeaderItem(CharSequence javaScript, String id, String condition) { + super(condition); this.javaScript = javaScript; this.id = id; } @@ -67,7 +70,20 @@ public class JavaScriptContentHeaderItem extends JavaScriptHeaderItem @Override public void render(Response response) { + boolean hasCondition = Strings.isEmpty(getCondition()) == false; + if (hasCondition) + { + response.write("<!--[if "); + response.write(getCondition()); + response.write("]>"); + } JavaScriptUtils.writeJavaScript(response, getJavaScript(), getId()); + + if (hasCondition) + { + response.write("<![endif]-->"); + response.write("\n"); + } } @Override http://git-wip-us.apache.org/repos/asf/wicket/blob/f97fb9c8/wicket-core/src/main/java/org/apache/wicket/markup/head/JavaScriptHeaderItem.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/head/JavaScriptHeaderItem.java b/wicket-core/src/main/java/org/apache/wicket/markup/head/JavaScriptHeaderItem.java index 43fa3bd..71df955 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/head/JavaScriptHeaderItem.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/head/JavaScriptHeaderItem.java @@ -32,6 +32,25 @@ import org.apache.wicket.util.string.Strings; public abstract class JavaScriptHeaderItem extends HeaderItem { /** + * The condition to use for Internet Explorer conditional comments. E.g. "IE 7". + * {@code null} or empty string for no condition. + */ + private final String condition; + + protected JavaScriptHeaderItem(String condition) + { + this.condition = condition; + } + + /** + * @return the condition to use for Internet Explorer conditional comments. E.g. "IE 7". + */ + public String getCondition() + { + return condition; + } + + /** * Creates a {@link JavaScriptReferenceHeaderItem} for the given reference. * * @param reference @@ -117,7 +136,33 @@ public abstract class JavaScriptHeaderItem extends HeaderItem public static JavaScriptReferenceHeaderItem forReference(ResourceReference reference, PageParameters pageParameters, String id, boolean defer, String charset) { - return new JavaScriptReferenceHeaderItem(reference, pageParameters, id, defer, charset); + return new JavaScriptReferenceHeaderItem(reference, pageParameters, id, defer, charset, null); + } + + + /** + * Creates a {@link JavaScriptReferenceHeaderItem} for the given reference. + * + * @param reference + * resource reference pointing to the javascript resource + * @param pageParameters + * the parameters for this Javascript resource reference + * @param id + * id that will be used to filter duplicate reference (it's still filtered by URL + * too) + * @param defer + * specifies that the execution of a script should be deferred (delayed) until after + * the page has been loaded. + * @param charset + * a non null value specifies the charset attribute of the script tag + * @param condition + * the condition to use for Internet Explorer conditional comments. E.g. "IE 7". + * @return A newly created {@link JavaScriptReferenceHeaderItem} for the given reference. + */ + public static JavaScriptReferenceHeaderItem forReference(ResourceReference reference, + PageParameters pageParameters, String id, boolean defer, String charset, String condition) + { + return new JavaScriptReferenceHeaderItem(reference, pageParameters, id, defer, charset, condition); } /** @@ -132,7 +177,24 @@ public abstract class JavaScriptHeaderItem extends HeaderItem */ public static JavaScriptContentHeaderItem forScript(CharSequence javascript, String id) { - return new JavaScriptContentHeaderItem(javascript, id); + return forScript(javascript, id, null); + } + + /** + * Creates a {@link JavaScriptContentHeaderItem} for the given content. + * + * @param javascript + * javascript content to be rendered. + * @param id + * unique id for the javascript element. This can be null, however in that case the + * ajax header contribution can't detect duplicate script fragments. + * @param condition + * the condition to use for Internet Explorer conditional comments. E.g. "IE 7". + * @return A newly created {@link JavaScriptContentHeaderItem} for the given content. + */ + public static JavaScriptContentHeaderItem forScript(CharSequence javascript, String id, String condition) + { + return new JavaScriptContentHeaderItem(javascript, id, condition); } /** @@ -198,14 +260,49 @@ public abstract class JavaScriptHeaderItem extends HeaderItem public static JavaScriptUrlReferenceHeaderItem forUrl(String url, String id, boolean defer, String charset) { - return new JavaScriptUrlReferenceHeaderItem(url, id, defer, charset); + return forUrl(url, id, defer, charset, null); + } + + /** + * Creates a {@link JavaScriptUrlReferenceHeaderItem} for the given url. + * + * @param url + * context-relative url of the the javascript resource + * @param id + * id that will be used to filter duplicate reference (it's still filtered by URL + * too) + * @param defer + * specifies that the execution of a script should be deferred (delayed) until after + * the page has been loaded. + * @param charset + * a non null value specifies the charset attribute of the script tag + * @return A newly created {@link JavaScriptUrlReferenceHeaderItem} for the given url. + */ + public static JavaScriptUrlReferenceHeaderItem forUrl(String url, String id, boolean defer, + String charset, String condition) + { + return new JavaScriptUrlReferenceHeaderItem(url, id, defer, charset, condition); } protected static void internalRenderJavaScriptReference(Response response, String url, - String id, boolean defer, String charset) + String id, boolean defer, String charset, String condition) { Args.notEmpty(url, "url"); - + + boolean hasCondition = Strings.isEmpty(condition) == false; + if (hasCondition) + { + response.write("<!--[if "); + response.write(condition); + response.write("]>"); + } + JavaScriptUtils.writeJavaScriptUrl(response, Strings.stripJSessionId(url), id, defer, charset); + + if (hasCondition) + { + response.write("<![endif]-->"); + response.write("\n"); + } } } http://git-wip-us.apache.org/repos/asf/wicket/blob/f97fb9c8/wicket-core/src/main/java/org/apache/wicket/markup/head/JavaScriptReferenceHeaderItem.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/head/JavaScriptReferenceHeaderItem.java b/wicket-core/src/main/java/org/apache/wicket/markup/head/JavaScriptReferenceHeaderItem.java index 1e5da96..ff0dac6 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/head/JavaScriptReferenceHeaderItem.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/head/JavaScriptReferenceHeaderItem.java @@ -60,8 +60,9 @@ public class JavaScriptReferenceHeaderItem extends JavaScriptHeaderItem * a non null value specifies the charset attribute of the script tag */ public JavaScriptReferenceHeaderItem(ResourceReference reference, - PageParameters pageParameters, String id, boolean defer, String charset) + PageParameters pageParameters, String id, boolean defer, String charset, String condition) { + super(condition); this.reference = reference; this.pageParameters = pageParameters; this.id = id; @@ -129,7 +130,7 @@ public class JavaScriptReferenceHeaderItem extends JavaScriptHeaderItem @Override public void render(Response response) { - internalRenderJavaScriptReference(response, getUrl(), getId(), isDefer(), getCharset()); + internalRenderJavaScriptReference(response, getUrl(), getId(), isDefer(), getCharset(), getCondition()); } @Override http://git-wip-us.apache.org/repos/asf/wicket/blob/f97fb9c8/wicket-core/src/main/java/org/apache/wicket/markup/head/JavaScriptUrlReferenceHeaderItem.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/head/JavaScriptUrlReferenceHeaderItem.java b/wicket-core/src/main/java/org/apache/wicket/markup/head/JavaScriptUrlReferenceHeaderItem.java index 6081c8e..ec00d33 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/head/JavaScriptUrlReferenceHeaderItem.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/head/JavaScriptUrlReferenceHeaderItem.java @@ -50,9 +50,12 @@ public class JavaScriptUrlReferenceHeaderItem extends JavaScriptHeaderItem * the page has been loaded. * @param charset * a non null value specifies the charset attribute of the script tag + * @param condition + * the condition to use for Internet Explorer conditional comments. E.g. "IE 7". */ - public JavaScriptUrlReferenceHeaderItem(String url, String id, boolean defer, String charset) + public JavaScriptUrlReferenceHeaderItem(String url, String id, boolean defer, String charset, String condition) { + super(condition); this.url = url; this.id = id; this.defer = defer; @@ -98,7 +101,7 @@ public class JavaScriptUrlReferenceHeaderItem extends JavaScriptHeaderItem { internalRenderJavaScriptReference(response, UrlUtils.rewriteToContextRelative(getUrl(), RequestCycle.get()), getId(), isDefer(), - getCharset()); + getCharset(), getCondition()); } @Override http://git-wip-us.apache.org/repos/asf/wicket/blob/f97fb9c8/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java index c4bcc43..d2f3be2 100644 --- a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java @@ -33,6 +33,7 @@ import org.apache.wicket.request.Request; import org.apache.wicket.request.Response; import org.apache.wicket.request.UrlRenderer; import org.apache.wicket.request.cycle.RequestCycle; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.request.resource.IResource; import org.apache.wicket.request.resource.ResourceReference; import org.apache.wicket.markup.head.CssHeaderItem; @@ -124,12 +125,26 @@ public class HeaderResponseTest public void conditionalRenderCSSReferenceWithUrl() { headerResponse.render(CssHeaderItem.forUrl("resource.css", "screen", "lt IE 8")); - String expected = "<!--[if lt IE 8]><link rel=\"stylesheet\" type=\"text/css\" href=\"" + - RESOURCE_NAME + "\" media=\"screen\" /><![endif]-->\n"; + String expected = "<!--[if lt IE 8]><link rel=\"stylesheet\" type=\"text/css\" href=\""+RESOURCE_NAME+"\" media=\"screen\" /><![endif]-->\n"; String actual = headerResponse.getResponse().toString(); Assert.assertEquals(expected, actual); } + + /** + * Tests the creation of a proper IE conditional comment + */ + @Test + public void conditionalRenderCSSContent() + { + headerResponse.render(CssHeaderItem.forCSS(".className { font-size: 10px}", "id", "lt IE 8")); + String expected = "<!--[if lt IE 8]><style type=\"text/css\" id=\"id\"><!--\n" + + ".className { font-size: 10px}--></style>\n" + + "<![endif]-->\n"; + String actual = headerResponse.getResponse().toString(); + Assert.assertEquals(expected, actual); + } + /** * Tests setting of 'defer' attribute * <p> @@ -210,4 +225,58 @@ public class HeaderResponseTest tester.destroy(); } } + + + /** + * Tests the creation of a proper IE conditional comment + */ + @Test + public void conditionalRenderJSReference() + { + headerResponse.render( + JavaScriptHeaderItem.forReference(reference, new PageParameters(), "id", false, null, "lt IE 8")); + + String expected = "<!--[if lt IE 8]><script type=\"text/javascript\" id=\"id\" src=\""+RESOURCE_NAME+"\"></script>\n<![endif]-->\n"; + + String actual = headerResponse.getResponse().toString(); + + Assert.assertEquals(expected, actual); + } + + /** + * Tests the creation of a proper IE conditional comment + */ + @Test + public void conditionalRenderJSReferenceWithUrl() + { + headerResponse.render(JavaScriptHeaderItem.forUrl("js-resource.js", "id", true, "cp1251", "lt IE 8")); + + String expected = "<!--[if lt IE 8]><script type=\"text/javascript\" id=\"id\" defer=\"defer\" charset=\"cp1251\" src=\""+RESOURCE_NAME+"\"></script>\n" + + "<![endif]-->\n"; + + String actual = headerResponse.getResponse().toString(); + + Assert.assertEquals(expected, actual); + } + + + /** + * Tests the creation of a proper IE conditional comment + */ + @Test + public void conditionalRenderJSContent() + { + headerResponse.render(JavaScriptHeaderItem.forScript("someJSMethod();", "id", "lt IE 8")); + + String expected = "<!--[if lt IE 8]><script type=\"text/javascript\" id=\"id\">\n" + + "/*<![CDATA[*/\n" + + "someJSMethod();\n" + + "/*]]>*/\n" + + "</script>\n" + + "<![endif]-->\n"; + + String actual = headerResponse.getResponse().toString(); + + Assert.assertEquals(expected, actual); + } }
