diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ExternalSpecsWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ExternalSpecsWriter.java index 4583f78c59d..f71df85f64a 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ExternalSpecsWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ExternalSpecsWriter.java @@ -132,7 +132,7 @@ public class ExternalSpecsWriter extends HtmlDocletWriter { for (IndexItem ii : configuration.mainIndex.getItems(DocTree.Kind.SPEC)) { if (ii.getDocTree() instanceof SpecTree st) { String url = st.getURL().toString(); - String title = st.getTitle().toString(); + String title = ii.getLabel(); // normalized form of st.getTitle() itemsByTitle .computeIfAbsent(title, l -> new HashMap<>()) .computeIfAbsent(url, u -> new ArrayList<>()) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TagletWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TagletWriterImpl.java index dc3f51eb9a6..5481814907a 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TagletWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TagletWriterImpl.java @@ -222,9 +222,9 @@ public class TagletWriterImpl extends TagletWriter { DocTree searchTerm = tag.getSearchTerm(); String tagText = (searchTerm instanceof TextTree tt) ? tt.getBody() : ""; if (tagText.charAt(0) == '"' && tagText.charAt(tagText.length() - 1) == '"') { - tagText = tagText.substring(1, tagText.length() - 1) - .replaceAll("\\s+", " "); + tagText = tagText.substring(1, tagText.length() - 1); } + tagText = tagText.replaceAll("\\s+", " "); Content desc = htmlWriter.commentTagsToContent(element, tag.getDescription(), context.within(tag)); String descText = extractText(desc); @@ -771,7 +771,8 @@ public class TagletWriterImpl extends TagletWriter { String specTreeURL = specTree.getURL().getBody(); List extends DocTree> specTreeLabel = specTree.getTitle(); Content label = htmlWriter.commentTagsToContent(holder, specTreeLabel, isFirstSentence); - return getExternalSpecContent(holder, specTree, specTreeURL, textOf(specTreeLabel), label); + return getExternalSpecContent(holder, specTree, specTreeURL, + textOf(specTreeLabel).replaceAll("\\s+", " "), label); } Content getExternalSpecContent(Element holder, DocTree docTree, String url, String searchText, Content title) { diff --git a/test/langtools/jdk/javadoc/doclet/testSpecTag/TestSpecTag.java b/test/langtools/jdk/javadoc/doclet/testSpecTag/TestSpecTag.java index 02dbc3f3d75..d80fa6feca2 100644 --- a/test/langtools/jdk/javadoc/doclet/testSpecTag/TestSpecTag.java +++ b/test/langtools/jdk/javadoc/doclet/testSpecTag/TestSpecTag.java @@ -23,7 +23,7 @@ /* * @test - * @bug 6251738 8226279 8297802 8296546 + * @bug 6251738 8226279 8297802 8296546 8305407 * @summary JDK-8226279 javadoc should support a new at-spec tag * @library /tools/lib ../../lib * @modules jdk.javadoc/jdk.javadoc.internal.tool @@ -415,6 +415,51 @@ public class TestSpecTag extends JavadocTester { .replace("#FILE#", src.resolve("p").resolve("C.java").toString())); } + @Test + public void testDifferentWhitespaceTitlesForURL(Path base) throws IOException { + Path src = base.resolve("src"); + tb.writeJavaFiles(src, """ + package p; + /** Class C. */ + public class C { + private C() { } + + /** + * Method m1. + * @spec http://example.com/index.html abc def + */ + public void m1() { } + + /** + * Method m2. + * @spec http://example.com/index.html abc def + */ + public void m2() { } + } + """); + + javadoc("-d", base.resolve("out").toString(), + "--source-path", src.toString(), + "p"); + checkExit(Exit.OK); + + checkOutput(Output.OUT, false, "error"); + + checkOutput("external-specs.html", true, + """ +
"""); + } + @Test public void testMultipleURLsForTitle(Path base) throws IOException { Path src = base.resolve("src");