diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Checker.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Checker.java index 8fbdce922fe..d33e4874c00 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Checker.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Checker.java @@ -690,7 +690,9 @@ public class Checker extends DocTreePathScanner { } // for now, doclint allows all attribute names beginning with "on" as event handler names, // without checking the validity or applicability of the name - if (!name.toString().startsWith("on")) { + // custom "data-*" attributes are also accepted + var attrName = name.toString(); + if (!attrName.startsWith("on") && !attrName.startsWith("data-")) { AttrKind k = currTag.getAttrKind(name); switch (k) { case OK -> { } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/HtmlTag.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/HtmlTag.java index 68495019c16..0c820dae913 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/HtmlTag.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/HtmlTag.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -434,57 +434,76 @@ public enum HtmlTag { public enum Attr { ABBR, + ACCESSKEY(true), ALIGN, ALINK, ALT, - ARIA_ACTIVEDESCENDANT, - ARIA_CONTROLS, - ARIA_DESCRIBEDBY, - ARIA_EXPANDED, - ARIA_LABEL, - ARIA_LABELLEDBY, - ARIA_LEVEL, - ARIA_MULTISELECTABLE, - ARIA_OWNS, - ARIA_POSINSET, - ARIA_SETSIZE, - ARIA_READONLY, - ARIA_REQUIRED, - ARIA_SELECTED, - ARIA_SORT, + ARIA_ACTIVEDESCENDANT(true), + ARIA_CONTROLS(true), + ARIA_DESCRIBEDBY(true), + ARIA_EXPANDED(true), + ARIA_LABEL(true), + ARIA_LABELLEDBY(true), + ARIA_LEVEL(true), + ARIA_MULTISELECTABLE(true), + ARIA_OWNS(true), + ARIA_POSINSET(true), + ARIA_READONLY(true), + ARIA_REQUIRED(true), + ARIA_SELECTED(true), + ARIA_SETSIZE(true), + ARIA_SORT(true), + AUTOCAPITALIZE(true), + AUTOFOCUS(true), AXIS, BACKGROUND, BGCOLOR, BORDER, - CELLSPACING, CELLPADDING, + CELLSPACING, CHAR, CHAROFF, CHARSET, CITE, + CLASS(true), CLEAR, - CLASS, COLOR, COLSPAN, COMPACT, + CONTENTEDITABLE(true), COORDS, CROSSORIGIN, DATETIME, + DIR(true), + DRAGGABLE(true), + ENTERKEYHINT(true), FACE, FRAME, FRAMEBORDER, HEADERS, HEIGHT, + HIDDEN(true), HREF, HSPACE, - ID, + ID(true), + INERT(true), + INPUTMODE(true), + IS(true), + ITEMID(true), + ITEMPROP(true), + ITEMREF(true), + ITEMSCOPE(true), + ITEMTYPE(true), + LANG(true), LINK, LONGDESC, MARGINHEIGHT, MARGINWIDTH, NAME, + NONCE(true), NOSHADE, NOWRAP, + POPOVER(true), PROFILE, REV, REVERSED, @@ -497,24 +516,39 @@ public enum HtmlTag { SHAPE, SIZE, SPACE, + SPELLCHECK(true), SRC, START, - STYLE, + STYLE(true), SUMMARY, + TABINDEX(true), TARGET, TEXT, + TITLE(true), + TRANSLATE(true), TYPE, VALIGN, VALUE, VERSION, VLINK, VSPACE, - WIDTH; + WIDTH, + WRITINGSUGGESTIONS(true); private final String name; + private final boolean isGlobal; Attr() { + this(false); + } + + Attr(boolean flag) { name = StringUtils.toLowerCase(name().replace("_", "-")); + isGlobal = flag; + } + + public boolean isGlobal() { + return isGlobal; } public String getText() { @@ -632,8 +666,13 @@ public enum HtmlTag { } public AttrKind getAttrKind(Name attrName) { - AttrKind k = attrs.get(getAttr(attrName)); // null-safe - return (k == null) ? AttrKind.INVALID : k; + Attr attr = getAttr(attrName); + if (attr == null) { + return AttrKind.INVALID; + } + return attr.isGlobal() ? + AttrKind.OK : + attrs.getOrDefault(attr, AttrKind.INVALID); } private static AttrMap attrs(AttrKind k, Attr... attrs) { diff --git a/test/langtools/jdk/javadoc/doclet/TestGlobalHtml/TestGlobalHtml.java b/test/langtools/jdk/javadoc/doclet/TestGlobalHtml/TestGlobalHtml.java new file mode 100644 index 00000000000..8d2d8e7dd78 --- /dev/null +++ b/test/langtools/jdk/javadoc/doclet/TestGlobalHtml/TestGlobalHtml.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8322708 + * @summary Test to make sure global tags work properly + * @library /tools/lib ../../lib + * @modules jdk.javadoc/jdk.javadoc.internal.tool + * @build toolbox.ToolBox javadoc.tester.* + * @run main TestGlobalHtml + */ + +import javadoc.tester.JavadocTester; +import toolbox.ToolBox; + +import java.nio.file.Path; + +public class TestGlobalHtml extends JavadocTester { + ToolBox tb = new ToolBox(); + + public static void main(String... args) throws Exception { + var tester = new TestGlobalHtml(); + tester.runTests(); + } + + @Test + public void testGlobalTags() { + javadoc("--allow-script-in-comments", + "-d", + "out-global", + "-sourcepath", + testSrc, + "pkg1"); + checkExit(Exit.OK); + } + + @Test + public void testNegative(Path base) throws Exception { + Path src = base.resolve("src"); + tb.writeJavaFiles(src, + """ + package p; + /** + * class comment + * Hyperlink to the OpenJDK website + */ + public class C { + /** + *
+ *
+ *
+ *
+ * + *
+ */ + public C() { + } + } + """); + + javadoc("--allow-script-in-comments", + "-d", + "out-negative", + "-sourcepath", + src.toString(), + "p"); + checkExit(Exit.ERROR); + } +} diff --git a/test/langtools/jdk/javadoc/doclet/TestGlobalHtml/pkg1/C1.java b/test/langtools/jdk/javadoc/doclet/TestGlobalHtml/pkg1/C1.java new file mode 100644 index 00000000000..9f823fbad05 --- /dev/null +++ b/test/langtools/jdk/javadoc/doclet/TestGlobalHtml/pkg1/C1.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package pkg1; + + +/** + *
+ *

This content is inert and not interactable.

+ * + * Visit OpenJDK's Website! + * + *
+ * + *
+ *

This content is interactable.

+ * + * Visit OpenJDK's Website! + * + *
+ * + * + *
+ *

This is used in a jtreg test to check that global HTML tags are allowed

+ * + *
+ * + *

Here is a description of the class and methods:

+ * + *
    + *
  1. Has a default constructor

  2. + *
  3. Overrides toString method

  4. + *
  5. Is used for testing

  6. + *
+ * + *
+ *

C1

+ *

C1

+ *
+ */ +public class C1 { + + /** + *

+ * Default constructor for the {@code C1} class. (this content is draggable!)

+ *
+ *

Author: try editing this content!

+ *

Created on: June 14 2024

+ *
+ */ + public C1() { + } + + /** + * A method in C1 + * + *

simple method.

+ * + *
+ *

method m

+ *

the method m does nothing

+ *
+ */ + public void m() { + } + + /** + * A toString Override. + * + *

returns a String Object.

+ * + *
+ *

toString

+ *
+ * + * @return a string. + */ + @Override + public String toString() { + return "C1"; + } +}