Updated Branches:
  refs/heads/wicket-6.x 4ab1dbc3f -> cc16f8e92

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/cc16f8e9
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/cc16f8e9
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/cc16f8e9

Branch: refs/heads/wicket-6.x
Commit: cc16f8e920205af12c505968ebb6db343321dce5
Parents: 4ab1dbc
Author: svenmeier <[email protected]>
Authored: Thu Jan 23 14:29:15 2014 +0100
Committer: svenmeier <[email protected]>
Committed: Thu Jan 23 14:29:15 2014 +0100

----------------------------------------------------------------------
 .../request/handler/render/WebPageRenderer.java | 18 +++----
 .../handler/render/WebPageRendererTest.java     | 57 ++++++++++++++++++++
 2 files changed, 66 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/cc16f8e9/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 8e77875..d27cab6 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
@@ -200,15 +200,15 @@ public class WebPageRenderer extends PageRenderer
                        // if there is saved response for this URL render it
                        
bufferedResponse.writeTo((WebResponse)requestCycle.getResponse());
                }
-               else if (getRedirectPolicy() == RedirectPolicy.NEVER_REDIRECT ||
-                       (isOnePassRender() && isAjax == false && 
getRedirectPolicy() != RedirectPolicy.ALWAYS_REDIRECT) //
-                       ||
-                       (!isAjax //
-                               &&
-                               (targetUrl.equals(currentUrl) && 
!getPageProvider().isNewPageInstance() && !getPage().isPageStateless()) //
-                       || (targetUrl.equals(currentUrl) && 
isRedirectToRender()) //
-                       ) //
-                       || shouldPreserveClientUrl) //
+               else if (isAjax == false && (//
+                                                       getRedirectPolicy() == 
RedirectPolicy.NEVER_REDIRECT //
+                                               || (isOnePassRender() && 
getRedirectPolicy() != RedirectPolicy.ALWAYS_REDIRECT) //
+                                               || 
((targetUrl.equals(currentUrl) && !getPageProvider().isNewPageInstance() && 
!getPage()
+                                                               
.isPageStateless()) //
+                                               || 
(targetUrl.equals(currentUrl) && isRedirectToRender()) //
+                                               ) //
+                               || shouldPreserveClientUrl) //
+               ) //
                {
                        // if the policy is never to redirect
                        // or one pass render mode is on

http://git-wip-us.apache.org/repos/asf/wicket/blob/cc16f8e9/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 5af4df4..005d56b 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
@@ -725,6 +725,63 @@ public class WebPageRendererTest
        }
 
        /**
+        * 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()
+       {
+               PageRenderer renderer = new TestPageRenderer(handler);
+
+               when(urlRenderer.getBaseUrl()).thenReturn(Url.parse("base"));
+
+               
when(requestCycle.mapUrlFor(eq(handler))).thenReturn(Url.parse("base/a"));
+
+               when(request.isAjax()).thenReturn(true);
+
+               when(request.shouldPreserveClientUrl()).thenReturn(true);
+
+               when(provider.isNewPageInstance()).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()
+       {
+               PageRenderer renderer = new TestPageRenderer(handler)
+               {
+                       protected RedirectPolicy getRedirectPolicy()
+                       {
+                               return RedirectPolicy.NEVER_REDIRECT;
+                       }
+               };
+
+               when(urlRenderer.getBaseUrl()).thenReturn(Url.parse("base"));
+
+               
when(requestCycle.mapUrlFor(eq(handler))).thenReturn(Url.parse("base/a"));
+
+               when(request.isAjax()).thenReturn(true);
+
+               when(provider.isNewPageInstance()).thenReturn(true);
+
+               renderer.respond(requestCycle);
+
+               verify(response).sendRedirect(anyString());
+               verify(response, never()).write(any(byte[].class));
+
+       }
+
+       /**
         * Configures common methods which are used by all tests
         */
        private static class TestPageRenderer extends WebPageRenderer

Reply via email to