From a529aadafdaf7b32e909bbf90fe32822e841877f Mon Sep 17 00:00:00 2001 From: Maxim Solodovnik Date: Sun, 2 Dec 2018 15:09:37 +0700 Subject: [PATCH 1/2] [WICKET-6617] headers are added to header-items if specified --- .../wicket/ajax/res/js/wicket-ajax-jquery.js | 11 +++-- .../html/internal/HtmlHeaderContainer.java | 46 +++++++++---------- .../internal/HtmlHeaderItemsContainer.java | 9 ++++ 3 files changed, 40 insertions(+), 26 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 8370208dcae..b93a98b81ad 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 @@ -2116,10 +2116,15 @@ // Adds the element to page head addElement: function (element) { - var head = document.getElementsByTagName("head"); + var headItems = document.querySelector('head meta[name="wicket.header.items"]'); + if (headItems) { + headItems.parentNode.insertBefore(element, headItems); + } else { + var head = document.querySelector("head"); - if (head[0]) { - head[0].appendChild(element); + if (head) { + head.appendChild(element); + } } }, diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderContainer.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderContainer.java index e906560db62..99138e48b6e 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderContainer.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderContainer.java @@ -66,7 +66,7 @@ *
  • <wicket:head> and it's content is copied to the output. Components contained in * <wicket:head> are rendered as usual
  • * - * + * * @author Juergen Donnerstag */ public class HtmlHeaderContainer extends TransparentWebMarkupContainer @@ -89,7 +89,7 @@ public class HtmlHeaderContainer extends TransparentWebMarkupContainer /** * Combines the {@link MarkupStream} with the open tag, together representing the header section * in the markup. - * + * * @author papegaaij */ public static class HeaderStreamState @@ -122,7 +122,7 @@ public ComponentTag getOpenTag() /** * Construct - * + * * @see Component#Component(String) */ public HtmlHeaderContainer(final String id) @@ -161,19 +161,19 @@ public final void onComponentTagBody(MarkupStream markupStream, ComponentTag ope final StringResponse response = new StringResponse(); getRequestCycle().setResponse(response); - IHeaderResponse headerResponse = getHeaderResponse(); - if (!response.equals(headerResponse.getResponse())) - { - getRequestCycle().setResponse(headerResponse.getResponse()); - } + try (IHeaderResponse headerResponse = getHeaderResponse()) { + if (!response.equals(headerResponse.getResponse())) + { + getRequestCycle().setResponse(headerResponse.getResponse()); + } - // Render the header sections of all components on the page - AbstractHeaderRenderStrategy.get().renderHeader(this, - new HeaderStreamState(markupStream, openTag), getPage()); + // Render the header sections of all components on the page + AbstractHeaderRenderStrategy.get().renderHeader(this, + new HeaderStreamState(markupStream, openTag), getPage()); - // Close the header response before rendering the header container itself - // See https://issues.apache.org/jira/browse/WICKET-3728 - headerResponse.close(); + // Close the header response before rendering the header container itself + // See https://issues.apache.org/jira/browse/WICKET-3728 + }; // Cleanup extraneous CR and LF from the response CharSequence output = getCleanResponse(response); @@ -205,7 +205,7 @@ public final void onComponentTagBody(MarkupStream markupStream, ComponentTag ope * Renders the content of the <head> section of the page, including <wicket:head> * sections in subclasses of the page. For every child-component, the content is rendered to a * string and passed to {@link IHeaderResponse}. - * + * * @param headerStreamState */ public void renderHeaderTagBody(HeaderStreamState headerStreamState) @@ -236,11 +236,11 @@ public void renderHeaderTagBody(HeaderStreamState headerStreamState) } /** - * + * * @param response * @return Cleaned up response */ - private CharSequence getCleanResponse(final StringResponse response) + private static CharSequence getCleanResponse(final StringResponse response) { CharSequence output = response.getBuffer(); if (output.length() > 0) @@ -274,7 +274,7 @@ else if (output.charAt(0) == '\n') } /** - * + * * @return True if open and close tag are to be rendered. */ protected boolean renderOpenAndCloseTags() @@ -284,7 +284,7 @@ protected boolean renderOpenAndCloseTags() /** * Check if the header component is ok to render within the scope given. - * + * * @param scope * The scope of the header component * @param id @@ -295,13 +295,13 @@ public boolean okToRenderComponent(final String scope, final String id) { if (renderedComponentsPerScope == null) { - renderedComponentsPerScope = new HashMap>(); + renderedComponentsPerScope = new HashMap<>(); } List componentScope = renderedComponentsPerScope.get(scope); if (componentScope == null) { - componentScope = new ArrayList(); + componentScope = new ArrayList<>(); renderedComponentsPerScope.put(scope, componentScope); } @@ -323,7 +323,7 @@ protected void onAfterRender() { /** * Factory method for creating header response - * + * * @return new header response */ protected IHeaderResponse newHeaderResponse() @@ -340,7 +340,7 @@ protected Response getRealResponse() /** * Returns the header response. - * + * * @return header response */ public IHeaderResponse getHeaderResponse() diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainer.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainer.java index 636eac355a6..4249c6a2b18 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainer.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderItemsContainer.java @@ -16,6 +16,8 @@ */ package org.apache.wicket.markup.html.internal; +import org.apache.wicket.request.Response; + /** * A specialization of HtmlHeaderContainer that doesn't render * <head> and &l;/head> around the header contributions. @@ -38,6 +40,13 @@ public HtmlHeaderItemsContainer(String id) super(id); } + @Override + protected void onAfterRender() { + super.onAfterRender(); + final Response webResponse = getResponse(); + webResponse.write(""); + } + @Override protected boolean renderOpenAndCloseTags() { From b83281403a30c6bcfd7c9a3c751ae1851cea2126 Mon Sep 17 00:00:00 2001 From: Maxim Solodovnik Date: Mon, 3 Dec 2018 09:39:58 +0700 Subject: [PATCH 2/2] [WICKET-6617] comment regarding auto-close is improved --- .../apache/wicket/markup/html/internal/HtmlHeaderContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderContainer.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderContainer.java index 99138e48b6e..ebe0de32d04 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderContainer.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderContainer.java @@ -171,7 +171,7 @@ public final void onComponentTagBody(MarkupStream markupStream, ComponentTag ope AbstractHeaderRenderStrategy.get().renderHeader(this, new HeaderStreamState(markupStream, openTag), getPage()); - // Close the header response before rendering the header container itself + // Header response will be auto-closed before rendering the header container itself // See https://issues.apache.org/jira/browse/WICKET-3728 };