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);
+       }
+}


Reply via email to