Updated Branches:
  refs/heads/master c333ac07b -> ecdfc1244

WICKET-5484 rendering and writing of a page should never happen on an
Ajax request, even if other circumstances imply otherwise

Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/ecdfc124
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/ecdfc124
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/ecdfc124

Branch: refs/heads/master
Commit: ecdfc124453ca614178d33d0c119d4e71872cfef
Parents: c333ac0
Author: svenmeier <[email protected]>
Authored: Thu Jan 23 14:30:01 2014 +0100
Committer: svenmeier <[email protected]>
Committed: Thu Jan 23 14:30:01 2014 +0100

----------------------------------------------------------------------
 .../request/handler/render/WebPageRenderer.java | 10 ++-
 .../handler/render/WebPageRendererTest.java     | 75 ++++++++++++++++----
 2 files changed, 69 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/ecdfc124/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java
 
b/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java
index 4b95e32..8c99c13 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java
@@ -332,10 +332,16 @@ public class WebPageRenderer extends PageRenderer
        protected boolean shouldRenderPageAndWriteResponse(RequestCycle cycle, 
Url currentUrl,
                Url targetUrl)
        {
+               // WICKET-5484 never render and write for Ajax requests
+               if (isAjax(cycle))
+               {
+                       return false;
+               }
+
                return neverRedirect(getRedirectPolicy())
-                       || (!isAjax(cycle) && ((isOnePassRender() && 
notForcedRedirect(getRedirectPolicy())) || (targetUrl
+                       || ((isOnePassRender() && 
notForcedRedirect(getRedirectPolicy())) || (targetUrl
                                .equals(currentUrl) && 
notNewAndNotStatelessPage(isNewPageInstance(),
-                               isPageStateless())))) || 
(targetUrl.equals(currentUrl) && isRedirectToRender())
+                               isPageStateless()))) || 
(targetUrl.equals(currentUrl) && isRedirectToRender())
                        || shouldPreserveClientUrl(cycle);
        }
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/ecdfc124/wicket-core/src/test/java/org/apache/wicket/request/handler/render/WebPageRendererTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/WebPageRendererTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/request/handler/render/WebPageRendererTest.java
index 3da8089..4f6ff45 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/WebPageRendererTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/request/handler/render/WebPageRendererTest.java
@@ -574,7 +574,7 @@ public class WebPageRendererTest
                // if
                // the policy is never to redirect
                renderer.redirectPolicy = RedirectPolicy.NEVER_REDIRECT;
-               renderer.ajax = true;
+               renderer.ajax = false;
                renderer.onePassRender = true;
                renderer.redirectToRender = true;
                renderer.shouldPreserveClientUrl = true;
@@ -635,7 +635,7 @@ public class WebPageRendererTest
                renderer.shouldPreserveClientUrl = true;
 
                renderer.redirectPolicy = RedirectPolicy.AUTO_REDIRECT;
-               renderer.ajax = true;
+               renderer.ajax = false;
                renderer.onePassRender = false;
                renderer.redirectToRender = false;
                renderer.newPageInstance = true;
@@ -698,26 +698,26 @@ public class WebPageRendererTest
                                                "    XXXXXXXXXXXX" +
                                                "    X   XXXXXXXX" +
                                                "    XXXXXXXXXXXX" +
-                                               "        XXXXXXXX" +
-                                               "    XXXXXXXXXXXX" +
-                                               "        XXXXXXXX" +
-                                               "    XXXXXXXXXXXX" +
-                                               "XXXXXXXXXXXXXXXX" +
-                                               "XXXXXXXXXXXXXXXX" +
-                                               "XXXXXXXXXXXXXXXX" +
-                                               "XXXXXXXXXXXXXXXX" +
+                                               "                " +
+                                               "                " +
+                                               "                " +
+                                               "                " +
                                                "XXXXXXXXXXXXXXXX" +
                                                "XXXXXXXXXXXXXXXX" +
                                                "XXXXXXXXXXXXXXXX" +
                                                "XXXXXXXXXXXXXXXX" +
+                                               "                " +
+                                               "                " +
+                                               "                " +
+                                               "                " +
                                                "    X   XXXXXXXX" +
                                                "    XXXXXXXXXXXX" +
                                                "XXXXXXXXXXXXXXXX" +
                                                "XXXXXXXXXXXXXXXX" +
-                                               "        XXXXXXXX" +
-                                               "    XXXXXXXXXXXX" +
-                                               "        XXXXXXXX" +
-                                               "    XXXXXXXXXXXX";
+                                               "                " +
+                                               "                " +
+                                               "                " +
+                                               "                ";
 
                checkVariations(match,new 
ShouldRenderPageAndWriteResponseVariations());
        }
@@ -956,4 +956,51 @@ public class WebPageRendererTest
                verify(response).sendRedirect(anyString());
                Assert.assertTrue(stored.get());
        }
+
+       /**
+        * Tests that when {@link WebRequest#shouldPreserveClientUrl()} returns 
{@code true} and the
+        * current request is Ajax then a redirect should be issued
+        */
+       @Test
+       public void testShouldPreserveClientUrlAndAjaxRequest()
+       {
+               TestPageRenderer renderer = new TestPageRenderer(handler);
+               renderer.ajax = true;
+               renderer.newPageInstance = true;
+
+               when(urlRenderer.getBaseUrl()).thenReturn(Url.parse("base"));
+
+               
when(requestCycle.mapUrlFor(eq(handler))).thenReturn(Url.parse("base/a"));
+
+               when(request.shouldPreserveClientUrl()).thenReturn(true);
+
+               renderer.respond(requestCycle);
+
+               verify(response).sendRedirect(anyString());
+               verify(response, never()).write(any(byte[].class));
+
+       }
+
+       /**
+        * Tests that when {@link RedirectPolicy#NEVER_REDIRECT} is configured 
but the current request
+        * is Ajax then a redirect should still be issued
+        */
+       @Test
+       public void testNeverRedirectButAjaxRequest()
+       {
+               TestPageRenderer renderer = new TestPageRenderer(handler);
+               renderer.redirectPolicy = RedirectPolicy.NEVER_REDIRECT;
+               renderer.ajax = true;
+               renderer.newPageInstance = true;
+
+               when(urlRenderer.getBaseUrl()).thenReturn(Url.parse("base"));
+
+               
when(requestCycle.mapUrlFor(eq(handler))).thenReturn(Url.parse("base/a"));
+
+               renderer.respond(requestCycle);
+
+               verify(response).sendRedirect(anyString());
+               verify(response, never()).write(any(byte[].class));
+
+       }
 }

Reply via email to