8322708: Global HTML attributes are not allowed

Reviewed-by: jjg
This commit is contained in:
Nizar Benalla 2024-06-20 11:53:02 +00:00 committed by Chen Liang
parent 642084629a
commit 5cad0b4df7
4 changed files with 260 additions and 24 deletions

View File

@ -690,7 +690,9 @@ public class Checker extends DocTreePathScanner<Void, Void> {
}
// 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 -> { }

View File

@ -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) {

View File

@ -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
* <a href="https://openjdk.org/">Hyperlink to the OpenJDK website</a>
*/
public class C {
/**
* <form>
* <label for="methodname">Method name:</label><br>
* <input type="text" id="methodname" name="methodname"><br>
* <label for="paramname">Method Parameter:</label><br>
* <input type="text" id="paramname" name="paramname">
* </form>
*/
public C() {
}
}
""");
javadoc("--allow-script-in-comments",
"-d",
"out-negative",
"-sourcepath",
src.toString(),
"p");
checkExit(Exit.ERROR);
}
}

View File

@ -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;
/**
* <div inert>
* <p> This content is inert and not interactable.</p>
* <a href="https://openjdk.org/" title="OpenJDK's Website" tabindex="0">
* Visit OpenJDK's Website!
* </a>
* </div>
*
* <div>
* <p autocapitalize="on">This content is interactable.</p>
* <a href="https://openjdk.org/" title="OpenJDK's Website" tabindex="0">
* Visit OpenJDK's Website!
* </a>
* </div>
*
*
* <div dir="ltr" lang="en">
* <p itemprop="description">This is used in a jtreg test to check that global HTML tags are allowed</p>
* <ul spellcheck="true">
* <li>Class C</li>
* <li>Has a default constructor</li>
* </ul>
* </div>
*
* <p contenteditable="true" inputmode="text">Here is a description of the class and methods:</p>
*
* <ol draggable="true" tabindex="0">
* <li><p accesskey="1" data-element-type="constructor" title="Class Details">Has a default constructor</p></li>
* <li><p accesskey="2" data-element-type="toString" title="Methods Summary">Overrides toString method</p></li>
* <li><p accesskey="3" data-element-type="other" title="Usage Example">Is used for testing</p></li>
* </ol>
*
* <div itemscope>
* <p itemprop="name">C1</p>
* <p itemprop="description">C1</p>
* </div>
*/
public class C1 {
/**
* <p lang="en" accesskey="D" autocapitalize="on" draggable="true" spellcheck="false">
* Default constructor for the {@code C1} class. (this content is draggable!) </p>
* <div lang="en" contenteditable="true">
* <p itemprop="creator">Author: try editing this content!</p>
* <p title="Creation Date">Created on: June 14 2024</p>
* </div>
*/
public C1() {
}
/**
* A method in C1
*
* <p lang="en" inputmode="numeric">simple method.</p>
*
* <div itemprop="method" itemscope>
* <p itemprop="name">method m</p>
* <p itemprop="description">the method m does nothing</p>
* </div>
*/
public void m() {
}
/**
* A toString Override.
*
* <p dir="ltr" spellcheck="true">returns a String Object.</p>
*
* <div itemprop="method" itemscope>
* <p itemprop="name">toString</p>
* </div>
*
* @return a string.
*/
@Override
public String toString() {
return "C1";
}
}