From f9aeb346068b272048ba568eec0ac2467d8fb8fb Mon Sep 17 00:00:00 2001 From: emeric Date: Fri, 7 Feb 2020 13:51:04 +0100 Subject: [PATCH] Fixed badly escaped strings. Fixes #29 --- src/ui/MediaPlayer.cpp | 12 +++++------- src/utils/Utils.cpp | 26 +++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/ui/MediaPlayer.cpp b/src/ui/MediaPlayer.cpp index 8cca5ffb..f2302a9f 100644 --- a/src/ui/MediaPlayer.cpp +++ b/src/ui/MediaPlayer.cpp @@ -42,13 +42,8 @@ MediaPlayer::MediaPlayer() playNext(this, "playNext") { _title = bindNew("title"); - _title->setTextFormat(Wt::TextFormat::Plain); - _artist = bindNew("artist"); - _artist->setTextFormat(Wt::TextFormat::Plain); - _release = bindNew("release"); - _release->setTextFormat(Wt::TextFormat::Plain); wApp->doJavaScript("LMS.mediaplayer.init(" + jsRef() + ")"); @@ -91,28 +86,31 @@ MediaPlayer::loadTrack(Database::IdType trackId, bool play) LMS_LOG(UI, DEBUG) << "Running js = '" << oss.str() << "'"; + _title->setTextFormat(Wt::TextFormat::Plain); _title->setText(Wt::WString::fromUTF8(track->getName())); if (!artists.empty()) { + _artist->setTextFormat(Wt::TextFormat::Plain); _artist->setText(Wt::WString::fromUTF8(artists.front()->getName())); _artist->setLink(LmsApp->createArtistLink(artists.front())); } else { _artist->setText(""); - _artist->setLink(Wt::WLink()); + _artist->setLink({}); } if (track->getRelease()) { + _release->setTextFormat(Wt::TextFormat::Plain); _release->setText(Wt::WString::fromUTF8(track->getRelease()->getName())); _release->setLink(LmsApp->createReleaseLink(track->getRelease())); } else { _release->setText(""); - _release->setLink(Wt::WLink()); + _release->setLink({}); } wApp->doJavaScript(oss.str()); diff --git a/src/utils/Utils.cpp b/src/utils/Utils.cpp index 29d1a3a6..c609c091 100644 --- a/src/utils/Utils.cpp +++ b/src/utils/Utils.cpp @@ -134,7 +134,31 @@ replaceInString(const std::string& str, const std::string& from, const std::stri std::string jsEscape(const std::string& str) { - return replaceInString(str, "\'", "\\\'"); + static const std::unordered_map escapeMap + { + { '\\', "\\\\" }, + { '\n', "\\n" }, + { '\r', "\\r" }, + { '\t', "\\t" }, + { '"', "\\\"" }, + }; + + std::string escaped; + escaped.reserve(str.length()); + + for (const char c : str) + { + auto it {escapeMap.find(c)}; + if (it == std::cend(escapeMap)) + { + escaped += c; + continue; + } + + escaped += it->second; + } + + return escaped; } bool