diff --git a/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/Aria.java b/sonar-html-plugin/src/main/java/org/sonar/plugins/html/api/accessibility/Aria.java similarity index 98% rename from sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/Aria.java rename to sonar-html-plugin/src/main/java/org/sonar/plugins/html/api/accessibility/Aria.java index 15adaa6f3..2f9d7b16e 100644 --- a/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/Aria.java +++ b/sonar-html-plugin/src/main/java/org/sonar/plugins/html/api/accessibility/Aria.java @@ -16,7 +16,7 @@ * limitations under the License. */ -package org.sonar.plugins.html.checks.accessibility; +package org.sonar.plugins.html.api.accessibility; import java.util.HashMap; import java.util.Map; @@ -80,7 +80,7 @@ public class Aria { ARIA_PROPERTIES.put("aria-valuetext", new AriaProperty("aria-valuetext", AriaPropertyType.STRING)); } - static class AriaProperty { + public static class AriaProperty { private final String name; private final AriaPropertyType type; private final Optional allowUndefined; @@ -114,7 +114,7 @@ public Set getValues() { } } - enum AriaPropertyType { + public enum AriaPropertyType { BOOLEAN("boolean"), STRING("string"), TOKEN("token"), diff --git a/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/AriaProptypesCheck.java b/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/AriaProptypesCheck.java index 840b3ba5e..9551b1330 100644 --- a/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/AriaProptypesCheck.java +++ b/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/AriaProptypesCheck.java @@ -23,11 +23,11 @@ import java.util.stream.Collectors; import org.sonar.check.Rule; import org.sonar.plugins.html.checks.AbstractPageCheck; -import org.sonar.plugins.html.checks.accessibility.Aria.AriaProperty; -import org.sonar.plugins.html.checks.accessibility.Aria.AriaPropertyType; +import org.sonar.plugins.html.api.accessibility.Aria.AriaProperty; +import org.sonar.plugins.html.api.accessibility.Aria.AriaPropertyType; import org.sonar.plugins.html.node.TagNode; -import static org.sonar.plugins.html.checks.accessibility.Aria.ARIA_PROPERTIES; +import static org.sonar.plugins.html.api.accessibility.Aria.ARIA_PROPERTIES; @Rule(key = "S6793") public class AriaProptypesCheck extends AbstractPageCheck { diff --git a/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/HeadingHasAccessibleContentCheck.java b/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/HeadingHasAccessibleContentCheck.java index 0611a5566..fc9722f10 100644 --- a/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/HeadingHasAccessibleContentCheck.java +++ b/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/HeadingHasAccessibleContentCheck.java @@ -20,7 +20,6 @@ import org.sonar.check.Rule; import org.sonar.plugins.html.api.Helpers; import org.sonar.plugins.html.api.BufferStack; -import org.sonar.plugins.html.api.HtmlConstants; import org.sonar.plugins.html.checks.AbstractPageCheck; import org.sonar.plugins.html.node.DirectiveNode; import org.sonar.plugins.html.node.ExpressionNode; @@ -32,6 +31,8 @@ import java.util.Deque; import java.util.List; +import static org.sonar.plugins.html.api.HtmlConstants.hasKnownHTMLTag; + @Rule(key = "S6850") public class HeadingHasAccessibleContentCheck extends AbstractPageCheck { private final List invalidAttributes = List.of( @@ -60,7 +61,7 @@ public void startElement(TagNode node) { String nodeName = node.getNodeName(); // tags that are not part of the known HTML tags list are considered as content - if (!HtmlConstants.KNOWN_HTML_TAGS.contains(nodeName)) { + if (!hasKnownHTMLTag(node)) { bufferStack.write(nodeName); } } diff --git a/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/NoInteractiveElementToNoninteractiveRoleCheck.java b/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/NoInteractiveElementToNoninteractiveRoleCheck.java index 469d4141b..d8c7386ce 100644 --- a/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/NoInteractiveElementToNoninteractiveRoleCheck.java +++ b/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/NoInteractiveElementToNoninteractiveRoleCheck.java @@ -17,15 +17,14 @@ */ package org.sonar.plugins.html.checks.accessibility; -import java.util.Locale; import org.sonar.check.Rule; import org.sonar.plugins.html.checks.AbstractPageCheck; import org.sonar.plugins.html.node.TagNode; -import static org.sonar.plugins.html.api.HtmlConstants.INTERACTIVE_ELEMENTS; -import static org.sonar.plugins.html.api.HtmlConstants.KNOWN_HTML_TAGS; -import static org.sonar.plugins.html.api.HtmlConstants.NON_INTERACTIVE_ROLES; -import static org.sonar.plugins.html.api.HtmlConstants.PRESENTATION_ROLES; +import static org.sonar.plugins.html.api.HtmlConstants.hasKnownHTMLTag; +import static org.sonar.plugins.html.api.HtmlConstants.hasNonInteractiveRole; +import static org.sonar.plugins.html.api.HtmlConstants.hasPresentationRole; +import static org.sonar.plugins.html.api.HtmlConstants.isInteractiveElement; @Rule(key = "S6843") public class NoInteractiveElementToNoninteractiveRoleCheck extends AbstractPageCheck { @@ -34,13 +33,10 @@ public class NoInteractiveElementToNoninteractiveRoleCheck extends AbstractPageC @Override public void startElement(TagNode node) { - var role = node.getPropertyValue("role"); - var tagName = node.getNodeName().toLowerCase(Locale.ROOT); if ( - role != null && - KNOWN_HTML_TAGS.contains(tagName) && - INTERACTIVE_ELEMENTS.contains(tagName) && - (NON_INTERACTIVE_ROLES.contains(role) || PRESENTATION_ROLES.contains(role)) + hasKnownHTMLTag(node) && + isInteractiveElement(node) && + (hasNonInteractiveRole(node) || hasPresentationRole(node)) ) { createViolation(node, MESSAGE); } diff --git a/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/NoNonInteractiveElementsWithHandlersCheck.java b/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/NoNonInteractiveElementsWithHandlersCheck.java index 659f224cb..566c33d82 100644 --- a/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/NoNonInteractiveElementsWithHandlersCheck.java +++ b/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/NoNonInteractiveElementsWithHandlersCheck.java @@ -17,8 +17,8 @@ */ package org.sonar.plugins.html.checks.accessibility; -import static org.sonar.plugins.html.api.HtmlConstants.KNOWN_HTML_TAGS; import static org.sonar.plugins.html.api.HtmlConstants.hasAbstractRole; +import static org.sonar.plugins.html.api.HtmlConstants.hasKnownHTMLTag; import static org.sonar.plugins.html.api.HtmlConstants.isInteractiveElement; import static org.sonar.plugins.html.api.HtmlConstants.hasInteractiveRole; import static org.sonar.plugins.html.api.HtmlConstants.isNonInteractiveElement; @@ -47,8 +47,7 @@ public class NoNonInteractiveElementsWithHandlersCheck extends AbstractPageCheck @Override public void startElement(TagNode element) { - var tagName = element.getNodeName(); - if (!KNOWN_HTML_TAGS.contains(tagName)) { + if (!hasKnownHTMLTag(element)) { return; } diff --git a/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/NoNoninteractiveElementToInteractiveRoleCheck.java b/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/NoNoninteractiveElementToInteractiveRoleCheck.java index ffc3c6d66..02ae7a72d 100644 --- a/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/NoNoninteractiveElementToInteractiveRoleCheck.java +++ b/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/NoNoninteractiveElementToInteractiveRoleCheck.java @@ -17,9 +17,9 @@ */ package org.sonar.plugins.html.checks.accessibility; -import static org.sonar.plugins.html.api.HtmlConstants.INTERACTIVE_ROLES; -import static org.sonar.plugins.html.api.HtmlConstants.KNOWN_HTML_TAGS; -import static org.sonar.plugins.html.api.HtmlConstants.NON_INTERACTIVE_ELEMENTS; +import static org.sonar.plugins.html.api.HtmlConstants.hasInteractiveRole; +import static org.sonar.plugins.html.api.HtmlConstants.hasKnownHTMLTag; +import static org.sonar.plugins.html.api.HtmlConstants.isNonInteractiveElement; import java.util.Locale; import org.sonar.check.Rule; @@ -33,13 +33,10 @@ public class NoNoninteractiveElementToInteractiveRoleCheck extends AbstractPageC @Override public void startElement(TagNode node) { - var role = node.getPropertyValue("role"); - var tagName = node.getNodeName().toLowerCase(Locale.ROOT); if ( - role != null && - KNOWN_HTML_TAGS.contains(tagName) && - NON_INTERACTIVE_ELEMENTS.contains(tagName) && - INTERACTIVE_ROLES.contains(role) + hasKnownHTMLTag(node) && + isNonInteractiveElement(node) && + hasInteractiveRole(node) ) { createViolation(node, MESSAGE); } diff --git a/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/NoNoninteractiveTabIndexCheck.java b/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/NoNoninteractiveTabIndexCheck.java index 032469cc2..b5ba6eabd 100644 --- a/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/NoNoninteractiveTabIndexCheck.java +++ b/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/NoNoninteractiveTabIndexCheck.java @@ -17,9 +17,9 @@ */ package org.sonar.plugins.html.checks.accessibility; -import static org.sonar.plugins.html.api.HtmlConstants.INTERACTIVE_ELEMENTS; -import static org.sonar.plugins.html.api.HtmlConstants.INTERACTIVE_ROLES; -import static org.sonar.plugins.html.api.HtmlConstants.KNOWN_HTML_TAGS; +import static org.sonar.plugins.html.api.HtmlConstants.hasInteractiveRole; +import static org.sonar.plugins.html.api.HtmlConstants.hasKnownHTMLTag; +import static org.sonar.plugins.html.api.HtmlConstants.isInteractiveElement; import org.sonar.check.Rule; import org.sonar.plugins.html.checks.AbstractPageCheck; @@ -32,7 +32,7 @@ public class NoNoninteractiveTabIndexCheck extends AbstractPageCheck { @Override public void startElement(TagNode node) { - if (!isHTMLTag(node) || isInteractiveElement(node) || hasInteractiveRole(node)) { + if (!hasKnownHTMLTag(node) || isInteractiveElement(node) || hasInteractiveRole(node)) { return; } @@ -50,19 +50,4 @@ public void startElement(TagNode node) { // ignore } } - - private static boolean isHTMLTag(TagNode element) { - var tagName = element.getNodeName(); - return KNOWN_HTML_TAGS.stream().anyMatch(tagName::equalsIgnoreCase); - } - - private static boolean isInteractiveElement(TagNode element) { - var tagName = element.getNodeName(); - return INTERACTIVE_ELEMENTS.stream().anyMatch(tagName::equalsIgnoreCase); - } - - private static boolean hasInteractiveRole(TagNode element) { - var role = element.getAttribute("role"); - return role != null && INTERACTIVE_ROLES.stream().anyMatch(role::equalsIgnoreCase); - } } diff --git a/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/NoStaticElementInteractionsCheck.java b/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/NoStaticElementInteractionsCheck.java index 73b38fd3d..542e4cdc1 100644 --- a/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/NoStaticElementInteractionsCheck.java +++ b/sonar-html-plugin/src/main/java/org/sonar/plugins/html/checks/accessibility/NoStaticElementInteractionsCheck.java @@ -17,8 +17,8 @@ */ package org.sonar.plugins.html.checks.accessibility; -import static org.sonar.plugins.html.api.HtmlConstants.KNOWN_HTML_TAGS; import static org.sonar.plugins.html.api.HtmlConstants.hasAbstractRole; +import static org.sonar.plugins.html.api.HtmlConstants.hasKnownHTMLTag; import static org.sonar.plugins.html.api.HtmlConstants.isInteractiveElement; import static org.sonar.plugins.html.api.HtmlConstants.hasInteractiveRole; import static org.sonar.plugins.html.api.HtmlConstants.isNonInteractiveElement; @@ -47,9 +47,7 @@ public class NoStaticElementInteractionsCheck extends AbstractPageCheck { @Override public void startElement(TagNode element) { - var tagName = element.getNodeName(); - - if (!KNOWN_HTML_TAGS.contains(tagName)) { + if (!hasKnownHTMLTag(element)) { return; } diff --git a/sonar-html-plugin/src/test/resources/checks/NoInteractiveElementToNoninteractiveRoleCheck/valid.html b/sonar-html-plugin/src/test/resources/checks/NoInteractiveElementToNoninteractiveRoleCheck/valid.html index 76bd66275..e6c6aa6a0 100644 --- a/sonar-html-plugin/src/test/resources/checks/NoInteractiveElementToNoninteractiveRoleCheck/valid.html +++ b/sonar-html-plugin/src/test/resources/checks/NoInteractiveElementToNoninteractiveRoleCheck/valid.html @@ -107,7 +107,7 @@ -