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/15 20:48:43 UTC

[wicket] branch master updated (b748e9c -> 1ee7b1d)

This is an automated email from the ASF dual-hosted git repository.

svenmeier pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/wicket.git.


    from b748e9c  WICKET-6840 prepare components before writing prepend JavaScripts
     new 140fdd7  Revert "WICKET-6840 prepare components before writing prepend JavaScripts"
     new 3d5e1de  enable clirr
     new 1ee7b1d  WICKET-6841 reintroduce evaluate and priority-evaluate

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 pom.xml                                            |   2 -
 .../wicket/ajax/res/js/wicket-ajax-jquery.js       |  26 +++-
 .../java/org/apache/wicket/behavior/Behavior.java  |   3 -
 .../org/apache/wicket/page/PartialPageUpdate.java  | 170 +++++++++++++++------
 .../apache/wicket/page/XmlPartialPageUpdate.java   |  69 ++++-----
 .../http/CsrfPreventionRequestCycleListener.java   |  11 ++
 .../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 +-
 .../ajax/markup/html/AjaxIndicatorAppender.java    |  15 +-
 .../ajax/markup/html/AjaxEditableLabelPage.java    |   2 -
 .../ajax/markup/html/AjaxEditableTest.java         |   5 -
 14 files changed, 210 insertions(+), 137 deletions(-)


[wicket] 01/03: Revert "WICKET-6840 prepare components before writing prepend JavaScripts"

Posted by sv...@apache.org.
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 140fdd7fceff49f18b5e85b696002b6cbca6e7f3
Author: Sven Meier <sv...@apache.org>
AuthorDate: Thu Oct 15 12:53:53 2020 +0200

    Revert "WICKET-6840 prepare components before writing prepend JavaScripts"
    
    This reverts commit b748e9caae4ceebb742ddbdce903e9f90fd6cc63.
---
 .../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, 19 insertions(+), 46 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 b579f40..8c02f93 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,9 +71,6 @@ 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 fdc5966..ef81182 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,15 +158,12 @@ public abstract class PartialPageUpdate
 
 			onBeforeRespond(response);
 
-			// prepare first so that components can contribute prepend JS
-			// from their onbeforerender methods. 
-			List<Component> toBeWritten = prepareComponents();
-			
-			// prepend javascripts
+			// 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(toBeWritten, response, encoding);
+			writeComponents(response, encoding);
 
 			onAfterRespond(response);
 
@@ -245,10 +242,20 @@ public abstract class PartialPageUpdate
 		}
 	}
 
-	private List<Component> prepareComponents()
+
+	/**
+	 * 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)
 	{
 		componentsFrozen = true;
-		
+
 		List<Component> toBeWritten = new ArrayList<>(markupIdToComponent.size());
 		
 		// delay preparation of feedbacks after all other components
@@ -263,23 +270,6 @@ 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 27b6493..770ca19 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,7 +22,6 @@ 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;
@@ -76,18 +75,11 @@ 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 onConfigure(Component component)
+	public void renderHead(final Component component, final IHeaderResponse response)
 	{
+		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);";
@@ -96,6 +88,7 @@ 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 6913727..d4b9227 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,9 +35,7 @@ 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 a54a8c7..316201f 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,7 +16,6 @@
  */
 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;
 
@@ -81,10 +80,6 @@ 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");
 	}
 
 	/**


[wicket] 02/03: enable clirr

Posted by sv...@apache.org.
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 3d5e1de250d96e2307964ca6a4f2b6cec211f7d8
Author: Sven Meier <sv...@apache.org>
AuthorDate: Thu Oct 15 21:15:47 2020 +0200

    enable clirr
    
    readded overriden CsrfPreventionRequestCycleListener#addAcceptedOrigin
---
 pom.xml                                                       |  2 --
 .../protocol/http/CsrfPreventionRequestCycleListener.java     | 11 +++++++++++
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/pom.xml b/pom.xml
index c014b46..89f88e0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1133,8 +1133,6 @@
 						<comparisonVersion>9.0.0</comparisonVersion>
 						<failOnError>true</failOnError>
 						<logResults>true</logResults>
-						<!-- Disable until Wicket 9.0.0 -->
-						<skip>true</skip>
 					</configuration>
 					<executions>
 						<execution>
diff --git a/wicket-core/src/main/java/org/apache/wicket/protocol/http/CsrfPreventionRequestCycleListener.java b/wicket-core/src/main/java/org/apache/wicket/protocol/http/CsrfPreventionRequestCycleListener.java
index a259fb1..f8a7c28 100644
--- a/wicket-core/src/main/java/org/apache/wicket/protocol/http/CsrfPreventionRequestCycleListener.java
+++ b/wicket-core/src/main/java/org/apache/wicket/protocol/http/CsrfPreventionRequestCycleListener.java
@@ -169,6 +169,17 @@ public class CsrfPreventionRequestCycleListener extends OriginResourceIsolationP
 	private String errorMessage = "Origin does not correspond to request";
 
 	/**
+	 * TODO remove in Wicket 10
+	 */
+	@Override
+	public CsrfPreventionRequestCycleListener addAcceptedOrigin(String acceptedOrigin)
+	{
+		super.addAcceptedOrigin(acceptedOrigin);
+		
+		return this;
+	}
+
+	/**
 	 * Sets the action when no Origin header is present in the request. Default {@code ALLOW}.
 	 *
 	 * @param action


[wicket] 03/03: WICKET-6841 reintroduce evaluate and priority-evaluate

Posted by sv...@apache.org.
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 <sv...@apache.org>
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