8194953: doclet corrupts HTML files when adding navbar

Reviewed-by: jjg
This commit is contained in:
Kumar Srinivasan 2018-01-16 19:26:48 -08:00
parent aa4c936f54
commit b5cb43b1de
7 changed files with 299 additions and 14 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2017, 2018, 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
@ -25,10 +25,17 @@
package jdk.javadoc.internal.doclets.formats.html;
import com.sun.source.doctree.AttributeTree;
import com.sun.source.doctree.AttributeTree.ValueKind;
import com.sun.source.doctree.DocRootTree;
import com.sun.source.doctree.DocTree;
import com.sun.source.doctree.EndElementTree;
import com.sun.source.doctree.LinkTree;
import com.sun.source.doctree.StartElementTree;
import com.sun.source.doctree.TextTree;
import com.sun.source.util.SimpleDocTreeVisitor;
import com.sun.tools.doclint.HtmlTag;
import com.sun.tools.doclint.HtmlTag.Attr;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.DocFileElement;
@ -123,13 +130,14 @@ public class DocFilesHandlerImpl implements DocFilesHandler {
configuration.messages.warning("doclet.Copy_Overwrite_warning",
srcfile.getPath(), dstdir.getPath());
} else {
if (Utils.toLowerCase(srcfile.getPath()).endsWith(".html")) {
if (handleHtmlFile(srcfile, dstDocPath)) {
continue;
}
}
configuration.messages.notice("doclet.Copying_File_0_To_Dir_1",
srcfile.getPath(), dstdir.getPath());
if (Utils.toLowerCase(srcfile.getPath()).endsWith(".html")) {
handleHtmlFile(srcfile, dstDocPath);
} else {
destfile.copyFile(srcfile);
}
destfile.copyFile(srcfile);
}
} else if (srcfile.isDirectory()) {
if (configuration.copydocfilesubdirs
@ -141,19 +149,23 @@ public class DocFilesHandlerImpl implements DocFilesHandler {
}
}
private void handleHtmlFile(DocFile srcfile, DocPath dstPath) throws DocFileIOException {
DocPath dfilePath = dstPath.resolve(srcfile.getName());
HtmlDocletWriter docletWriter = new DocFileWriter(configuration, dfilePath, element);
private boolean handleHtmlFile(DocFile srcfile, DocPath dstPath) throws DocFileIOException {
Utils utils = configuration.utils;
FileObject fileObject = srcfile.getFileObject();
DocFileElement dfElement = new DocFileElement(element, fileObject);
if (shouldPassThrough(utils.getPreamble(dfElement))) {
return false;
}
DocPath dfilePath = dstPath.resolve(srcfile.getName());
HtmlDocletWriter docletWriter = new DocFileWriter(configuration, dfilePath, element);
configuration.messages.notice("doclet.Generating_0", docletWriter.filename);
String title = getWindowTitle(docletWriter, dfElement).trim();
HtmlTree htmlContent = docletWriter.getBody(true, title);
docletWriter.addTop(htmlContent);
docletWriter.addNavLinks(true, htmlContent);
List<? extends DocTree> fullBody = utils.getFullBody(dfElement);
Content bodyContent = docletWriter.commentTagsToContent(null, dfElement, fullBody, false);
@ -163,6 +175,69 @@ public class DocFilesHandlerImpl implements DocFilesHandler {
docletWriter.addNavLinks(false, htmlContent);
docletWriter.addBottom(htmlContent);
docletWriter.printHtmlDocument(Collections.emptyList(), false, htmlContent);
return true;
}
private boolean shouldPassThrough(List<? extends DocTree> dtrees) {
SimpleDocTreeVisitor<Boolean, Boolean> check = new SimpleDocTreeVisitor<Boolean, Boolean>() {
@Override
public Boolean visitStartElement(StartElementTree node, Boolean p) {
if (Utils.toLowerCase(node.getName().toString()).equals((Attr.STYLE.getText()))) {
return true;
}
if (Utils.toLowerCase(node.getName().toString()).equals(HtmlTag.LINK.getText())) {
for (DocTree dt : node.getAttributes()) {
if (this.visit(dt, true))
return true;
}
}
return false;
}
@Override
public Boolean visitAttribute(AttributeTree node, Boolean p) {
if (p == null || p == false) {
return false;
}
if (Utils.toLowerCase(node.getName().toString()).equals("rel")) {
for (DocTree dt : node.getValue()) {
Boolean found = new SimpleDocTreeVisitor<Boolean, ValueKind>() {
@Override
public Boolean visitText(TextTree node, ValueKind valueKind) {
switch (valueKind) {
case EMPTY:
return false;
default:
return Utils.toLowerCase(node.getBody()).equals("stylesheet");
}
}
@Override
protected Boolean defaultAction(DocTree node, ValueKind valueKind) {
return false;
}
}.visit(dt, node.getValueKind());
if (found)
return true;
}
}
return false;
}
@Override
protected Boolean defaultAction(DocTree node, Boolean p) {
return false;
}
};
for (DocTree dt : dtrees) {
if (check.visit(dt, false))
return true;
}
return false;
}
private String getWindowTitle(HtmlDocletWriter docletWriter, Element element) {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2016, 2018, 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
@ -23,7 +23,7 @@
/*
* @test
* @bug 8157349 8185985
* @bug 8157349 8185985 8194953
* @summary test copy of doc-files, and its contents for HTML meta content.
* @library ../lib
* @modules jdk.javadoc/jdk.javadoc.internal.tool
@ -258,4 +258,16 @@ public class TestCopyFiles extends JavadocTester {
"A named package in an unnamed module"
);
}
@Test
void testCopyThrough() {
javadoc("-d", "copy",
"-sourcepath", testSrc("packages"),
"p2");
checkExit(Exit.OK);
checkOutput("p2/doc-files/case1.html", true, "<!-- Generated by javadoc");
checkOutput("p2/doc-files/case2.html", false, "<!-- Generated by javadoc");
checkOutput("p2/doc-files/case3.html", false, "<!-- Generated by javadoc");
checkOutput("p2/doc-files/case4.html", false, "<!-- Generated by javadoc");
}
}

View File

@ -0,0 +1,34 @@
/*
* Copyright (c) 2018, 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* 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.
*/
/**
* A test class.
*/
package p2;
/**
* A test class.
*/
public class Foo {}

View File

@ -0,0 +1,39 @@
<!doctype html>
<!--
/*
* Copyright (c) 2018, 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* 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.
*/
-->
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Case 1</title>
</head>
<body>
This should be translated with a navbar, and should have
the "Generated by javadoc blah" signature.
</body>
</html>

View File

@ -0,0 +1,44 @@
<!doctype html>
<!--
/*
* Copyright (c) 2018, 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* 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.
*/
-->
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Case 2</title>
<style type="text/css">
body {
font-family: Helvetica, Arial, sans-serif;
font-size: 14px;
}
</style>
</head>
<body>
This should be copied directly, with no modifications.
</body>
</html>

View File

@ -0,0 +1,42 @@
<!doctype html>
<!--
/*
* Copyright (c) 2018, 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* 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.
*/
-->
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Case 3</title>
<style>
h1 {color:red;}
p {color:blue;}
</style>
</head>
<body>
This should be copied directly, with no modifications.
</body>
</html>

View File

@ -0,0 +1,39 @@
<!doctype html>
<!--
/*
* Copyright (c) 2018, 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* 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.
*/
-->
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Case 3</title>
<link rel="stylesheet" type="text/css" href="theme.css">
</head>
<body>
This should be copied directly, with no modifications.
</body>
</html>