SPE-2563: URL-encode and decode filenames to fix wide chars in javascript

This commit is contained in:
David Kocik 2024-11-14 11:03:50 +01:00
parent c6da4c1b0c
commit 668d73b2ea

View File

@ -10,6 +10,7 @@
#include "slic3r/GUI/WebViewPlatformUtils.hpp" #include "slic3r/GUI/WebViewPlatformUtils.hpp"
#include "slic3r/GUI/MsgDialog.hpp" #include "slic3r/GUI/MsgDialog.hpp"
#include "slic3r/GUI/Field.hpp" #include "slic3r/GUI/Field.hpp"
#include "slic3r/Utils/Http.hpp"
#include "libslic3r/AppConfig.hpp" #include "libslic3r/AppConfig.hpp"
#include "libslic3r/Config.hpp" #include "libslic3r/Config.hpp"
@ -1240,8 +1241,13 @@ void PrintablesWebViewPanel::on_printables_event_required_login(const std::strin
void PrintablesWebViewPanel::show_download_notification(const std::string& filename) void PrintablesWebViewPanel::show_download_notification(const std::string& filename)
{ {
std::string message_filename = GUI::format(_u8L("Downloading %1%"),filename); // Here we create a javascript that is injected to the webpage.
std::string message_dest = GUI::format(_u8L("To %1%"), escape_string_cstyle(wxGetApp().app_config->get("url_downloader_dest"))); // The script contains styles and everything.
// There was a trouble with passing wide characters to the script (it was displayed wrong)
// Solution is to URL-encode the strings here and pass it.
// Then inside javascript decode it.
const std::string message_filename = Http::url_encode(GUI::format(_u8L("Downloading %1%"),filename));
const std::string message_dest = Http::url_encode(GUI::format(_u8L("To %1%"), wxGetApp().app_config->get("url_downloader_dest")));
std::string script = GUI::format(R"( std::string script = GUI::format(R"(
// Inject custom CSS // Inject custom CSS
var style = document.createElement('style'); var style = document.createElement('style');
@ -1309,8 +1315,8 @@ void PrintablesWebViewPanel::show_download_notification(const std::string& filen
const notifDiv = document.createElement('div'); const notifDiv = document.createElement('div');
notifDiv.innerHTML = ` notifDiv.innerHTML = `
<div> <div>
<b>PrusaSlicer: </b>%1% <b>PrusaSlicer: </b>${decodeURIComponent('%1%')}
<br>%2% <br>${decodeURIComponent('%2%')}
</div> </div>
`; `;
notifDiv.className = 'notification-popup'; notifDiv.className = 'notification-popup';