You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2011/04/28 15:30:16 UTC

svn commit: r1097452 - in /wicket/trunk/wicket-core/src: main/java/org/apache/wicket/markup/html/ main/java/org/apache/wicket/markup/html/internal/ test/java/org/apache/wicket/markup/html/internal/

Author: mgrigorov
Date: Thu Apr 28 13:30:16 2011
New Revision: 1097452

URL: http://svn.apache.org/viewvc?rev=1097452&view=rev
Log:
WICKET-3653 Add a method to IHeaderResponse to create IE conditional commented link to CSS resource

Overload IHeaderResponse#renderCSSReference() with additional argument 'condition' so that now it is possible to render IE conditional <link>s.


Added:
    wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java
Modified:
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/DecoratingHeaderResponse.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/IHeaderResponse.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HeaderResponse.java

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/DecoratingHeaderResponse.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/DecoratingHeaderResponse.java?rev=1097452&r1=1097451&r2=1097452&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/DecoratingHeaderResponse.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/DecoratingHeaderResponse.java Thu Apr 28 13:30:16 2011
@@ -114,11 +114,22 @@ public abstract class DecoratingHeaderRe
 		realResponse.renderCSSReference(reference, pageParameters, media);
 	}
 
+	public void renderCSSReference(ResourceReference reference, PageParameters pageParameters,
+		String media, String condition)
+	{
+		realResponse.renderCSSReference(reference, pageParameters, media, condition);
+	}
+
 	public void renderCSSReference(String url, String media)
 	{
 		realResponse.renderCSSReference(url, media);
 	}
 
+	public void renderCSSReference(String url, String media, String condition)
+	{
+		realResponse.renderCSSReference(url, media, condition);
+	}
+
 	public void renderString(CharSequence string)
 	{
 		realResponse.renderString(string);

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/IHeaderResponse.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/IHeaderResponse.java?rev=1097452&r1=1097451&r2=1097452&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/IHeaderResponse.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/IHeaderResponse.java Thu Apr 28 13:30:16 2011
@@ -16,12 +16,12 @@
  */
 package org.apache.wicket.markup.html;
 
-import java.io.Closeable;
-
 import org.apache.wicket.request.Response;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.ResourceReference;
 
+import java.io.Closeable;
+
 /**
  * Interface that is used to render header elements (usually javascript and CSS references).
  * 
@@ -154,7 +154,23 @@ public interface IHeaderResponse extends
 		String media);
 
 	/**
-	 * Writes a CSS reference, if the specified reference hasn't been rendered yet.
+	 * Writes a conditional IE comment with a CSS reference with query parameters, if the specified
+	 * reference hasn't been rendered yet.
+	 * 
+	 * @param reference
+	 *            resource reference pointing to the CSS resource
+	 * @param pageParameters
+	 *            the parameters for this CSS resource reference
+	 * @param media
+	 *            the media type for this CSS ("print", "screen", etc.)
+	 * @param condition
+	 *            the condition to use for Internet Explorer conditional comments. E.g. "IE 7".
+	 */
+	public void renderCSSReference(ResourceReference reference, PageParameters pageParameters,
+		String media, String condition);
+
+	/**
+	 * Writes a link to a CSS resource, if the specified url hasn't been rendered yet.
 	 * 
 	 * @param url
 	 *            context-relative url of the CSS resource
@@ -165,6 +181,21 @@ public interface IHeaderResponse extends
 	public void renderCSSReference(String url, String media);
 
 	/**
+	 * Writes a conditional IE comment for a link to a CSS resource, if the specified url hasn't
+	 * been rendered yet.
+	 * 
+	 * @param url
+	 *            context-relative url of the CSS resource
+	 * @param media
+	 *            the media type for this CSS ("print", "screen", etc.)
+	 * @param condition
+	 *            the condition to use for Internet Explorer conditional comments. E.g. "IE 7".
+	 */
+	// TODO make media an enum
+	public void renderCSSReference(String url, String media, String condition);
+
+
+	/**
 	 * Renders an arbitrary string to the header. The string is only rendered if the same string
 	 * hasn't been rendered before.
 	 * <p>

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HeaderResponse.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HeaderResponse.java?rev=1097452&r1=1097451&r2=1097452&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HeaderResponse.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HeaderResponse.java Thu Apr 28 13:30:16 2011
@@ -16,11 +16,6 @@
  */
 package org.apache.wicket.markup.html.internal;
 
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
 import org.apache.wicket.markup.html.IHeaderResponse;
 import org.apache.wicket.markup.html.WicketEventReference;
 import org.apache.wicket.request.IRequestHandler;
@@ -36,6 +31,11 @@ import org.apache.wicket.util.string.Css
 import org.apache.wicket.util.string.JavaScriptUtils;
 import org.apache.wicket.util.string.Strings;
 
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
 
 /**
  * Default implementation of the {@link IHeaderResponse} interface.
@@ -94,6 +94,12 @@ public abstract class HeaderResponse imp
 	public void renderCSSReference(ResourceReference reference, PageParameters pageParameters,
 		String media)
 	{
+		renderCSSReference(reference, pageParameters, media, null);
+	}
+
+	public void renderCSSReference(ResourceReference reference, PageParameters pageParameters,
+		String media, String condition)
+	{
 		if (reference == null)
 		{
 			throw new IllegalArgumentException("reference cannot be null");
@@ -102,7 +108,7 @@ public abstract class HeaderResponse imp
 		{
 			IRequestHandler handler = new ResourceReferenceRequestHandler(reference, pageParameters);
 			CharSequence url = RequestCycle.get().urlFor(handler);
-			internalRenderCSSReference(url.toString(), media);
+			internalRenderCSSReference(url.toString(), media, condition);
 		}
 	}
 
@@ -114,16 +120,18 @@ public abstract class HeaderResponse imp
 		renderCSSReference(url, null);
 	}
 
-	/**
-	 * @see org.apache.wicket.markup.html.IHeaderResponse#renderCSSReference(java.lang.String,
-	 *      java.lang.String)
-	 */
 	public void renderCSSReference(String url, String media)
 	{
-		internalRenderCSSReference(relative(url), media);
+		renderCSSReference(url, media, null);
+	}
+
+	public void renderCSSReference(String url, String media, String condition)
+	{
+		internalRenderCSSReference(relative(url), media, condition);
 	}
 
-	private void internalRenderCSSReference(String url, String media)
+	private void internalRenderCSSReference(final String url, final String media,
+		final String condition)
 	{
 		if (Strings.isEmpty(url))
 		{
@@ -134,6 +142,12 @@ public abstract class HeaderResponse imp
 			List<String> token = Arrays.asList("css", url, media);
 			if (wasRendered(token) == false)
 			{
+				if (Strings.isEmpty(condition) == false)
+				{
+					getResponse().write("<!--[if ");
+					getResponse().write(condition);
+					getResponse().write("]>");
+				}
 				getResponse().write("<link rel=\"stylesheet\" type=\"text/css\" href=\"");
 				getResponse().write(url);
 				getResponse().write("\"");
@@ -144,6 +158,10 @@ public abstract class HeaderResponse imp
 					getResponse().write("\"");
 				}
 				getResponse().write(" />");
+				if (Strings.isEmpty(condition) == false)
+				{
+					getResponse().write("<![endif]-->");
+				}
 				getResponse().write("\n");
 				markRendered(token);
 			}

Added: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java?rev=1097452&view=auto
==============================================================================
--- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java (added)
+++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java Thu Apr 28 13:30:16 2011
@@ -0,0 +1,129 @@
+/*
+ * 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.wicket.markup.html.internal;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.apache.wicket.ThreadContext;
+import org.apache.wicket.markup.html.IHeaderResponse;
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.Request;
+import org.apache.wicket.request.Response;
+import org.apache.wicket.request.Url;
+import org.apache.wicket.request.UrlRenderer;
+import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.request.resource.IResource;
+import org.apache.wicket.request.resource.ResourceReference;
+import org.apache.wicket.response.StringResponse;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.nio.charset.Charset;
+
+import junit.framework.Assert;
+
+/**
+ * Tests for {@link IHeaderResponse}'s methods
+ */
+public class HeaderResponseTest
+{
+	private static final String RESOURCE_NAME = "resource.css";
+
+	private IHeaderResponse headerResponse;
+
+	private ResourceReference reference;
+
+	/**
+	 * Prepare
+	 */
+	@Before
+	public void before()
+	{
+		final Response realResponse = new StringResponse();
+
+		headerResponse = new HeaderResponse()
+		{
+			@Override
+			protected Response getRealResponse()
+			{
+				return realResponse;
+			}
+		};
+
+		reference = new ResourceReference("testReference")
+		{
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public IResource getResource()
+			{
+				return null;
+			}
+		};
+
+		RequestCycle requestCycle = mock(RequestCycle.class);
+		when(requestCycle.urlFor(any(IRequestHandler.class))).thenReturn(RESOURCE_NAME);
+
+		Request request = mock(Request.class);
+		when(request.getCharset()).thenReturn(Charset.defaultCharset());
+		when(requestCycle.getRequest()).thenReturn(request);
+
+		UrlRenderer urlRenderer = mock(UrlRenderer.class);
+		when(urlRenderer.renderUrl(any(Url.class))).thenReturn(RESOURCE_NAME);
+		when(requestCycle.getUrlRenderer()).thenReturn(urlRenderer);
+
+		ThreadContext.setRequestCycle(requestCycle);
+	}
+
+	/**
+	 * Tear down
+	 */
+	@After
+	public void after()
+	{
+		ThreadContext.setRequestCycle(null);
+	}
+
+	/**
+	 * Tests the creation of a proper IE conditional comment
+	 */
+	@Test
+	public void testConditionalRenderCSSReference()
+	{
+		headerResponse.renderCSSReference(reference, null, "screen", "lt IE 8");
+		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 testConditionalRenderCSSReferenceWithUrl()
+	{
+		headerResponse.renderCSSReference("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 actual = headerResponse.getResponse().toString();
+		Assert.assertEquals(expected, actual);
+	}
+}