You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2020/10/14 20:32:06 UTC
[wicket] branch master updated: WICKET-6840 prepare components
before writing prepend JavaScripts
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 <sv...@apache.org>
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");
}
/**