Repository: wicket Updated Branches: refs/heads/master a690aa063 -> 0d6278107
Ajax inline enclosure fix. (cherry picked from commit f9fa76cf4c46674dd4d4e83d5474e7bc904ec457) Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/c4a92dfd Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/c4a92dfd Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/c4a92dfd Branch: refs/heads/master Commit: c4a92dfdb63fcb294e446e36454cd9730a7a9b43 Parents: a690aa0 Author: Domas Poliakas <[email protected]> Authored: Fri Sep 1 17:39:42 2017 +0100 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Tue Sep 5 00:09:57 2017 +0300 ---------------------------------------------------------------------- .../AbstractHeaderRenderStrategy.java | 28 ++++++++++ .../ChildFirstHeaderRenderStrategyTest.java | 39 ++++++++++++++ .../markup/renderStrategy/SimplePage3.html | 16 ++++++ .../markup/renderStrategy/SimplePage3.java | 56 ++++++++++++++++++++ 4 files changed, 139 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/c4a92dfd/wicket-core/src/main/java/org/apache/wicket/markup/renderStrategy/AbstractHeaderRenderStrategy.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/renderStrategy/AbstractHeaderRenderStrategy.java b/wicket-core/src/main/java/org/apache/wicket/markup/renderStrategy/AbstractHeaderRenderStrategy.java index aef5d4e..91d5fd1 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/renderStrategy/AbstractHeaderRenderStrategy.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/renderStrategy/AbstractHeaderRenderStrategy.java @@ -23,7 +23,10 @@ import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.html.IHeaderContributor; import org.apache.wicket.markup.html.internal.HtmlHeaderContainer; import org.apache.wicket.markup.html.internal.HtmlHeaderContainer.HeaderStreamState; +import org.apache.wicket.markup.html.internal.InlineEnclosure; import org.apache.wicket.util.lang.Args; +import org.apache.wicket.util.visit.IVisit; +import org.apache.wicket.util.visit.IVisitor; /** * An abstract implementation of a header render strategy which is only missing the code to traverse @@ -116,7 +119,32 @@ public abstract class AbstractHeaderRenderStrategy implements IHeaderRenderStrat final HeaderStreamState headerStreamState, final Component rootComponent) { headerContainer.renderHeaderTagBody(headerStreamState); + rootComponent.internalRenderHead(headerContainer); + + // If the root component is an inline enclosure, then we force header render of its controller as well; normally + // this would not trigger because the controller is a sibling of the enclosure + if (rootComponent instanceof InlineEnclosure) { + InlineEnclosure typedComponent = (InlineEnclosure) rootComponent; + + final String childId = typedComponent.getChildId(); + + // Visit the siblings of the enclosure to attempt and find the controller of the enclosure + Component enclosureController = typedComponent.getParent().visitChildren(new IVisitor<Component, Component>() { + @Override + public void component(Component object, IVisit<Component> visit) { + if (object.getId().equals(childId)){ + visit.stop(object); + } else { + visit.dontGoDeeper(); + } + } + }); + + if (enclosureController != null){ + enclosureController.internalRenderHead(headerContainer); + } + } } /** http://git-wip-us.apache.org/repos/asf/wicket/blob/c4a92dfd/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/ChildFirstHeaderRenderStrategyTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/ChildFirstHeaderRenderStrategyTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/ChildFirstHeaderRenderStrategyTest.java index 516ce6e..e68c812 100644 --- a/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/ChildFirstHeaderRenderStrategyTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/ChildFirstHeaderRenderStrategyTest.java @@ -19,10 +19,16 @@ package org.apache.wicket.markup.renderStrategy; import org.apache.wicket.Page; import org.apache.wicket.util.tester.WicketTestCase; import org.apache.wicket.util.tester.WicketTester; +import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + /** * * @author juergen donnerstag @@ -51,6 +57,39 @@ public class ChildFirstHeaderRenderStrategyTest extends WicketTestCase } /** + * Tests that when a controller of an enclosure is added to the ajax target, its header + * contributions reach the response + * + * WICKET-6459 + * + */ + @Test + public void testAjaxAndEnclosures() throws Exception + { + + tester.startPage(SimplePage3.class); + tester.assertRenderedPage(SimplePage3.class); + tester.clickLink("ajaxLink", true); + + String lastResponse = tester.getLastResponseAsString(); + + String headerContribution = lastResponse.split("<header-contribution")[1].split("</header-contribution")[0]; + + Pattern headerStylesheetLinkExtractor = Pattern.compile("<link.*/>"); + Matcher headerStyleSheetLinkMatcher = headerStylesheetLinkExtractor.matcher(headerContribution); + + List<String> headerStylesheetLinks = new ArrayList<>(); + + while (headerStyleSheetLinkMatcher.find()){ + headerStylesheetLinks.add(headerStyleSheetLinkMatcher.group()); + } + + assertTrue(headerStylesheetLinks.contains("<link rel=\"stylesheet\" type=\"text/css\" href=\"../../enclosedInInline.css\" />")); + assertTrue(headerStylesheetLinks.contains("<link rel=\"stylesheet\" type=\"text/css\" href=\"../../enclosed.css\" />")); + + } + + /** * * @param <T> * @param pageClass http://git-wip-us.apache.org/repos/asf/wicket/blob/c4a92dfd/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/SimplePage3.html ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/SimplePage3.html b/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/SimplePage3.html new file mode 100644 index 0000000..fed65f7 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/SimplePage3.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<html xmlns:wicket> +<head> + <meta charset="UTF-8"> + <title>Title</title> +</head> +<body> +<wicket:enclosure> + <span wicket:id="enclosed">Something</span> +</wicket:enclosure> +<div wicket:enclosure> + <span wicket:id="enclosedInInline">Something</span> +</div> +<a wicket:id="ajaxLink">Refresher of Some Things</a> +</body> +</html> http://git-wip-us.apache.org/repos/asf/wicket/blob/c4a92dfd/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/SimplePage3.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/SimplePage3.java b/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/SimplePage3.java new file mode 100644 index 0000000..8eccffa --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/SimplePage3.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.markup.renderStrategy; + +import org.apache.wicket.Component; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.AjaxLink; +import org.apache.wicket.markup.head.CssHeaderItem; +import org.apache.wicket.markup.head.IHeaderResponse; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.WebPage; + +/** + * Mock for {@link ChildFirstHeaderRenderStrategyTest#testAjaxAndEnclosures()} + */ +public class SimplePage3 extends WebPage { + + public SimplePage3() { + + this.add(createEnclosureController("enclosed")); + this.add(createEnclosureController("enclosedInInline")); + this.add(new AjaxLink<Void>("ajaxLink") { + @Override + public void onClick(AjaxRequestTarget target) { + target.add(getPage().get("enclosed")); + target.add(getPage().get("enclosedInInline")); + } + }); + + } + + private Component createEnclosureController(final String id){ + return new WebMarkupContainer(id){ + @Override + public void renderHead(IHeaderResponse response) { + super.renderHead(response); + response.render(CssHeaderItem.forUrl(id + ".css")); + } + }.setOutputMarkupId(true); + } + +}
