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);
+    }
+
+}

Reply via email to