Author: jdonnerstag Date: Fri Jun 3 21:01:39 2011 New Revision: 1131240 URL: http://svn.apache.org/viewvc?rev=1131240&view=rev Log: applied patch provided: Allow filtering and grouping of resources in the <head> Issue: WICKET-3728
Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderContainer.java Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderContainer.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderContainer.java?rev=1131240&r1=1131239&r2=1131240&view=diff ============================================================================== --- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderContainer.java (original) +++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/HtmlHeaderContainer.java Fri Jun 3 21:01:39 2011 @@ -120,6 +120,7 @@ public class HtmlHeaderContainer extends try { + // Create a (string) response for all headers contributed by any component on the Page. final StringResponse response = new StringResponse(); getRequestCycle().setResponse(response); @@ -129,51 +130,33 @@ public class HtmlHeaderContainer extends getRequestCycle().setResponse(headerResponse.getResponse()); } - // In any case, first render the header section directly associated - // with the markup + // Render the header sections of all components on the page + AbstractHeaderRenderStrategy.get().renderHeader(this, getPage()); + + // Close the header response before rendering the header container itself + // See https://issues.apache.org/jira/browse/WICKET-3728 + headerResponse.close(); + + // Create a separate (string) response for the header container itself + final StringResponse bodyResponse = new StringResponse(); + getRequestCycle().setResponse(bodyResponse); + + // render the header section directly associated with the markup super.onComponentTagBody(markupStream, openTag); - // Render all header sections of all components on the page - AbstractHeaderRenderStrategy.get().renderHeader(this, getPage()); - getHeaderResponse().close(); + // Cleanup extraneous CR and LF from the response + CharSequence output = getCleanResponse(response); + CharSequence bodyOutput = getCleanResponse(bodyResponse); // Automatically add <head> if necessary - CharSequence output = response.getBuffer(); - if (output.length() > 0) - { - if (output.charAt(0) == '\r') - { - for (int i = 2; i < output.length(); i += 2) - { - char ch = output.charAt(i); - if (ch != '\r') - { - output = output.subSequence(i - 2, output.length()); - break; - } - } - } - else if (output.charAt(0) == '\n') - { - for (int i = 1; i < output.length(); i++) - { - char ch = output.charAt(i); - if (ch != '\n') - { - output = output.subSequence(i - 1, output.length()); - break; - } - } - } - } - - if (output.length() > 0) + if ((output.length() > 0) || (bodyOutput.length() > 0)) { if (renderOpenAndCloseTags()) { webResponse.write("<head>"); } + webResponse.write(bodyOutput); webResponse.write(output); if (renderOpenAndCloseTags()) @@ -191,6 +174,44 @@ public class HtmlHeaderContainer extends /** * + * @param response + * @return Cleaned up response + */ + private CharSequence getCleanResponse(final StringResponse response) + { + CharSequence output = response.getBuffer(); + if (output.length() > 0) + { + if (output.charAt(0) == '\r') + { + for (int i = 2; i < output.length(); i += 2) + { + char ch = output.charAt(i); + if (ch != '\r') + { + output = output.subSequence(i - 2, output.length()); + break; + } + } + } + else if (output.charAt(0) == '\n') + { + for (int i = 1; i < output.length(); i++) + { + char ch = output.charAt(i); + if (ch != '\n') + { + output = output.subSequence(i - 1, output.length()); + break; + } + } + } + } + return output; + } + + /** + * * @return True if open and close tag are to be rendered. */ protected boolean renderOpenAndCloseTags()