This is an automated email from the ASF dual-hosted git repository. svenmeier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/wicket.git
commit 1ee7b1d3f464651593d1c26aa177ff01aa6765b1 Author: Sven Meier <[email protected]> AuthorDate: Thu Oct 15 17:34:01 2020 +0200 WICKET-6841 reintroduce evaluate and priority-evaluate --- .../wicket/ajax/res/js/wicket-ajax-jquery.js | 26 ++-- .../org/apache/wicket/page/PartialPageUpdate.java | 136 +++++++++++++++++---- .../apache/wicket/page/XmlPartialPageUpdate.java | 69 +++++------ .../apache/wicket/TestDetachPageAjaxResult.html | 4 +- .../AjaxHeaderContributionPage2_ajax_expected.html | 16 +-- .../AjaxHeaderContributionPage_ajax_expected.html | 16 +-- .../ajax/DomReadyOrderPage_ajax_expected.html | 4 +- .../SimpleTestPageExpectedResult-1.html | 4 +- 8 files changed, 183 insertions(+), 92 deletions(-) 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 3ee9f3b..8d351f5 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 @@ -850,20 +850,32 @@ } var steps = context.steps; - var stepIndexOfLastReplacedComponent = -1; - // go through the ajax response and execute all items + // go through the ajax response and process priority evaluations and + // header contributions first for (var i = 0; i < root.childNodes.length; ++i) { - var node = root.childNodes[i]; - - if (node.tagName === "header-contribution") { - this.processHeaderContribution(context, node); - } else if (node.tagName === "component") { + var childNode = root.childNodes[i]; + if (childNode.tagName === "header-contribution") { + this.processHeaderContribution(context, childNode); + } else if (childNode.tagName === "priority-evaluate") { + this.processHeaderContribution(context, childNode); + } + } + + // ... then add components, process remaining evaluations and a + // possible redirect + var stepIndexOfLastReplacedComponent = -1; + for (var c = 0; c < root.childNodes.length; ++c) { + var node = root.childNodes[c]; + + if (node.tagName === "component") { if (stepIndexOfLastReplacedComponent === -1) { this.processFocusedComponentMark(context); } stepIndexOfLastReplacedComponent = steps.length; this.processComponent(context, node); + } else if (node.tagName === "evaluate") { + this.processHeaderContribution(context, node); } else if (node.tagName === "redirect") { this.processRedirect(context, node); } diff --git a/wicket-core/src/main/java/org/apache/wicket/page/PartialPageUpdate.java b/wicket-core/src/main/java/org/apache/wicket/page/PartialPageUpdate.java index ef81182..1712dc8 100644 --- a/wicket-core/src/main/java/org/apache/wicket/page/PartialPageUpdate.java +++ b/wicket-core/src/main/java/org/apache/wicket/page/PartialPageUpdate.java @@ -158,13 +158,13 @@ public abstract class PartialPageUpdate onBeforeRespond(response); - // queue up prepend javascripts. unlike other steps these are executed out of order so that - // components can contribute them from inside their onbeforerender methods. - writeEvaluations(response, prependJavaScripts); - // process added components writeComponents(response, encoding); + // queue up prepend javascripts. unlike other steps these are executed out of order so that + // components can contribute them from during rendering. + writePriorityEvaluations(response, prependJavaScripts); + onAfterRespond(response); // execute the dom ready javascripts as first javascripts @@ -215,33 +215,55 @@ public abstract class PartialPageUpdate * @param scripts * the JavaScripts to evaluate */ - protected void writeEvaluations(final Response response, Collection<CharSequence> scripts) + protected void writePriorityEvaluations(final Response response, Collection<CharSequence> scripts) { if (!scripts.isEmpty()) { - StringBuilder combinedScript = new StringBuilder(1024); - for (CharSequence script : scripts) - { - combinedScript.append("(function(){").append(script).append("})();"); - } - - StringResponse stringResponse = new StringResponse(); - IHeaderResponse decoratedHeaderResponse = Application.get().decorateHeaderResponse(new HeaderResponse() - { - @Override - protected Response getRealResponse() - { - return stringResponse; - } - }); + CharSequence contents = renderScripts(scripts); - decoratedHeaderResponse.render(JavaScriptHeaderItem.forScript(combinedScript, null)); - decoratedHeaderResponse.close(); + writePriorityEvaluation(response, contents); + } + } + + /** + * + * @param response + * the response to write to + * @param scripts + * the JavaScripts to evaluate + */ + protected void writeEvaluations(final Response response, Collection<CharSequence> scripts) + { + if (!scripts.isEmpty()) + { + CharSequence contents = renderScripts(scripts); - writeHeaderContribution(response, stringResponse.getBuffer()); + writeEvaluation(response, contents); } } + private CharSequence renderScripts(Collection<CharSequence> scripts) { + StringBuilder combinedScript = new StringBuilder(1024); + for (CharSequence script : scripts) + { + combinedScript.append("(function(){").append(script).append("})();"); + } + + StringResponse stringResponse = new StringResponse(); + IHeaderResponse decoratedHeaderResponse = Application.get().decorateHeaderResponse(new HeaderResponse() + { + @Override + protected Response getRealResponse() + { + return stringResponse; + } + }); + + decoratedHeaderResponse.render(JavaScriptHeaderItem.forScript(combinedScript, null)); + decoratedHeaderResponse.close(); + + return stringResponse.getBuffer(); + } /** * Processes components added to the target. This involves attaching components, rendering @@ -356,7 +378,39 @@ public abstract class PartialPageUpdate * @param encoding * the encoding for the response */ - protected abstract void writeComponent(Response response, String markupId, Component component, String encoding); + protected void writeComponent(Response response, String markupId, Component component, String encoding) + { + // substitute our encoding response for the old one so we can capture + // component's markup in a manner safe for transport inside CDATA block + Response oldResponse = RequestCycle.get().setResponse(bodyBuffer); + + try + { + // render any associated headers of the component + writeHeaderContribution(response, component); + + bodyBuffer.reset(); + + try + { + component.renderPart(); + } + catch (RuntimeException e) + { + bodyBuffer.reset(); + throw e; + } + } + finally + { + // Restore original response + RequestCycle.get().setResponse(oldResponse); + } + + writeComponent(response, markupId, bodyBuffer.getContents()); + + bodyBuffer.reset(); + } /** * Writes the head part of the response. @@ -370,13 +424,43 @@ public abstract class PartialPageUpdate protected abstract void writeHeader(Response response, String encoding); /** - * Writes header contribution (<link/> or <script/>) to the response. + * Writes a component to the response. + * <p> + * TODO make abstract in Wicket 10 + * + * @param response + * the response to write to + * @param contents + * the contents + */ + protected void writeComponent(Response response, String markupId, CharSequence contents) { + throw new UnsupportedOperationException(); + } + + /** + * TODO make abstract in Wicket 10 + */ + protected void writePriorityEvaluation(Response response, CharSequence contents) { + throw new UnsupportedOperationException(); + } + + /** + * Writes a header contribution to the response. * * @param response * the response to write to + * @param contents + * the contents */ protected abstract void writeHeaderContribution(Response response, CharSequence contents); + /** + * TODO make abstract in Wicket 10 + */ + protected void writeEvaluation(Response response, CharSequence contents) { + throw new UnsupportedOperationException(); + } + @Override public boolean equals(Object o) { @@ -587,6 +671,8 @@ public abstract class PartialPageUpdate requestCycle.setResponse(oldResponse); } + // note: in almost all cases the header will be empty here, + // since all header items will be rendered later on close only writeHeaderContribution(response, headerBuffer.getContents()); headerRendering = false; } diff --git a/wicket-core/src/main/java/org/apache/wicket/page/XmlPartialPageUpdate.java b/wicket-core/src/main/java/org/apache/wicket/page/XmlPartialPageUpdate.java index 20c12d7..9800e34 100644 --- a/wicket-core/src/main/java/org/apache/wicket/page/XmlPartialPageUpdate.java +++ b/wicket-core/src/main/java/org/apache/wicket/page/XmlPartialPageUpdate.java @@ -16,13 +16,9 @@ */ package org.apache.wicket.page; -import java.util.Collection; - import org.apache.wicket.Component; import org.apache.wicket.Page; -import org.apache.wicket.markup.head.JavaScriptHeaderItem; import org.apache.wicket.request.Response; -import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.http.WebResponse; import org.apache.wicket.util.string.Strings; @@ -56,44 +52,25 @@ public class XmlPartialPageUpdate extends PartialPageUpdate response.write("\"?>"); response.write(START_ROOT_ELEMENT); } + + /** + * TODO remove in Wicket 10 + */ + @Override + protected void writeComponent(Response response, String markupId, Component component, + String encoding) + { + super.writeComponent(response, markupId, component, encoding); + } @Override - protected void writeComponent(Response response, String markupId, Component component, String encoding) + protected void writeComponent(Response response, String markupId, CharSequence contents) { - // substitute our encoding response for the old one so we can capture - // component's markup in a manner safe for transport inside CDATA block - Response oldResponse = RequestCycle.get().setResponse(bodyBuffer); - - try - { - // render any associated headers of the component - writeHeaderContribution(response, component); - - bodyBuffer.reset(); - - try - { - component.renderPart(); - } - catch (RuntimeException e) - { - bodyBuffer.reset(); - throw e; - } - } - finally - { - // Restore original response - RequestCycle.get().setResponse(oldResponse); - } - response.write("<component id=\""); response.write(markupId); response.write("\" ><![CDATA["); - response.write(encode(bodyBuffer.getContents())); + response.write(encode(contents)); response.write("]]></component>"); - - bodyBuffer.reset(); } @Override @@ -103,18 +80,34 @@ public class XmlPartialPageUpdate extends PartialPageUpdate } @Override + protected void writePriorityEvaluation(Response response, CharSequence contents) + { + writeHeaderContribution(response, "priority-evaluate", contents); + } + + @Override protected void writeHeaderContribution(Response response, CharSequence contents) { + writeHeaderContribution(response, "header-contribution", contents); + } + + @Override + protected void writeEvaluation(Response response, CharSequence contents) + { + writeHeaderContribution(response, "evaluate", contents); + } + + private void writeHeaderContribution(Response response, String elementName, CharSequence contents) + { if (Strings.isEmpty(contents) == false) { - response.write("<header-contribution>"); + response.write("<" + elementName + ">"); // we need to write response as CDATA and parse it on client, - // because konqueror crashes when there is a <script> element response.write("<![CDATA[<head xmlns:wicket=\"http://wicket.apache.org\">"); response.write(encode(contents)); response.write("</head>]]>"); - response.write("</header-contribution>"); + response.write("</" + elementName + ">"); } } diff --git a/wicket-core/src/test/java/org/apache/wicket/TestDetachPageAjaxResult.html b/wicket-core/src/test/java/org/apache/wicket/TestDetachPageAjaxResult.html index 089b01f..0208876 100644 --- a/wicket-core/src/test/java/org/apache/wicket/TestDetachPageAjaxResult.html +++ b/wicket-core/src/test/java/org/apache/wicket/TestDetachPageAjaxResult.html @@ -10,9 +10,9 @@ Wicket.Log.enabled=true; Wicket.Ajax.baseUrl="wicket/bookmarkable/org.apache.wicket.TestDetachPage?0-1.0-comp"; /*]]]]><![CDATA[>*/ </script> -</head>]]></header-contribution><header-contribution><![CDATA[<head xmlns:wicket="http://wicket.apache.org"><script type="text/javascript"> +</head>]]></header-contribution><evaluate><![CDATA[<head xmlns:wicket="http://wicket.apache.org"><script type="text/javascript"> /*<![CDATA[*/ (function(){Wicket.Ajax.ajax({"u":"./org.apache.wicket.TestDetachPage?0-1.0-comp","c":"comp1","e":"click"});})(); /*]]]]><![CDATA[>*/ </script> -</head>]]></header-contribution></ajax-response> \ No newline at end of file +</head>]]></evaluate></ajax-response> \ No newline at end of file diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxHeaderContributionPage2_ajax_expected.html b/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxHeaderContributionPage2_ajax_expected.html index 5980897..dc63188 100644 --- a/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxHeaderContributionPage2_ajax_expected.html +++ b/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxHeaderContributionPage2_ajax_expected.html @@ -1,9 +1,4 @@ -<?xml version="1.0" encoding="UTF-8"?><ajax-response><header-contribution><![CDATA[<head xmlns:wicket="http://wicket.apache.org"><script type="text/javascript"> -/*<![CDATA[*/ -(function(){prepend();})(); -/*]]]]><![CDATA[>*/ -</script> -</head>]]></header-contribution><component id="test12" ><![CDATA[<span wicket:id="test1" id="test12"><wicket:panel> +<?xml version="1.0" encoding="UTF-8"?><ajax-response><component id="test12" ><![CDATA[<span wicket:id="test1" id="test12"><wicket:panel> test </wicket:panel></span>]]></component><component id="test23" ><![CDATA[<span wicket:id="test2" id="test23"><wicket:panel> test @@ -23,9 +18,14 @@ test <link href="../../test2"/> <script type="text/javascript" src="../../javascripturlB"></script> -</head>]]></header-contribution><header-contribution><![CDATA[<head xmlns:wicket="http://wicket.apache.org"><script type="text/javascript"> +</head>]]></header-contribution><priority-evaluate><![CDATA[<head xmlns:wicket="http://wicket.apache.org"><script type="text/javascript"> +/*<![CDATA[*/ +(function(){prepend();})(); +/*]]]]><![CDATA[>*/ +</script> +</head>]]></priority-evaluate><evaluate><![CDATA[<head xmlns:wicket="http://wicket.apache.org"><script type="text/javascript"> /*<![CDATA[*/ (function(){domReady();})();(function(){domReadyB();})();(function(){append();})();(function(){onLoad();})();(function(){onLoadB();})(); /*]]]]><![CDATA[>*/ </script> -</head>]]></header-contribution></ajax-response> \ No newline at end of file +</head>]]></evaluate></ajax-response> \ No newline at end of file diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxHeaderContributionPage_ajax_expected.html b/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxHeaderContributionPage_ajax_expected.html index 7b001ed..88f0b06 100644 --- a/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxHeaderContributionPage_ajax_expected.html +++ b/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxHeaderContributionPage_ajax_expected.html @@ -1,9 +1,4 @@ -<?xml version="1.0" encoding="UTF-8"?><ajax-response><header-contribution><![CDATA[<head xmlns:wicket="http://wicket.apache.org"><script type="text/javascript"> -/*<![CDATA[*/ -(function(){prepend();})(); -/*]]]]><![CDATA[>*/ -</script> -</head>]]></header-contribution><component id="test12" ><![CDATA[<span wicket:id="test1" id="test12"><wicket:panel> +<?xml version="1.0" encoding="UTF-8"?><ajax-response><component id="test12" ><![CDATA[<span wicket:id="test1" id="test12"><wicket:panel> test </wicket:panel></span>]]></component><component id="test23" ><![CDATA[<span wicket:id="test2" id="test23"><wicket:panel> test @@ -14,9 +9,14 @@ test <script type="text/javascript" src="../../javascripturl"></script> <script type="text/javascript" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-3.5.1.js"></script> <script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery.js"></script> -</head>]]></header-contribution><header-contribution><![CDATA[<head xmlns:wicket="http://wicket.apache.org"><script type="text/javascript"> +</head>]]></header-contribution><priority-evaluate><![CDATA[<head xmlns:wicket="http://wicket.apache.org"><script type="text/javascript"> +/*<![CDATA[*/ +(function(){prepend();})(); +/*]]]]><![CDATA[>*/ +</script> +</head>]]></priority-evaluate><evaluate><![CDATA[<head xmlns:wicket="http://wicket.apache.org"><script type="text/javascript"> /*<![CDATA[*/ (function(){domReady();})();(function(){append();})();(function(){onLoad();})(); /*]]]]><![CDATA[>*/ </script> -</head>]]></header-contribution></ajax-response> \ No newline at end of file +</head>]]></evaluate></ajax-response> \ No newline at end of file diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/DomReadyOrderPage_ajax_expected.html b/wicket-core/src/test/java/org/apache/wicket/ajax/DomReadyOrderPage_ajax_expected.html index b7568d8..b6b4e4b 100644 --- a/wicket-core/src/test/java/org/apache/wicket/ajax/DomReadyOrderPage_ajax_expected.html +++ b/wicket-core/src/test/java/org/apache/wicket/ajax/DomReadyOrderPage_ajax_expected.html @@ -10,9 +10,9 @@ Wicket.Log.enabled=true; Wicket.Ajax.baseUrl="wicket/bookmarkable/org.apache.wicket.ajax.DomReadyOrderPage?0-1.0-test"; /*]]]]><![CDATA[>*/ </script> -</head>]]></header-contribution><header-contribution><![CDATA[<head xmlns:wicket="http://wicket.apache.org"><script type="text/javascript"> +</head>]]></header-contribution><evaluate><![CDATA[<head xmlns:wicket="http://wicket.apache.org"><script type="text/javascript"> /*<![CDATA[*/ (function(){Wicket.Ajax.ajax({"u":"./org.apache.wicket.ajax.DomReadyOrderPage?0-1.0-test","c":"test1","e":"click","pd":true});})();(function(){test1();})();(function(){test2();})(); /*]]]]><![CDATA[>*/ </script> -</head>]]></header-contribution></ajax-response> \ No newline at end of file +</head>]]></evaluate></ajax-response> \ No newline at end of file diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult-1.html b/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult-1.html index c36c3a9..f3aec6d 100644 --- a/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult-1.html +++ b/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult-1.html @@ -10,9 +10,9 @@ Wicket.Log.enabled=true; Wicket.Ajax.baseUrl="wicket/bookmarkable/org.apache.wicket.ajax.markup.html.componentMap.SimpleTestPage?0-1.0-testPanel-baseSpan-linja1"; /*]]]]><![CDATA[>*/ </script> -</head>]]></header-contribution><header-contribution><![CDATA[<head xmlns:wicket="http://wicket.apache.org"><script type="text/javascript"> +</head>]]></header-contribution><evaluate><![CDATA[<head xmlns:wicket="http://wicket.apache.org"><script type="text/javascript"> /*<![CDATA[*/ (function(){Wicket.Timer.set('linja11.0', function(){Wicket.Ajax.ajax({"u":"./org.apache.wicket.ajax.markup.html.componentMap.SimpleTestPage?0-1.0-testPanel-baseSpan-linja1","c":"linja11"});}, 2000);})(); /*]]]]><![CDATA[>*/ </script> -</head>]]></header-contribution></ajax-response> \ No newline at end of file +</head>]]></evaluate></ajax-response> \ No newline at end of file
