diff options
author | Zipeng WU <zipeng.wu@sonarsource.com> | 2022-12-16 17:52:16 +0100 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2022-12-19 20:02:46 +0000 |
commit | cebbb10a17eae9927a120a749a83522c97ccd24a (patch) | |
tree | 3d952ae895f3cec956ed94e57d43d181eaf39a78 /sonar-markdown | |
parent | 4a756e45451336c8142ca3dc83e31a1b318f2614 (diff) | |
download | sonarqube-cebbb10a17eae9927a120a749a83522c97ccd24a.tar.gz sonarqube-cebbb10a17eae9927a120a749a83522c97ccd24a.zip |
SONAR-17579 Absolute links from user input should open in a new tab
Diffstat (limited to 'sonar-markdown')
3 files changed, 14 insertions, 5 deletions
diff --git a/sonar-markdown/src/main/java/org/sonar/markdown/HtmlLinkChannel.java b/sonar-markdown/src/main/java/org/sonar/markdown/HtmlLinkChannel.java index 66e88e15c5f..00370b2fea3 100644 --- a/sonar-markdown/src/main/java/org/sonar/markdown/HtmlLinkChannel.java +++ b/sonar-markdown/src/main/java/org/sonar/markdown/HtmlLinkChannel.java @@ -47,9 +47,10 @@ class HtmlLinkChannel extends RegexChannel<MarkdownOutput> { matcher.matches(); String content = matcher.group(1); String url = matcher.group(2); + boolean isRelativeUrl = !url.contains("://"); output.append("<a href=\""); output.append(url); - output.append("\" target=\"_blank\" rel=\"noopener noreferrer\">"); + output.append(isRelativeUrl ? "\">" : "\" target=\"_blank\" rel=\"noopener noreferrer\">"); output.append(content); output.append("</a>"); } diff --git a/sonar-markdown/src/main/java/org/sonar/markdown/HtmlUrlChannel.java b/sonar-markdown/src/main/java/org/sonar/markdown/HtmlUrlChannel.java index 50424d4b0c3..1d34ecdcf3c 100644 --- a/sonar-markdown/src/main/java/org/sonar/markdown/HtmlUrlChannel.java +++ b/sonar-markdown/src/main/java/org/sonar/markdown/HtmlUrlChannel.java @@ -33,10 +33,12 @@ class HtmlUrlChannel extends RegexChannel<MarkdownOutput> { @Override protected void consume(CharSequence token, MarkdownOutput output) { + String url = token.toString(); + boolean isRelativeUrl = !url.contains("://"); output.append("<a href=\""); - output.append(token); - output.append("\" target=\"_blank\" rel=\"noopener noreferrer\">"); - output.append(token); + output.append(url); + output.append(isRelativeUrl ? "\">" : "\" target=\"_blank\" rel=\"noopener noreferrer\">"); + output.append(url); output.append("</a>"); } } diff --git a/sonar-markdown/src/test/java/org/sonar/markdown/MarkdownTest.java b/sonar-markdown/src/test/java/org/sonar/markdown/MarkdownTest.java index b4838a12d8d..461b61230f2 100644 --- a/sonar-markdown/src/test/java/org/sonar/markdown/MarkdownTest.java +++ b/sonar-markdown/src/test/java/org/sonar/markdown/MarkdownTest.java @@ -26,12 +26,18 @@ import static org.assertj.core.api.Assertions.assertThat; public class MarkdownTest { @Test - public void shouldDecorateUrl() { + public void shouldDecorateAbsoluteUrl() { assertThat(Markdown.convertToHtml("http://google.com")) .isEqualTo("<a href=\"http://google.com\" target=\"_blank\" rel=\"noopener noreferrer\">http://google.com</a>"); } @Test + public void shouldDecorateRelativeUrl() { + assertThat(Markdown.convertToHtml("[Google](/google/com)")) + .isEqualTo("<a href=\"/google/com\">Google</a>"); + } + + @Test public void shouldDecorateDocumentedLink() { assertThat(Markdown.convertToHtml("For more details, please [check online documentation](http://docs.sonarqube.org/display/SONAR).")) .isEqualTo("For more details, please <a href=\"http://docs.sonarqube.org/display/SONAR\" target=\"_blank\" rel=\"noopener noreferrer\">check online documentation</a>."); |