mirror of
https://github.com/Zelda64Recomp/Zelda64Recomp.git
synced 2025-10-30 08:03:03 +00:00
Fix race condition crash when setting element text, bump version to 1.2.0-rc3
This commit is contained in:
parent
7a59d7dca5
commit
4934a04d8a
3 changed files with 10 additions and 23 deletions
|
|
@ -48,7 +48,7 @@
|
||||||
|
|
||||||
#include "../../lib/rt64/src/contrib/stb/stb_image.h"
|
#include "../../lib/rt64/src/contrib/stb/stb_image.h"
|
||||||
|
|
||||||
const std::string version_string = "1.2.0-rc2";
|
const std::string version_string = "1.2.0-rc3";
|
||||||
|
|
||||||
template<typename... Ts>
|
template<typename... Ts>
|
||||||
void exit_error(const char* str, Ts ...args) {
|
void exit_error(const char* str, Ts ...args) {
|
||||||
|
|
|
||||||
|
|
@ -355,30 +355,16 @@ bool Element::is_enabled() const {
|
||||||
return enabled && !disabled_from_parent;
|
return enabled && !disabled_from_parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adapted from RmlUi's `EncodeRml`.
|
|
||||||
std::string escape_rml(std::string_view string)
|
|
||||||
{
|
|
||||||
std::string result;
|
|
||||||
result.reserve(string.size());
|
|
||||||
for (char c : string)
|
|
||||||
{
|
|
||||||
switch (c)
|
|
||||||
{
|
|
||||||
case '<': result += "<"; break;
|
|
||||||
case '>': result += ">"; break;
|
|
||||||
case '&': result += "&"; break;
|
|
||||||
case '"': result += """; break;
|
|
||||||
case '\n': result += "<br/>"; break;
|
|
||||||
default: result += c; break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Element::set_text(std::string_view text) {
|
void Element::set_text(std::string_view text) {
|
||||||
if (can_set_text) {
|
if (can_set_text) {
|
||||||
// Escape the string into Rml to prevent element injection.
|
if (text_element == nullptr) {
|
||||||
base->SetInnerRML(escape_rml(text));
|
Rml::ElementPtr text_element_owning = get_current_context().get_document()->CreateTextNode(std::string{text});
|
||||||
|
text_element = rmlui_static_cast<Rml::ElementText*>(text_element_owning.get());
|
||||||
|
base->AppendChild(std::move(text_element_owning));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
text_element->SetText(std::string{text});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
assert(false && "Attempted to set text of an element that cannot have its text set.");
|
assert(false && "Attempted to set text of an element that cannot have its text set.");
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ class Element : public Style, public Rml::EventListener {
|
||||||
friend class ContextId; // To allow ContextId to call the handle_event method directly.
|
friend class ContextId; // To allow ContextId to call the handle_event method directly.
|
||||||
private:
|
private:
|
||||||
Rml::Element *base = nullptr;
|
Rml::Element *base = nullptr;
|
||||||
|
Rml::ElementText *text_element = nullptr;
|
||||||
Rml::ElementPtr base_owning = {};
|
Rml::ElementPtr base_owning = {};
|
||||||
uint32_t events_enabled = 0;
|
uint32_t events_enabled = 0;
|
||||||
std::vector<Style *> styles;
|
std::vector<Style *> styles;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue