Skip to content

Commit b23a451

Browse files
Iain Monrohiraiwa
Iain Monro
authored and
hiraiwa
committed
Escape HTML in HTML reports
Fixes #138
1 parent 61534f1 commit b23a451

File tree

5 files changed

+56
-30
lines changed

5 files changed

+56
-30
lines changed

scalac-scoverage-plugin/src/main/scala/scoverage/report/CodeGrid.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class CodeGrid(mFile: MeasuredFile, sourceEncoding: Option[String]) {
5757
sb append spanStart(cell.status)
5858
style = style2
5959
}
60-
sb.append(cell.char)
60+
xml.Utility.escape(cell.char.toString, sb)
6161
})
6262
sb append "</span>"
6363
sb.toString
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package coverage.sample
2+
3+
class ClassContainingHtml {
4+
def some_html = <div>HTML content</div>
5+
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package coverage.sample
22

3-
class Class1 {
3+
class ClassInMainDir {
44
def msg_coverage = println("measure coverage of code")
55
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package coverage.sample
22

3-
class Class2 {
3+
class ClassInSubDir {
44
def msg_test = println("test code")
55
}

scalac-scoverage-plugin/src/test/scala/scoverage/ScoverageHtmlWriterTest.scala

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,39 +12,49 @@ import org.scalatest.FunSuite
1212

1313
class ScoverageHtmlWriterTest extends FunSuite {
1414

15-
test("HTML coverage report has been created correctly") {
15+
val rootDirForClasses = new File(getClass.getResource("forHtmlWriter/src/main/scala/").getFile)
1616

17-
def tempDir(): File = {
18-
val dir = new File(IOUtils.getTempDirectory, UUID.randomUUID().toString)
19-
dir.mkdirs()
20-
dir.deleteOnExit()
21-
dir
22-
}
17+
def pathToClassFile(classLocation: String): String =
18+
new File(rootDirForClasses, classLocation).getCanonicalPath
2319

24-
val coverage = Coverage()
20+
val pathToClassContainingHtml = pathToClassFile("ClassContainingHtml.scala")
21+
val pathToClassInSubDir = pathToClassFile("subdir/ClassInSubDir.scala")
22+
val pathToClassInMainDir = pathToClassFile("ClassInMainDir.scala")
2523

26-
val class2 = new File(getClass.getResource("forHtmlWriter/src/main/scala/subdir/Class2.scala").getFile()).getCanonicalPath()
27-
val class1 = new File(getClass.getResource("forHtmlWriter/src/main/scala/Class1.scala").getFile()).getCanonicalPath()
24+
val statementForClassContainingHtml = Statement(pathToClassContainingHtml,
25+
Location("coverage.sample", "ClassContainingHtml", "ClassContainingHtml", ClassType.Class, "some_html", pathToClassInSubDir),
26+
3, 74, 97, 4, "<div>HTML content</div>",
27+
"scala.Predef.println", "Apply", false, 0)
28+
val statementForClassInSubDir = Statement(pathToClassInSubDir,
29+
Location("coverage.sample", "ClassInSubDir", "ClassInSubDir", ClassType.Class, "msg_test", pathToClassInSubDir),
30+
2, 64, 84, 4, "scala.this.Predef.println(\"test code\")",
31+
"scala.Predef.println", "Apply", false, 0)
32+
val statementForClassInMainDir = Statement(pathToClassInMainDir,
33+
Location("coverage.sample", "ClassInMainDir", "ClassInMainDir", ClassType.Class, "msg_coverage", pathToClassInMainDir),
34+
1, 69, 104, 4, "scala.this.Predef.println(\"measure coverage of code\")",
35+
"scala.Predef.println", "Apply", false, 0)
2836

29-
coverage.add(
30-
Statement(class2,
31-
Location("coverage.sample", "Class2", "coverage.sample.Class2", ClassType.Class, "msg_test", class2),
32-
2, 60, 80, 4, "scala.this.Predef.println(\"test code\")",
33-
"scala.Predef.println", "Apply", false, 0)
34-
)
37+
def createTemporaryDir(): File = {
38+
val dir = new File(IOUtils.getTempDirectory, UUID.randomUUID().toString)
39+
dir.mkdirs()
40+
dir.deleteOnExit()
41+
dir
42+
}
3543

36-
coverage.add(
37-
Statement(class1,
38-
Location("coverage.sample", "Class1", "coverage.sample.Class1", ClassType.Class, "msg_coverage", class1),
39-
1, 64, 99, 4, "scala.this.Predef.println(\"measure coverage of code\")",
40-
"scala.Predef.println", "Apply", false, 0)
41-
)
44+
def writeCoverageToTemporaryDir(coverage: Coverage): File = {
45+
val outputDir = createTemporaryDir()
46+
val htmlWriter = new ScoverageHtmlWriter(rootDirForClasses, outputDir)
47+
htmlWriter.write(coverage)
48+
outputDir
49+
}
4250

43-
val dir = getClass.getResource("forHtmlWriter/src/main/scala/").getFile()
44-
val outputDir = tempDir()
51+
test("HTML coverage report contains correct links") {
4552

46-
val htmlWriter = new ScoverageHtmlWriter(new File(dir), outputDir)
47-
htmlWriter.write(coverage)
53+
val coverage = Coverage()
54+
coverage.add(statementForClassInSubDir)
55+
coverage.add(statementForClassInMainDir)
56+
57+
val outputDir = writeCoverageToTemporaryDir(coverage)
4858

4959
val htmls = List("overview.html", "coverage.sample.html")
5060

@@ -57,7 +67,18 @@ class ScoverageHtmlWriterTest extends FunSuite {
5767
}
5868
}
5969

60-
assert( links.toSet == Set("Class1.scala.html", "subdir/Class2.scala.html") )
70+
assert( links.toSet == Set("ClassInMainDir.scala.html", "subdir/ClassInSubDir.scala.html") )
6171
}
6272
}
73+
74+
test("HTML coverage report escapes HTML") {
75+
76+
val coverage = Coverage()
77+
coverage.add(statementForClassContainingHtml)
78+
val outputDir = writeCoverageToTemporaryDir(coverage)
79+
80+
val contentsOfFileWithEmbeddedHtml = Source.fromFile(new File(outputDir, "ClassContainingHtml.scala.html")).getLines.mkString
81+
assert( !contentsOfFileWithEmbeddedHtml.contains("<div>HTML content</div>") )
82+
assert( contentsOfFileWithEmbeddedHtml.contains("&lt;div&gt;HTML content&lt;/div&gt;") )
83+
}
6384
}

0 commit comments

Comments
 (0)