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 (&lt;link/&gt; or &lt;script/&gt;) 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

Reply via email to