WICKET-4494 HtmlHandler wrongly handles tags not requiring closed tags if the markup does not have "top" level tag
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/35843c19 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/35843c19 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/35843c19 Branch: refs/heads/sandbox/atmosphere Commit: 35843c19628b0346acec2867cc88fbabb81e8a4f Parents: 66ff952 Author: Martin Tzvetanov Grigorov <mgrigo...@apache.org> Authored: Fri Apr 13 14:47:12 2012 +0300 Committer: Martin Tzvetanov Grigorov <mgrigo...@apache.org> Committed: Fri Apr 13 14:48:19 2012 +0300 ---------------------------------------------------------------------- .../wicket/markup/parser/filter/HtmlHandler.java | 1 + .../markup/parser/filter/CustomMarkupLabel.java | 91 +++++++++++++++ ...ynamicMarkupPageWithNonClosedTags_expected.html | 1 + .../markup/parser/filter/HtmlHandlerTest.java | 62 ++++++++++ 4 files changed, 155 insertions(+), 0 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/35843c19/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHandler.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHandler.java b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHandler.java index b45ed7c..440e5bc 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHandler.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHandler.java @@ -78,6 +78,7 @@ public final class HtmlHandler extends AbstractMarkupFilter if (!requiresCloseTag(top.getName())) { stack.pop(); + top.setHasNoCloseTag(true); } else { http://git-wip-us.apache.org/repos/asf/wicket/blob/35843c19/wicket-core/src/test/java/org/apache/wicket/markup/parser/filter/CustomMarkupLabel.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/parser/filter/CustomMarkupLabel.java b/wicket-core/src/test/java/org/apache/wicket/markup/parser/filter/CustomMarkupLabel.java new file mode 100644 index 0000000..0209076 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/markup/parser/filter/CustomMarkupLabel.java @@ -0,0 +1,91 @@ +package org.apache.wicket.markup.parser.filter; + +import java.nio.charset.Charset; + +import org.apache.wicket.Component; +import org.apache.wicket.MarkupContainer; +import org.apache.wicket.markup.ComponentTag; +import org.apache.wicket.markup.IMarkupCacheKeyProvider; +import org.apache.wicket.markup.IMarkupFragment; +import org.apache.wicket.markup.IMarkupResourceStreamProvider; +import org.apache.wicket.markup.MarkupException; +import org.apache.wicket.markup.MarkupStream; +import org.apache.wicket.markup.html.panel.AbstractMarkupSourcingStrategy; +import org.apache.wicket.markup.html.panel.IMarkupSourcingStrategy; +import org.apache.wicket.util.resource.IResourceStream; +import org.apache.wicket.util.resource.StringResourceStream; + +/** + * https://issues.apache.org/jira/browse/WICKET-4494 + * @see HtmlHandlerTest + */ +public class CustomMarkupLabel + extends MarkupContainer + implements IMarkupCacheKeyProvider, IMarkupResourceStreamProvider +{ + private static final String SAMPLE_MARKUP = "<img alt='logo' src='logo.png'><br>Some text<br>Some more text"; + + public CustomMarkupLabel(final String id) + { + super(id); + } + + @Override + protected IMarkupSourcingStrategy newMarkupSourcingStrategy() + { + return new MyMarkupSourcingStrategy(this); + } + + public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass) + { + // the markup is loaded from database in our real application + StringResourceStream res = new StringResourceStream(SAMPLE_MARKUP); + res.setCharset(Charset.forName("UTF-8")); + return res; + } + + public String getCacheKey(MarkupContainer container, Class<?> containerClass) + { + return null; + } + + // + // custom markup sourcing strategy + // + + private static class MyMarkupSourcingStrategy extends AbstractMarkupSourcingStrategy + { + private final CustomMarkupLabel markupProvider; + + public MyMarkupSourcingStrategy(final CustomMarkupLabel markupProvider) + { + this.markupProvider = markupProvider; + } + + @Override + public void onComponentTagBody(Component component, MarkupStream markupStream, ComponentTag openTag) + { + super.onComponentTagBody(component, markupStream, openTag); + // + MarkupStream stream = new MarkupStream(getMarkup((MarkupContainer)component, null)); + component.onComponentTagBody(stream, openTag); + } + + @Override + public IMarkupFragment getMarkup(final MarkupContainer container, final Component child) + { + IMarkupFragment markup = markupProvider.getAssociatedMarkup(); + if (markup == null) + { + throw new MarkupException("The EntityText has no markup!"); + } + // + if (child == null) + { + return markup; + } + // search for the child insight the fragment markup + return markup.find(child.getId()); + } + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/35843c19/wicket-core/src/test/java/org/apache/wicket/markup/parser/filter/DynamicMarkupPageWithNonClosedTags_expected.html ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/parser/filter/DynamicMarkupPageWithNonClosedTags_expected.html b/wicket-core/src/test/java/org/apache/wicket/markup/parser/filter/DynamicMarkupPageWithNonClosedTags_expected.html new file mode 100644 index 0000000..462aa7c --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/markup/parser/filter/DynamicMarkupPageWithNonClosedTags_expected.html @@ -0,0 +1 @@ +<html><body><span wicket:id="label"><img alt="logo" src="../logo.png"><br>Some text<br>Some more text</span></body></html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/wicket/blob/35843c19/wicket-core/src/test/java/org/apache/wicket/markup/parser/filter/HtmlHandlerTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/parser/filter/HtmlHandlerTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/parser/filter/HtmlHandlerTest.java new file mode 100644 index 0000000..7d63fb1 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/markup/parser/filter/HtmlHandlerTest.java @@ -0,0 +1,62 @@ +/* + * 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.parser.filter; + +import org.apache.wicket.MarkupContainer; +import org.apache.wicket.WicketTestCase; +import org.apache.wicket.markup.IMarkupResourceStreamProvider; +import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.util.resource.IResourceStream; +import org.apache.wicket.util.resource.StringResourceStream; +import org.junit.Test; + +/** + * @since 1.5.6 + */ +public class HtmlHandlerTest extends WicketTestCase +{ + /** + * https://issues.apache.org/jira/browse/WICKET-4494 + * + * Asserts that a page which markup is loaded dynamically with IMarkupResourceStreamProvider + * and the the loaded markup has HtmlHandler#doesNotRequireCloseTag tags loads OK + * + * @throws Exception + */ + @Test + public void loadMarkupWithNonClosedTagsDynamically() throws Exception + { + CustomMarkupPage page = new CustomMarkupPage(); + tester.executeTest(HtmlHandlerTest.class, page, "DynamicMarkupPageWithNonClosedTags_expected.html"); + } + + /** + * The test page for #loadMarkupWithNonClosedTagsDynamically() + */ + private static class CustomMarkupPage extends WebPage implements IMarkupResourceStreamProvider + { + private CustomMarkupPage() + { + add(new CustomMarkupLabel("label")); + } + + public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass) + { + return new StringResourceStream("<html><body><span wicket:id='label'></span></body></html>"); + } + } +}