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


The following commit(s) were added to refs/heads/master by this push:
     new b748e9c  WICKET-6840 prepare components before writing prepend 
JavaScripts
b748e9c is described below

commit b748e9caae4ceebb742ddbdce903e9f90fd6cc63
Author: Sven Meier <[email protected]>
AuthorDate: Wed Oct 14 21:13:17 2020 +0200

    WICKET-6840 prepare components before writing prepend JavaScripts
    
    move AjaxIndicatorAppender JS node removal from renderHead() to 
onConfigure()
---
 .../java/org/apache/wicket/behavior/Behavior.java  |  3 ++
 .../org/apache/wicket/page/PartialPageUpdate.java  | 40 ++++++++++++++--------
 .../ajax/markup/html/AjaxIndicatorAppender.java    | 15 +++++---
 .../ajax/markup/html/AjaxEditableLabelPage.java    |  2 ++
 .../ajax/markup/html/AjaxEditableTest.java         |  5 +++
 5 files changed, 46 insertions(+), 19 deletions(-)

diff --git a/wicket-core/src/main/java/org/apache/wicket/behavior/Behavior.java 
b/wicket-core/src/main/java/org/apache/wicket/behavior/Behavior.java
index 8c02f93..b579f40 100644
--- a/wicket-core/src/main/java/org/apache/wicket/behavior/Behavior.java
+++ b/wicket-core/src/main/java/org/apache/wicket/behavior/Behavior.java
@@ -71,6 +71,9 @@ public abstract class Behavior
 
        /**
         * Called when a component is about to render.
+        * <p>
+        * Note: This method is <em>not</em> called before rendering of the 
component tree
+        * as the similar named method {@link Component#onBeforeRender()}.
         * 
         * @param component
         *            the component that has this behavior coupled
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..fdc5966 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,12 +158,15 @@ 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.
+                       // prepare first so that components can contribute 
prepend JS
+                       // from their onbeforerender methods. 
+                       List<Component> toBeWritten = prepareComponents();
+                       
+                       // prepend javascripts
                        writeEvaluations(response, prependJavaScripts);
 
                        // process added components
-                       writeComponents(response, encoding);
+                       writeComponents(toBeWritten, response, encoding);
 
                        onAfterRespond(response);
 
@@ -242,20 +245,10 @@ public abstract class PartialPageUpdate
                }
        }
 
-
-       /**
-        * Processes components added to the target. This involves attaching 
components, rendering
-        * markup into a client side xml envelope, and detaching them
-        *
-        * @param response
-        *      the response to write to
-        * @param encoding
-        *      the encoding for the response
-        */
-       private void writeComponents(Response response, String encoding)
+       private List<Component> prepareComponents()
        {
                componentsFrozen = true;
-
+               
                List<Component> toBeWritten = new 
ArrayList<>(markupIdToComponent.size());
                
                // delay preparation of feedbacks after all other components
@@ -270,6 +263,23 @@ public abstract class PartialPageUpdate
                        // .. now prepare all postponed feedbacks
                        delay.beforeRender();
                }
+               
+               return toBeWritten;
+       }
+
+       /**
+        * Processes components added to the target. This involves attaching 
components, rendering
+        * markup into a client side xml envelope, and detaching them
+        *
+        * @param response
+        *      the response to write to
+        * @param encoding
+        *      the encoding for the response
+        */
+       private void writeComponents(List<Component> toBeWritten, Response 
response, String encoding)
+       {
+               componentsFrozen = true;
+
 
                // write components
                for (Component component : toBeWritten)
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxIndicatorAppender.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxIndicatorAppender.java
index 770ca19..27b6493 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxIndicatorAppender.java
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxIndicatorAppender.java
@@ -22,6 +22,7 @@ import org.apache.wicket.ajax.IAjaxIndicatorAware;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.page.PartialPageUpdate;
 import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.Response;
 import org.apache.wicket.request.cycle.RequestCycle;
@@ -75,11 +76,18 @@ public class AjaxIndicatorAppender extends Behavior
                this.indicator = indicator;
        }
 
+       /**
+        * Remove a possibly remaining indicator on partial updates of the page,
+        * since a new indicator will be rendered anyways.
+        * <p> 
+        * Note: JavaScripts can not be prepended from {@link 
#beforeRender(Component)}, since
+        * at that time the prepend JavaScripts are already rendered.  
+        * 
+        * @see PartialPageUpdate
+        */
        @Override
-       public void renderHead(final Component component, final IHeaderResponse 
response)
+       public void onConfigure(Component component)
        {
-               super.renderHead(component, response);
-
                
component.getRequestCycle().find(IPartialPageRequestHandler.class).ifPresent(target
 -> {
                        final String javascript = "var e = Wicket.$('" + 
getMarkupId() +
                                "'); if (e != null && typeof(e.parentNode) != 
'undefined') e.parentNode.removeChild(e);";
@@ -88,7 +96,6 @@ public class AjaxIndicatorAppender extends Behavior
                });
        }
 
-
        @Override
        public void afterRender(final Component component)
        {
diff --git 
a/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableLabelPage.java
 
b/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableLabelPage.java
index d4b9227..6913727 100644
--- 
a/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableLabelPage.java
+++ 
b/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableLabelPage.java
@@ -35,7 +35,9 @@ public class AjaxEditableLabelPage extends WebPage
        {
                final AjaxEditableLabel<String> ajaxLabel = new 
AjaxEditableLabel<String>("ajaxLabel",
                        new Model<>("ajaxTest"));
+               ajaxLabel.add(new AjaxIndicatorAppender());
                add(ajaxLabel);
+               
                add(new AjaxLink<Void>("toggle")
                {
                        private static final long serialVersionUID = 1L;
diff --git 
a/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableTest.java
 
b/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableTest.java
index 316201f..a54a8c7 100644
--- 
a/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableTest.java
+++ 
b/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.wicket.extensions.ajax.markup.html;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
@@ -80,6 +81,10 @@ public class AjaxEditableTest extends WicketTestCase
                tester.executeBehavior(editorBehavior);
                tester.assertInvisible("ajaxLabel:editor");
                tester.assertVisible("ajaxLabel:label");
+               
+               // WICKET-6840 prepended JavaScript comes before component 
replacement
+               String response = tester.getLastResponseAsString();
+               assertTrue(response.indexOf("<header-contribution") < 
response.indexOf("<component"), "prepend before component");
        }
 
        /**

Reply via email to