WICKET-5309 check whether rendering changed page url Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/4ab50643 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/4ab50643 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/4ab50643
Branch: refs/heads/5299-ajax-strategy Commit: 4ab506431371e78ee5d1f5000200c74f89a97a94 Parents: 1c8dc6f Author: svenmeier <s...@meiers.net> Authored: Thu Aug 8 12:25:08 2013 +0200 Committer: svenmeier <s...@meiers.net> Committed: Thu Aug 8 12:25:08 2013 +0200 ---------------------------------------------------------------------- .../request/handler/render/WebPageRenderer.java | 25 ++++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/4ab50643/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 ad39922..b3fb62b 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 @@ -259,17 +259,32 @@ public class WebPageRenderer extends PageRenderer // force creation of possible stateful page to get the final target url getPage(); - Url renderTargetUrl = requestCycle.mapUrlFor(getRenderPageRequestHandler()); + Url beforeRenderUrl = requestCycle.mapUrlFor(getRenderPageRequestHandler()); // redirect to buffer - BufferedWebResponse response = renderPage(renderTargetUrl, requestCycle); + BufferedWebResponse response = renderPage(beforeRenderUrl, requestCycle); if (response == null) { return; } - if (currentUrl.equals(renderTargetUrl)) + // the url might have changed after page has been rendered (e.g. the + // stateless flag might have changed because stateful components + // were added) + final Url afterRenderUrl = requestCycle + .mapUrlFor(getRenderPageRequestHandler()); + + if (beforeRenderUrl.getSegments().equals(afterRenderUrl.getSegments()) == false) + { + // the amount of segments is different - generated relative URLs + // will not work, we need to rerender the page. This can happen + // with IRequestHandlers that produce different URLs with + // different amount of segments for stateless and stateful pages + response = renderPage(afterRenderUrl, requestCycle); + } + + if (currentUrl.equals(afterRenderUrl)) { // no need to redirect when both urls are exactly the same response.writeTo((WebResponse)requestCycle.getResponse()); @@ -289,9 +304,9 @@ public class WebPageRenderer extends PageRenderer } else { - storeBufferedResponse(renderTargetUrl, response); + storeBufferedResponse(afterRenderUrl, response); - redirectTo(renderTargetUrl, requestCycle); + redirectTo(afterRenderUrl, requestCycle); } } }