diff --git a/app/assets/javascripts/discourse/app/lib/utilities.js b/app/assets/javascripts/discourse/app/lib/utilities.js index 92fa344134..cee9ce5faf 100644 --- a/app/assets/javascripts/discourse/app/lib/utilities.js +++ b/app/assets/javascripts/discourse/app/lib/utilities.js @@ -25,6 +25,10 @@ export function translateSize(size) { } export function escapeExpression(string) { + if (!string) { + return ""; + } + // don't escape SafeStrings, since they're already safe if (string instanceof Handlebars.SafeString) { return string.toString(); diff --git a/test/javascripts/lib/utilities-test.js b/test/javascripts/lib/utilities-test.js index f3d14a2657..1ac73ec865 100644 --- a/test/javascripts/lib/utilities-test.js +++ b/test/javascripts/lib/utilities-test.js @@ -1,5 +1,6 @@ /* global Int8Array:true */ import { + escapeExpression, emailValid, extractDomainFromUrl, avatarUrl, @@ -14,9 +15,30 @@ import { fillMissingDates, inCodeBlock } from "discourse/lib/utilities"; +import Handlebars from "handlebars"; QUnit.module("lib:utilities"); +QUnit.test("escapeExpression", assert => { + assert.equal( + escapeExpression(">"), + ">", + "escapes unsafe characters" + ); + + assert.equal( + escapeExpression(new Handlebars.SafeString(">")), + ">", + "does not double-escape safe strings" + ); + + assert.equal( + escapeExpression(undefined), + "", + "returns a falsy string when given a falsy value" + ); +}); + QUnit.test("emailValid", assert => { assert.ok( emailValid("Bob@example.com"),