Author: mgrigorov
Date: Tue May  3 09:36:25 2011
New Revision: 1098984

URL: http://svn.apache.org/viewvc?rev=1098984&view=rev
Log:
WICKET-3661 IHeaderResponse.renderJavaScriptReference does not support the 
"defer" attribute


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
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/string/JavaScriptUtils.java
    
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
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/DecoratingHeaderResponse.java?rev=1098984&r1=1098983&r2=1098984&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
 Tue May  3 09:36:25 2011
@@ -73,6 +73,12 @@ public abstract class DecoratingHeaderRe
                realResponse.renderJavaScriptReference(reference, 
pageParameters, id);
        }
 
+       public void renderJavaScriptReference(ResourceReference reference,
+               PageParameters pageParameters, String id, boolean defer)
+       {
+               realResponse.renderJavaScriptReference(reference, 
pageParameters, id, defer);
+       }
+
        public void renderJavaScriptReference(String url)
        {
                realResponse.renderJavaScriptReference(url);
@@ -83,6 +89,11 @@ public abstract class DecoratingHeaderRe
                realResponse.renderJavaScriptReference(url, id);
        }
 
+       public void renderJavaScriptReference(String url, String id, boolean 
defer)
+       {
+               realResponse.renderJavaScriptReference(url, id, defer);
+       }
+
        public void renderJavaScript(CharSequence javascript, String id)
        {
                realResponse.renderJavaScript(javascript, id);

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=1098984&r1=1098983&r2=1098984&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
 Tue May  3 09:36:25 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).
  * 
@@ -67,6 +67,24 @@ public interface IHeaderResponse extends
                PageParameters pageParameters, String id);
 
        /**
+        * Writes a javascript reference with query parameters, if the 
specified reference hasn't been
+        * rendered yet.
+        * 
+        * @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.
+        */
+       public void renderJavaScriptReference(ResourceReference reference,
+               PageParameters pageParameters, String id, boolean defer);
+
+       /**
         * Writes a javascript reference, if the specified reference hasn't 
been rendered yet.
         * 
         * @param url
@@ -86,6 +104,20 @@ public interface IHeaderResponse extends
        public void renderJavaScriptReference(String url, String id);
 
        /**
+        * Writes a javascript reference, if the specified reference hasn't 
been rendered yet.
+        * 
+        * @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.
+        */
+       public void renderJavaScriptReference(String url, String id, boolean 
defer);
+
+       /**
         * Renders javascript code to the response, if the javascript has not 
already been rendered.
         * 
         * the necessary surrounding <code>script</code> tags will be added to 
the output.

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=1098984&r1=1098983&r2=1098984&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
 Tue May  3 09:36:25 2011
@@ -16,6 +16,11 @@
  */
 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;
@@ -31,11 +36,6 @@ 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.
@@ -189,34 +189,38 @@ public abstract class HeaderResponse imp
        public void renderJavaScriptReference(ResourceReference reference,
                PageParameters pageParameters, String id)
        {
+               renderJavaScriptReference(reference, pageParameters, id, false);
+       }
+
+       public void renderJavaScriptReference(ResourceReference reference,
+               PageParameters pageParameters, String id, boolean defer)
+       {
                Args.notNull(reference, "reference");
 
                if (!closed)
                {
                        IRequestHandler handler = new 
ResourceReferenceRequestHandler(reference, pageParameters);
                        CharSequence url = RequestCycle.get().urlFor(handler);
-                       internalRenderJavaScriptReference(url.toString(), id);
+                       internalRenderJavaScriptReference(url.toString(), id, 
defer);
                }
        }
 
-       /**
-        * @see 
org.apache.wicket.markup.html.IHeaderResponse#renderJavaScriptReference(java.lang.String)
-        */
        public void renderJavaScriptReference(String url)
        {
-               internalRenderJavaScriptReference(relative(url), null);
+               renderJavaScriptReference(url, null);
        }
 
-       /**
-        * @see 
org.apache.wicket.markup.html.IHeaderResponse#renderJavaScriptReference(java.lang.String,
-        *      java.lang.String)
-        */
        public void renderJavaScriptReference(String url, String id)
        {
-               internalRenderJavaScriptReference(relative(url), id);
+               renderJavaScriptReference(url, id, false);
+       }
+
+       public void renderJavaScriptReference(String url, String id, boolean 
defer)
+       {
+               internalRenderJavaScriptReference(relative(url), id, defer);
        }
 
-       private void internalRenderJavaScriptReference(String url, String id)
+       private void internalRenderJavaScriptReference(String url, String id, 
boolean defer)
        {
                if (Strings.isEmpty(url))
                {
@@ -232,7 +236,7 @@ public abstract class HeaderResponse imp
 
                        if (token1Unused && token2Unused)
                        {
-                               
JavaScriptUtils.writeJavaScriptUrl(getResponse(), url, id);
+                               
JavaScriptUtils.writeJavaScriptUrl(getResponse(), url, id, defer);
                                markRendered(token1);
                                if (token2 != null)
                                {

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/string/JavaScriptUtils.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/string/JavaScriptUtils.java?rev=1098984&r1=1098983&r2=1098984&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/string/JavaScriptUtils.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/string/JavaScriptUtils.java
 Tue May  3 09:36:25 2011
@@ -105,11 +105,34 @@ public class JavaScriptUtils
        public static void writeJavaScriptUrl(final Response response, final 
CharSequence url,
                final String id)
        {
+               writeJavaScriptUrl(response, url, id, false);
+       }
+
+       /**
+        * Write a reference to a javascript file to the response object
+        * 
+        * @param response
+        *            The HTTP response
+        * @param url
+        *            The javascript file URL
+        * @param id
+        *            Unique identifier of element
+        * @param defer
+        *            specifies that the execution of a script should be 
deferred (delayed) until after
+        *            the page has been loaded.
+        */
+       public static void writeJavaScriptUrl(final Response response, final 
CharSequence url,
+               final String id, boolean defer)
+       {
                response.write("<script type=\"text/javascript\" ");
                if (id != null)
                {
                        response.write("id=\"" + id + "\" ");
                }
+               if (defer)
+               {
+                       response.write("defer=\"defer\" ");
+               }
                response.write("src=\"");
                response.write(url);
                response.write("\"></script>");

Modified: 
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=1098984&r1=1098983&r2=1098984&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java
 (original)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java
 Tue May  3 09:36:25 2011
@@ -20,6 +20,10 @@ import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import java.nio.charset.Charset;
+
+import junit.framework.Assert;
+
 import org.apache.wicket.ThreadContext;
 import org.apache.wicket.markup.html.IHeaderResponse;
 import org.apache.wicket.request.IRequestHandler;
@@ -35,16 +39,12 @@ 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 static final String RESOURCE_NAME = "resource.name";
 
        private IHeaderResponse headerResponse;
 
@@ -126,4 +126,37 @@ public class HeaderResponseTest
                String actual = headerResponse.getResponse().toString();
                Assert.assertEquals(expected, actual);
        }
+
+       /**
+        * Tests setting of 'defer' attribute
+        * <p>
+        * WICKET-3661
+        */
+       @Test
+       public void testDeferJavaScriptReference()
+       {
+               boolean defer = true;
+               headerResponse.renderJavaScriptReference("js-resource.js", 
"some-id", defer);
+               String expected = "<script type=\"text/javascript\" 
id=\"some-id\" defer=\"defer\" src=\"" +
+                       RESOURCE_NAME + "\"></script>\n";
+               String actual = headerResponse.getResponse().toString();
+               Assert.assertEquals(expected, actual);
+       }
+
+       /**
+        * Tests non-setting of 'defer' attribute
+        * <p>
+        * WICKET-3661
+        */
+       @Test
+       public void testDeferFalseJavaScriptReference()
+       {
+               boolean defer = false;
+               headerResponse.renderJavaScriptReference("js-resource.js", 
"some-id", defer);
+               String expected = "<script type=\"text/javascript\" 
id=\"some-id\" src=\"" + RESOURCE_NAME +
+                       "\"></script>\n";
+               String actual = headerResponse.getResponse().toString();
+               Assert.assertEquals(expected, actual);
+       }
+
 }


Reply via email to