diff --git a/wicket-core-tests/src/test/java/org/apache/wicket/behavior/OutputMarkupContainerClassNameBehaviorTest.java b/wicket-core-tests/src/test/java/org/apache/wicket/behavior/OutputMarkupContainerClassNameBehaviorTest.java index 77de9af69c6..782ff1186dc 100644 --- a/wicket-core-tests/src/test/java/org/apache/wicket/behavior/OutputMarkupContainerClassNameBehaviorTest.java +++ b/wicket-core-tests/src/test/java/org/apache/wicket/behavior/OutputMarkupContainerClassNameBehaviorTest.java @@ -21,15 +21,16 @@ import org.apache.wicket.MockPanelWithLink; import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.settings.DebugSettings; import org.apache.wicket.util.tester.WicketTestCase; import org.junit.jupiter.api.Test; class OutputMarkupContainerClassNameBehaviorTest extends WicketTestCase { @Test - void whenDebugIsEnabled_thenRenderAttribute() + void whenDebugIsEnabledWithAttribute_thenRenderAttribute() { - tester.getApplication().getDebugSettings().setOutputMarkupContainerClassName(true); + tester.getApplication().getDebugSettings().setOutputMarkupContainerClassNameStrategy(DebugSettings.ClassOutputStrategy.TAG_ATTRIBUTE); MockPanelWithLink component = new MockPanelWithLink("test") { @Override @@ -43,9 +44,25 @@ protected void onLinkClick(AjaxRequestTarget target) { } @Test - void whenDebugIsDisabled_thenDontRenderAttribute() + void whenDebugIsEnabledWithComment_thenRenderComment() { - tester.getApplication().getDebugSettings().setOutputMarkupContainerClassName(false); + tester.getApplication().getDebugSettings().setOutputMarkupContainerClassNameStrategy(DebugSettings.ClassOutputStrategy.HTML_COMMENT); + + MockPanelWithLink component = new MockPanelWithLink("test") { + @Override + protected void onLinkClick(AjaxRequestTarget target) { + + } + }; + tester.startComponentInPage(component); + + assertTrue(tester.getLastResponseAsString().contains("")); + } + + @Test + void whenDebugIsDisabled_thenDontRenderAttributeOrComment() + { + tester.getApplication().getDebugSettings().setOutputMarkupContainerClassNameStrategy(DebugSettings.ClassOutputStrategy.NONE); MockPanelWithLink component = new MockPanelWithLink("test") { @Override @@ -56,5 +73,6 @@ protected void onLinkClick(AjaxRequestTarget target) { tester.startComponentInPage(component); assertFalse(tester.getLastResponseAsString().contains("")); + assertFalse(tester.getLastResponseAsString().contains("")); } } diff --git a/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java b/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java index 8703c616355..fbd83ea0120 100644 --- a/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java +++ b/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java @@ -787,9 +787,10 @@ public final void renderAssociatedMarkup(final String openTagName) try { setIgnoreAttributeModifier(true); - final boolean outputClassName = getApplication().getDebugSettings() - .isOutputMarkupContainerClassName(); - if (outputClassName) + + final DebugSettings.ClassOutputStrategy outputClassName = getApplication().getDebugSettings() + .getOutputMarkupContainerClassNameStrategy(); + if (outputClassName == DebugSettings.ClassOutputStrategy.TAG_ATTRIBUTE) { associatedMarkupOpenTag.addBehavior(OutputMarkupContainerClassNameBehavior.INSTANCE); } @@ -797,8 +798,24 @@ public final void renderAssociatedMarkup(final String openTagName) renderComponentTag(associatedMarkupOpenTag); associatedMarkupStream.next(); + String className = null; + if (outputClassName == DebugSettings.ClassOutputStrategy.HTML_COMMENT) + { + className = Classes.name(getClass()); + getResponse().write(""); + } + renderComponentTagBody(associatedMarkupStream, associatedMarkupOpenTag); + if (outputClassName == DebugSettings.ClassOutputStrategy.HTML_COMMENT) + { + getResponse().write(""); + } + renderClosingComponentTag(associatedMarkupStream, associatedMarkupOpenTag, false); } finally diff --git a/wicket-core/src/main/java/org/apache/wicket/Page.java b/wicket-core/src/main/java/org/apache/wicket/Page.java index 956b9b59afc..bf758ab8158 100644 --- a/wicket-core/src/main/java/org/apache/wicket/Page.java +++ b/wicket-core/src/main/java/org/apache/wicket/Page.java @@ -829,7 +829,7 @@ public void component(final Component component, final IVisit visit) if (getApplication().getDebugSettings().isOutputMarkupContainerClassName()) { - String className = Classes.name(getClass()); + final String className = Classes.name(getClass()); getResponse().write("\n"); diff --git a/wicket-core/src/main/java/org/apache/wicket/behavior/OutputMarkupContainerClassNameBehavior.java b/wicket-core/src/main/java/org/apache/wicket/behavior/OutputMarkupContainerClassNameBehavior.java index 8783d015336..3ffa2da88e8 100644 --- a/wicket-core/src/main/java/org/apache/wicket/behavior/OutputMarkupContainerClassNameBehavior.java +++ b/wicket-core/src/main/java/org/apache/wicket/behavior/OutputMarkupContainerClassNameBehavior.java @@ -28,9 +28,9 @@ * the markup element of {@link ComponentTag} with value the fully * qualified class name of the markup container.

* - *

It is used internally by Wicket when {@link DebugSettings#isOutputMarkupContainerClassName()} is active.

+ *

It is used internally by Wicket when {@link org.apache.wicket.settings.DebugSettings.ClassOutputStrategy#TAG_ATTRIBUTE} is active.

* - * @see DebugSettings#setOutputMarkupContainerClassName(boolean) + * @see DebugSettings#setOutputMarkupContainerClassNameStrategy(DebugSettings.ClassOutputStrategy) */ public class OutputMarkupContainerClassNameBehavior extends Behavior { diff --git a/wicket-core/src/main/java/org/apache/wicket/settings/DebugSettings.java b/wicket-core/src/main/java/org/apache/wicket/settings/DebugSettings.java index 92d393ea3a1..8d2883fca11 100644 --- a/wicket-core/src/main/java/org/apache/wicket/settings/DebugSettings.java +++ b/wicket-core/src/main/java/org/apache/wicket/settings/DebugSettings.java @@ -16,6 +16,8 @@ */ package org.apache.wicket.settings; +import org.apache.wicket.util.lang.Args; + /** * Settings class for various debug settings *

@@ -54,7 +56,7 @@ public class DebugSettings /** * Whether the container's class name should be printed to response (in a html comment). */ - private boolean outputMarkupContainerClassName = false; + private ClassOutputStrategy outputMarkupContainerClassNameStrategy = ClassOutputStrategy.NONE; private String componentPathAttributeName = null; @@ -104,14 +106,26 @@ public boolean isLinePreciseReportingOnNewComponentEnabled() } /** - * Returns whether the output of markup container's should be wrapped by comments containing the - * container's class name. + * Returns whether the output of markup container's should contain the + * container's Java class name. * - * @return true if the markup container's class name should be written to response + * @return true if the markup container's Java class name should be written to response + * @deprecated use {@link #getOutputMarkupContainerClassNameStrategy()} instead */ + @Deprecated(forRemoval = true) public boolean isOutputMarkupContainerClassName() { - return outputMarkupContainerClassName; + return outputMarkupContainerClassNameStrategy != ClassOutputStrategy.NONE; + } + + /** + * Returns the strategy for outputting the Java class name of a markup container + * + * @return the strategy for outputting the Java class name of a markup container + */ + public ClassOutputStrategy getOutputMarkupContainerClassNameStrategy() + { + return outputMarkupContainerClassNameStrategy; } /** @@ -173,13 +187,39 @@ public DebugSettings setLinePreciseReportingOnNewComponentEnabled(boolean enable * * @param enable * @return {@code this} object for chaining + * @deprecated use {@link #setOutputMarkupContainerClassNameStrategy(ClassOutputStrategy)} instead */ + @Deprecated(forRemoval = true) public DebugSettings setOutputMarkupContainerClassName(boolean enable) { - outputMarkupContainerClassName = enable; + outputMarkupContainerClassNameStrategy = enable ? ClassOutputStrategy.HTML_COMMENT : ClassOutputStrategy.NONE; + return this; + } + + /** + * Sets the strategy for outputting the Java class name of a markup container in the HTML output. + * + * @param strategy + * @return {@code this} object for chaining + */ + public DebugSettings setOutputMarkupContainerClassNameStrategy(ClassOutputStrategy strategy) + { + outputMarkupContainerClassNameStrategy = Args.notNull(strategy, "strategy"); return this; } + /** + * Sets the strategy for outputting the Java class name of a markup container in the HTML output. + * + * @param strategyName the enum name of the {@link ClassOutputStrategy} to use + * @return {@code this} object for chaining + */ + public DebugSettings setOutputMarkupContainerClassNameStrategy(String strategyName) + { + final ClassOutputStrategy strategy = Enum.valueOf(ClassOutputStrategy.class, strategyName); + return setOutputMarkupContainerClassNameStrategy(strategy); + } + /** * If the parameter value is non-empty then Wicket will use it as the name of an attribute of the * component tag to print the {@link org.apache.wicket.Component}'s path. @@ -233,4 +273,23 @@ public boolean isDevelopmentUtilitiesEnabled() { return developmentUtilitiesEnabled; } + + /** + * Strategy for outputting the Java class name of a markup container + */ + public enum ClassOutputStrategy + { + /** + * Output the container's class name in an HTML comment + */ + HTML_COMMENT, + /** + * Output the container's class name in a tag attribute + */ + TAG_ATTRIBUTE, + /** + * Do not output the container's class name + */ + NONE + } } diff --git a/wicket-jmx/src/main/java/org/apache/wicket/jmx/DebugSettingsMBean.java b/wicket-jmx/src/main/java/org/apache/wicket/jmx/DebugSettingsMBean.java index 283f5ed6e4e..1374ea21859 100644 --- a/wicket-jmx/src/main/java/org/apache/wicket/jmx/DebugSettingsMBean.java +++ b/wicket-jmx/src/main/java/org/apache/wicket/jmx/DebugSettingsMBean.java @@ -72,14 +72,22 @@ public interface DebugSettingsMBean * class name. (Useful for determining which part of page belongs to which markup file). * * @param enable + * @deprecated use {@link #setOutputMarkupContainerClassNameStrategy(String)} instead */ void setOutputMarkupContainerClassName(boolean enable); /** - * Returns whether the output of markup container's should be wrapped by comments containing the - * container's class name. + * Sets the strategy for outputting the Java class name of a markup container in the HTML output. + * (Useful for determining which part of page belongs to which markup file). + * + * @param strategyName the enum name of the class output strategy to use + */ + void setOutputMarkupContainerClassNameStrategy(String strategyName); + + /** + * Returns whether the markup container's Java class name should be written to the response. * - * @return true if the markup container's class name should be written to response + * @return true if the markup container's Java class name should be written to response */ boolean isOutputMarkupContainerClassName(); diff --git a/wicket-jmx/src/main/java/org/apache/wicket/jmx/wrapper/DebugSettings.java b/wicket-jmx/src/main/java/org/apache/wicket/jmx/wrapper/DebugSettings.java index f4cdea5139f..e30c5611264 100644 --- a/wicket-jmx/src/main/java/org/apache/wicket/jmx/wrapper/DebugSettings.java +++ b/wicket-jmx/src/main/java/org/apache/wicket/jmx/wrapper/DebugSettings.java @@ -86,6 +86,12 @@ public void setOutputMarkupContainerClassName(final boolean enable) application.getDebugSettings().setOutputMarkupContainerClassName(enable); } + @Override + public void setOutputMarkupContainerClassNameStrategy(final String strategyName) { + application.getDebugSettings().setOutputMarkupContainerClassNameStrategy(strategyName); + + } + @Override public boolean isOutputMarkupContainerClassName() {