WICKET-4312 Do not strip the jsessionid from the url for resources
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/ec00704c Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/ec00704c Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/ec00704c Branch: refs/heads/master Commit: ec00704cca20fe1d4c1f32e4ab859a2b173d297d Parents: 95ed055 Author: martin-g <[email protected]> Authored: Thu Dec 22 16:09:13 2011 +0200 Committer: martin-g <[email protected]> Committed: Thu Dec 22 16:09:13 2011 +0200 ---------------------------------------------------------------------- .../src/main/java/org/apache/wicket/Component.java | 5 +- .../wicket/ajax/res/js/wicket-ajax-jquery.js | 44 +++- .../resource/header/JavaScriptHeaderItem.java | 4 +- .../markup/html/internal/HeaderResponseTest.java | 16 + wicket-core/src/test/js/all.html | 220 +++++++------- wicket-core/src/test/js/head.js | 19 ++- 6 files changed, 191 insertions(+), 117 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/ec00704c/wicket-core/src/main/java/org/apache/wicket/Component.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/Component.java b/wicket-core/src/main/java/org/apache/wicket/Component.java index ebadba2..2f575f4 100644 --- a/wicket-core/src/main/java/org/apache/wicket/Component.java +++ b/wicket-core/src/main/java/org/apache/wicket/Component.java @@ -2681,7 +2681,10 @@ public abstract class Component // Make sure the markup source strategy contributes to the header first // to be backward compatible. WICKET-3761 getMarkupSourcingStrategy().renderHead(this, container); - response.render(StringHeaderItem.forString(markupHeaderResponse.getBuffer())); + CharSequence headerContribution = markupHeaderResponse.getBuffer(); + if (Strings.isEmpty(headerContribution) == false) { + response.render(StringHeaderItem.forString(headerContribution)); + } } finally { http://git-wip-us.apache.org/repos/asf/wicket/blob/ec00704c/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js index 1679fd1..dde8df6 100644 --- a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js +++ b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js @@ -1759,7 +1759,7 @@ // is an element in head that is of same type as myElement, and whose src // attribute is same as myElement.src. containsElement: function (element, mandatoryAttribute) { - var attr = element.getAttribute(mandatoryAttribute); + var attr = Wicket.Head._stripJSessionId(element.getAttribute(mandatoryAttribute)); if (isUndef(attr) || attr === "") { return false; } @@ -1780,8 +1780,9 @@ // this is necessary for filtering script references if (node.tagName.toLowerCase() === element.tagName.toLowerCase()) { - var loadedUrl = node.getAttribute(mandatoryAttribute); - var loadedUrl_ = node.getAttribute(mandatoryAttribute+"_"); + var loadedUrl = Wicket.Head._stripJSessionId(node.getAttribute(mandatoryAttribute)); + var loadedUrl_ = Wicket.Head._stripJSessionId( + node.getAttribute(mandatoryAttribute+"_")); if (loadedUrl === attr || loadedUrl_ === attr) { return true; } @@ -1790,6 +1791,43 @@ return false; }, + /** + * Removes the optional ';jsessionid=...' from the passed url + * + * @param {String} url the url to strip the jsessionid from + * @return {String} the url without the jsessionid and its value + */ + // WICKET-3596, WICKET-4312 + _stripJSessionId: function (url) { + if (url == null) + { + return null; + } + + // http://.../abc;jsessionid=...?param=... + var ixSemiColon = url.indexOf(";"); + if (ixSemiColon == -1) + { + return url; + } + + var ixQuestionMark = url.indexOf("?"); + if (ixQuestionMark == -1) + { + // no query paramaters; cut off at ";" + // http://.../abc;jsession=... + return url.substring(0, ixSemiColon); + } + + if (ixQuestionMark <= ixSemiColon) + { + // ? is before ; - no jsessionid in the url + return url; + } + + return url.substring(0, ixSemiColon) + url.substring(ixQuestionMark); + }, + // Adds a javascript element to page header. // The fakeSrc attribute is used to filter out duplicate javascript references. // External javascripts are loaded using xmlhttprequest. Then a javascript element is created and the http://git-wip-us.apache.org/repos/asf/wicket/blob/ec00704c/wicket-core/src/main/java/org/apache/wicket/resource/header/JavaScriptHeaderItem.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/resource/header/JavaScriptHeaderItem.java b/wicket-core/src/main/java/org/apache/wicket/resource/header/JavaScriptHeaderItem.java index ec2a542..7777303 100644 --- a/wicket-core/src/main/java/org/apache/wicket/resource/header/JavaScriptHeaderItem.java +++ b/wicket-core/src/main/java/org/apache/wicket/resource/header/JavaScriptHeaderItem.java @@ -207,7 +207,7 @@ public abstract class JavaScriptHeaderItem extends HeaderItem { throw new IllegalArgumentException("url cannot be empty or null"); } - String urlWoSessionId = Strings.stripJSessionId(url); - JavaScriptUtils.writeJavaScriptUrl(response, urlWoSessionId, id, defer, charset); + + JavaScriptUtils.writeJavaScriptUrl(response, url, id, defer, charset); } } http://git-wip-us.apache.org/repos/asf/wicket/blob/ec00704c/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java index 1a9cdbe..89b95af 100644 --- a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java @@ -36,6 +36,7 @@ import org.apache.wicket.request.resource.ResourceReference; import org.apache.wicket.resource.header.CssHeaderItem; import org.apache.wicket.resource.header.JavaScriptHeaderItem; import org.apache.wicket.response.StringResponse; +import org.apache.wicket.util.tester.WicketTester; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -192,4 +193,19 @@ public class HeaderResponseTest Assert.assertEquals(expected, actual); } + /** + * https://issues.apache.org/jira/browse/WICKET-4312 + */ + @Test + public void preserveJSessionId() { + WicketTester tester = new WicketTester(); + try { + headerResponse.render(JavaScriptHeaderItem.forUrl("js-resource.js;jsessionid=1h402r54r4xuep32znicouftm", "some-id", false, null)); + String expected = "<script type=\"text/javascript\" id=\"some-id\" src=\"js-resource.js;jsessionid=1h402r54r4xuep32znicouftm\"></script>\n"; + String actual = headerResponse.getResponse().toString(); + Assert.assertEquals(expected, actual); + } finally { + tester.destroy(); + } + } } http://git-wip-us.apache.org/repos/asf/wicket/blob/ec00704c/wicket-core/src/test/js/all.html ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/js/all.html b/wicket-core/src/test/js/all.html index a536b0a..8008554 100644 --- a/wicket-core/src/test/js/all.html +++ b/wicket-core/src/test/js/all.html @@ -18,152 +18,152 @@ <!DOCTYPE html> <html> <head> - <title id="titleId">All tests</title> - <link rel="stylesheet" href="qunit/qunit.css" type="text/css" media="screen" /> - <script src="../../main/java/org/apache/wicket/ajax/res/js/jquery/jquery.js"></script> - <script src="../../main/java/org/apache/wicket/ajax/res/js/wicket-event-jquery.js"></script> - <script src="../../main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js"></script> - <script src="../../main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery-debug.js"></script> - <script type="text/javascript" src="qunit/qunit.js"></script> - - <!-- the module under test --> - <script type="text/javascript" src="ajax.js"></script> - <script type="text/javascript" src="dom.js"></script> - <script type="text/javascript" src="event.js"></script> - <script type="text/javascript" src="form.js"></script> - <script type="text/javascript" src="head.js"></script> - <script type="text/javascript" src="channels.js"></script> + <title id="titleId">All tests</title> + <link rel="stylesheet" href="qunit/qunit.css" type="text/css" media="screen" /> + <script src="../../main/java/org/apache/wicket/resource/jquery/jquery.js"></script> + <script src="../../main/java/org/apache/wicket/ajax/res/js/wicket-event-jquery.js"></script> + <script src="../../main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js"></script> + <script src="../../main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery-debug.js"></script> + <script type="text/javascript" src="qunit/qunit.js"></script> + + <!-- the module under test --> + <script type="text/javascript" src="ajax.js"></script> + <script type="text/javascript" src="dom.js"></script> + <script type="text/javascript" src="event.js"></script> + <script type="text/javascript" src="form.js"></script> + <script type="text/javascript" src="head.js"></script> + <script type="text/javascript" src="channels.js"></script> </head> <body> - <h1 id="qunit-header">Wicket Ajax tests</h1> - <h2 id="qunit-banner"></h2> - <div id="qunit-testrunner-toolbar"></div> - <h2 id="qunit-userAgent"></h2> - <ol id="qunit-tests"></ol> - <div id="qunit-fixture"> + <h1 id="qunit-header">Wicket Ajax tests</h1> + <h2 id="qunit-banner"></h2> + <div id="qunit-testrunner-toolbar"></div> + <h2 id="qunit-userAgent"></h2> + <ol id="qunit-tests"></ol> + <div id="qunit-fixture"> - test markup, will be hidden + test markup, will be hidden - <!-- - AJAX - --> - <textarea id="evaluationId"><ajax-response><evaluate>ok(true, 'Evaluation must be executed!');</evaluate></ajax-response></textarea> + <!-- + AJAX + --> + <textarea id="evaluationId"><ajax-response><evaluate>ok(true, 'Evaluation must be executed!');</evaluate></ajax-response></textarea> - <textarea id="priorityEvaluationId"><ajax-response><priority-evaluate>ok(true, 'Priority Evaluation must be executed!');</priority-evaluate></ajax-response></textarea> + <textarea id="priorityEvaluationId"><ajax-response><priority-evaluate>ok(true, 'Priority Evaluation must be executed!');</priority-evaluate></ajax-response></textarea> - <!-- - Executes the second part of 'something|functionBody' by passing 'notify' function as parameter - --> - <textarea id="evaluationIdentifierAndCodeId"><ajax-response><evaluate>ignored|start(); ok(true, 'Evaluation with identifier must be executed!'); arguments[0]();</evaluate></ajax-response></textarea> + <!-- + Executes the second part of 'something|functionBody' by passing 'notify' function as parameter + --> + <textarea id="evaluationIdentifierAndCodeId"><ajax-response><evaluate>ignored|start(); ok(true, 'Evaluation with identifier must be executed!'); arguments[0]();</evaluate></ajax-response></textarea> - <div id="componentToReplace">old body</div> + <div id="componentToReplace">old body</div> - <textarea id="componentId"><ajax-response><component id="componentToReplace"><![CDATA[<span id="componentToReplace">new body</span>]]></component></ajax-response></textarea> + <textarea id="componentId"><ajax-response><component id="componentToReplace"><![CDATA[<span id="componentToReplace">new body</span>]]></component></ajax-response></textarea> - <textarea id="componentDoesNotExistsId"><ajax-response><component id="componentToReplaceDoesNotExist"><![CDATA[<span id="componentToReplaceDoesNotExist">new body</span>]]></component></ajax-response></textarea> + <textarea id="componentDoesNotExistsId"><ajax-response><component id="componentToReplaceDoesNotExist"><![CDATA[<span id="componentToReplaceDoesNotExist">new body</span>]]></component></ajax-response></textarea> - <textarea id="complexComponentId"><ajax-response><component id="componentToReplace"><![CDATA[ + <textarea id="complexComponentId"><ajax-response><component id="componentToReplace"><![CDATA[ - <table id="componentToReplace"> - <thead> - <tr> - <th><div><script>start(); ok(true, 'script in thead > td has to be executed')</script></div> - </th> - <th>header 2</th> - </tr> - </thead> - <tbody> - <tr> - <td>data 1 + <table id="componentToReplace"> + <thead> + <tr> + <th><div><script>start(); ok(true, 'script in thead > td has to be executed')</script></div> + </th> + <th>header 2</th> + </tr> + </thead> + <tbody> + <tr> + <td>data 1 <script>start(); ok(true, 'script in tbody > td has to be executed')</script> - </td> - <td>data 2</td> - </tr> - </tbody> - <tfoot> - <tr> - <td>footer 1</td> - <td>footer 2 - <script>start(); ok(true, 'script in tfoot > td has to be executed')</script> - </td> - </tr> - </tfoot> - </table> + </td> + <td>data 2</td> + </tr> + </tbody> + <tfoot> + <tr> + <td>footer 1</td> + <td>footer 2 + <script>start(); ok(true, 'script in tfoot > td has to be executed')</script> + </td> + </tr> + </tfoot> + </table> - ]]></component></ajax-response></textarea> + ]]></component></ajax-response></textarea> - <textarea id="componentToReplaceTitle"> - <ajax-response><component id="titleId"><![CDATA[<title id="titleId">new title</title>]]></component></ajax-response> - </textarea> + <textarea id="componentToReplaceTitle"> + <ajax-response><component id="titleId"><![CDATA[<title id="titleId">new title</title>]]></component></ajax-response> + </textarea> - <!-- - DOM - --> - <span id="testElement"></span> + <!-- + DOM + --> + <span id="testElement"></span> - <div id="complexElement"> - <a href="some/url">Link</a> - </div> + <div id="complexElement"> + <a href="some/url">Link</a> + </div> - <iframe id="testInDocIFrame"></iframe> + <iframe id="testInDocIFrame"></iframe> - <span id="toBeReplacedByTable"></span> - <span id="toBeReplacedByScript"></span> - <span id="toBeReplacedByDivWithChildren"></span> + <span id="toBeReplacedByTable"></span> + <span id="toBeReplacedByScript"></span> + <span id="toBeReplacedByDivWithChildren"></span> - <!-- - Event - --> - <span id="specifiedId" class="getIdClass1"></span> - <span class="getIdClass2"></span> + <!-- + Event + --> + <span id="specifiedId" class="getIdClass1"></span> + <span class="getIdClass2"></span> - <!-- - Form - --> - <form id="testForm" action="actionUrl"> + <!-- + Form + --> + <form id="testForm" action="actionUrl"> - <input type="text" id="textInputId" name="textInput" value="textValue"/> + <input type="text" id="textInputId" name="textInput" value="textValue"/> - <input type="text" id="textInputUTFId" name="textUTFInput" value="неÑо на бÑлгаÑÑки"/> + <input type="text" id="textInputUTFId" name="textUTFInput" value="неÑо на бÑлгаÑÑки"/> - <input type="checkbox" name="checkBoxInput1" checked="checked" value="cbValue1"/> - <input type="checkbox" name="checkBoxInput2" value="cbValue2"/> - <input type="checkbox" name="checkBoxInput3" checked="checked" value="cbValue3"/> + <input type="checkbox" name="checkBoxInput1" checked="checked" value="cbValue1"/> + <input type="checkbox" name="checkBoxInput2" value="cbValue2"/> + <input type="checkbox" name="checkBoxInput3" checked="checked" value="cbValue3"/> - <input type="radio" name="radioInput" checked="checked" value="radioValue1"/> - <input type="radio" name="radioInput" value="radioValue2"/> + <input type="radio" name="radioInput" checked="checked" value="radioValue1"/> + <input type="radio" name="radioInput" value="radioValue2"/> - <input type="email" id="emailInputId" name="emailInput" value="[email protected]"/> + <input type="email" id="emailInputId" name="emailInput" value="[email protected]"/> - <input type="url" id="urlInputId" name="urlInput" value="http://example.com"/> + <input type="url" id="urlInputId" name="urlInput" value="http://example.com"/> - <input type="search" id="searchInputId" name="searchInput" value="wicket"/> + <input type="search" id="searchInputId" name="searchInput" value="wicket"/> - <input type="range" id="rangeInputId" name="rangeInput" min="0" max="100" value="67"/> + <input type="range" id="rangeInputId" name="rangeInput" min="0" max="100" value="67"/> - <input type="number" id="numberInputId" name="numberInput" min="0" max="100" value="16"/> + <input type="number" id="numberInputId" name="numberInput" min="0" max="100" value="16"/> - <input type="color" id="colorInputId" name="colorInput" value="123456"/> + <input type="color" id="colorInputId" name="colorInput" value="123456"/> - <select id="multipleSelectId" name="multipleSelect" multiple="multiple"> - <option value="0" selected="selected">zero</option> - <option value="1">one</option> - <option value="2" selected="selected">two</option> - </select> + <select id="multipleSelectId" name="multipleSelect" multiple="multiple"> + <option value="0" selected="selected">zero</option> + <option value="1">one</option> + <option value="2" selected="selected">two</option> + </select> - <select id="selectId" name="select"> - <option value="0" selected="selected">zero</option> - <option value="1">one</option> - <option value="2">two</option> - </select> + <select id="selectId" name="select"> + <option value="0" selected="selected">zero</option> + <option value="1">one</option> + <option value="2">two</option> + </select> - <textarea name="textArea">some text</textarea> + <textarea name="textArea">some text</textarea> - </form> + </form> - - </div> + + </div> </body> </html> http://git-wip-us.apache.org/repos/asf/wicket/blob/ec00704c/wicket-core/src/test/js/head.js ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/js/head.js b/wicket-core/src/test/js/head.js index ccb8496..3b1794b 100644 --- a/wicket-core/src/test/js/head.js +++ b/wicket-core/src/test/js/head.js @@ -88,7 +88,7 @@ jQuery(document).ready(function() { scriptElement.src = "../../main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery-debug.js"; ok(Wicket.Head.containsElement(scriptElement, 'src'), 'There should be an element for wicket-ajax-debug.js'); }); - + test('Wicket.Head.containsElement - check existence of data/test.js with "src_"', function() { var $script = jQuery('<script>', { type: 'text/javascript', @@ -103,6 +103,23 @@ jQuery(document).ready(function() { ok(Wicket.Head.containsElement(script, 'src'), 'There should be an element for wicket-ajax-debug.js'); }); + test('Wicket.Head.containsElement - check existence of data/test.js with jsessionid in the url', function() { + var + script1 = jQuery('<script>', { + type: 'text/javascript', + src: 'data/test.js;jsessionid=1' + })[0], + script2 = jQuery('<script>', { + type: 'text/javascript', + src: 'data/test.js;jsessionid=2' // different jsessionid + })[0]; + + // add just jsessionid=1 + Wicket.Head.addElement(script1); + + ok(Wicket.Head.containsElement(script2, 'src'), 'The jsessionid part of the URL must be ignored.'); + }); + module('addJavascript'); test('Wicket.Head.addJavascript - add script with text content', function() {
