diff --git a/app/assets/javascripts/discourse/lib/tooltip.js.es6 b/app/assets/javascripts/discourse/lib/tooltip.js.es6 index 6028a87d3a..227e0f6c3c 100644 --- a/app/assets/javascripts/discourse/lib/tooltip.js.es6 +++ b/app/assets/javascripts/discourse/lib/tooltip.js.es6 @@ -3,10 +3,13 @@ import { escapeExpression } from "discourse/lib/utilities"; const fadeSpeed = 300; const tooltipID = "#discourse-tooltip"; -export function showTooltip() { - const $this = $(this); +export function showTooltip($this) { const $parent = $this.offsetParent(); - const content = escapeExpression($this.attr("data-tooltip")); + // html tooltip are risky try your best to sanitize anything + // displayed as html to avoid XSS attacks + const content = $this.attr("data-tooltip") + ? escapeExpression($this.attr("data-tooltip")) + : $this.attr("data-html-tooltip") || ""; const retina = window.devicePixelRatio && window.devicePixelRatio > 1 ? "class='retina'" @@ -19,7 +22,7 @@ export function showTooltip() { hideTooltip(tooltipID); - $(this).after(` + $this.after(`
test
", + "it doesn’t escape HTML" + ); + + assert.equal( + fixture(".tooltip-content") + .text() + .trim(), + "test", + "it returns content as plain text" + ); });