Refactored for better comprehension (cherry picked from commit bbe25098439394541f1acf8f15e4b2442b54674a)
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/0d627810 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/0d627810 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/0d627810 Branch: refs/heads/WICKET-6105-java.time Commit: 0d62781071b3fbc2d1982419d55ec6bfdc62e626 Parents: c4a92df Author: Domas Poliakas <dpoliakas@Domas-MBP.local> Authored: Mon Sep 4 20:07:40 2017 +0100 Committer: Martin Tzvetanov Grigorov <mgrigo...@apache.org> Committed: Tue Sep 5 00:10:08 2017 +0300 ---------------------------------------------------------------------- .../AbstractHeaderRenderStrategy.java | 55 ++++++++++++------- .../ChildFirstHeaderRenderStrategyTest.java | 5 +- .../renderStrategy/EnclosureAjaxRenderPage.html | 16 ++++++ .../renderStrategy/EnclosureAjaxRenderPage.java | 56 ++++++++++++++++++++ .../markup/renderStrategy/SimplePage3.html | 16 ------ .../markup/renderStrategy/SimplePage3.java | 56 -------------------- 6 files changed, 110 insertions(+), 94 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/0d627810/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 91d5fd1..25ab204 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 @@ -18,6 +18,7 @@ package org.apache.wicket.markup.renderStrategy; import org.apache.wicket.Application; import org.apache.wicket.Component; +import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.application.HeaderContributorListenerCollection; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.html.IHeaderContributor; @@ -122,28 +123,44 @@ public abstract class AbstractHeaderRenderStrategy implements IHeaderRenderStrat 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(); - } - } - }); + renderInlineEnclosure(headerContainer, (InlineEnclosure) rootComponent); + } + } + - if (enclosureController != null){ - enclosureController.internalRenderHead(headerContainer); + /** + * Searches for the siblings of the given enclosure for the controller of the given enclosure and + * renders that controller's header contributions. + * + * This is done explicitly because when an enclosed component is added to the {@link AjaxRequestTarget} + * and is consequently replaced for render by the enclosure, the component's header contributions would not make + * it to the response as the enclosure is a sibling of the component in the hierarchy and only children's header contributions + * are added to the response. + * + * Fixes WICKET-6459 + * + * @param container the header container to render the header contributions of the enclosure's controller + * @param enclosure the enclosure whose controller's contributions are going to be rendered + */ + protected void renderInlineEnclosure(HtmlHeaderContainer container, InlineEnclosure enclosure){ + + final String childId = enclosure.getChildId(); + + // Visit the siblings of the enclosure to attempt and find the controller of the enclosure + Component enclosureController = enclosure.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(container); } } http://git-wip-us.apache.org/repos/asf/wicket/blob/0d627810/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 e68c812..9d5db6d 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,7 +19,6 @@ 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; @@ -67,8 +66,8 @@ public class ChildFirstHeaderRenderStrategyTest extends WicketTestCase public void testAjaxAndEnclosures() throws Exception { - tester.startPage(SimplePage3.class); - tester.assertRenderedPage(SimplePage3.class); + tester.startPage(EnclosureAjaxRenderPage.class); + tester.assertRenderedPage(EnclosureAjaxRenderPage.class); tester.clickLink("ajaxLink", true); String lastResponse = tester.getLastResponseAsString(); http://git-wip-us.apache.org/repos/asf/wicket/blob/0d627810/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/EnclosureAjaxRenderPage.html ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/EnclosureAjaxRenderPage.html b/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/EnclosureAjaxRenderPage.html new file mode 100644 index 0000000..fed65f7 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/EnclosureAjaxRenderPage.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/0d627810/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/EnclosureAjaxRenderPage.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/EnclosureAjaxRenderPage.java b/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/EnclosureAjaxRenderPage.java new file mode 100644 index 0000000..d18e863 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/EnclosureAjaxRenderPage.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 EnclosureAjaxRenderPage extends WebPage { + + public EnclosureAjaxRenderPage() { + + 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); + } + +} http://git-wip-us.apache.org/repos/asf/wicket/blob/0d627810/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 deleted file mode 100644 index fed65f7..0000000 --- a/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/SimplePage3.html +++ /dev/null @@ -1,16 +0,0 @@ -<!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/0d627810/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 deleted file mode 100644 index 8eccffa..0000000 --- a/wicket-core/src/test/java/org/apache/wicket/markup/renderStrategy/SimplePage3.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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); - } - -}