From db2ba5f1d9234b51a547ce01c3da8ecd5006ee87 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Sat, 18 Mar 2023 10:39:37 -0400 Subject: [PATCH] LibWeb: Initialize static web strings during main-thread VM creation These are currently initialized in a [[gnu::constructor]], which has a weird initialization order. These constructors are invoked before main() and, incidentally, before any user-defined default constructors of the static strings they are initializing. This will become an issue when these strings are ported to FlyString, which has a user-defined default constructor. In that scenario, when the FlyString constructor is executed after the [[gnu::constructor]], the strings will be "reset" to the empty string. Instead of relying on a non-standard compiler extension here, let's just initialize these strings explicitly during main-thread VM creation, as this now happens in WebContent's main(). --- .../LibWeb/Bindings/MainThreadVM.cpp | 20 +++++++++++++++++++ .../Libraries/LibWeb/DOM/MutationType.cpp | 6 +++--- Userland/Libraries/LibWeb/DOM/MutationType.h | 3 +++ .../Libraries/LibWeb/HTML/AttributeNames.cpp | 6 +++--- .../Libraries/LibWeb/HTML/AttributeNames.h | 3 +++ Userland/Libraries/LibWeb/HTML/EventNames.cpp | 6 +++--- Userland/Libraries/LibWeb/HTML/EventNames.h | 3 +++ Userland/Libraries/LibWeb/HTML/TagNames.cpp | 6 +++--- Userland/Libraries/LibWeb/HTML/TagNames.h | 3 +++ Userland/Libraries/LibWeb/Namespace.cpp | 6 +++--- Userland/Libraries/LibWeb/Namespace.h | 3 +++ .../Libraries/LibWeb/SVG/AttributeNames.cpp | 6 +++--- .../Libraries/LibWeb/SVG/AttributeNames.h | 3 +++ Userland/Libraries/LibWeb/SVG/TagNames.cpp | 6 +++--- Userland/Libraries/LibWeb/SVG/TagNames.h | 3 +++ .../Libraries/LibWeb/UIEvents/EventNames.cpp | 6 +++--- .../Libraries/LibWeb/UIEvents/EventNames.h | 3 +++ Userland/Libraries/LibWeb/XHR/EventNames.cpp | 6 +++--- Userland/Libraries/LibWeb/XHR/EventNames.h | 3 +++ 19 files changed, 74 insertions(+), 27 deletions(-) diff --git a/Userland/Libraries/LibWeb/Bindings/MainThreadVM.cpp b/Userland/Libraries/LibWeb/Bindings/MainThreadVM.cpp index 63ee19ef933..7844b16c607 100644 --- a/Userland/Libraries/LibWeb/Bindings/MainThreadVM.cpp +++ b/Userland/Libraries/LibWeb/Bindings/MainThreadVM.cpp @@ -19,16 +19,25 @@ #include #include #include +#include +#include +#include #include #include #include #include #include #include +#include #include #include +#include #include +#include +#include +#include #include +#include namespace Web::Bindings { @@ -64,6 +73,17 @@ ErrorOr initialize_main_thread_vm() // This avoids doing an exhaustive garbage collection on process exit. s_main_thread_vm->ref(); + // These strings could potentially live on the VM similar to CommonPropertyNames. + TRY(DOM::MutationType::initialize_strings()); + TRY(HTML::AttributeNames::initialize_strings()); + TRY(HTML::EventNames::initialize_strings()); + TRY(HTML::TagNames::initialize_strings()); + TRY(Namespace::initialize_strings()); + TRY(SVG::AttributeNames::initialize_strings()); + TRY(SVG::TagNames::initialize_strings()); + TRY(UIEvents::EventNames::initialize_strings()); + TRY(XHR::EventNames::initialize_strings()); + static_cast(s_main_thread_vm->custom_data())->event_loop.set_vm(*s_main_thread_vm); // 8.1.5.1 HostEnsureCanAddPrivateElement(O), https://html.spec.whatwg.org/multipage/webappapis.html#the-hostensurecanaddprivateelement-implementation diff --git a/Userland/Libraries/LibWeb/DOM/MutationType.cpp b/Userland/Libraries/LibWeb/DOM/MutationType.cpp index 976c70a0ec4..b14516dfb2a 100644 --- a/Userland/Libraries/LibWeb/DOM/MutationType.cpp +++ b/Userland/Libraries/LibWeb/DOM/MutationType.cpp @@ -12,17 +12,17 @@ namespace Web::DOM::MutationType { ENUMERATE_MUTATION_TYPES #undef __ENUMERATE_MUTATION_TYPE -[[gnu::constructor]] static void initialize() +ErrorOr initialize_strings() { static bool s_initialized = false; - if (s_initialized) - return; + VERIFY(!s_initialized); #define __ENUMERATE_MUTATION_TYPE(name) name = #name; ENUMERATE_MUTATION_TYPES #undef __ENUMERATE_MUTATION_TYPE s_initialized = true; + return {}; } } diff --git a/Userland/Libraries/LibWeb/DOM/MutationType.h b/Userland/Libraries/LibWeb/DOM/MutationType.h index e7ddb4c7139..709a596e30e 100644 --- a/Userland/Libraries/LibWeb/DOM/MutationType.h +++ b/Userland/Libraries/LibWeb/DOM/MutationType.h @@ -7,6 +7,7 @@ #pragma once #include +#include namespace Web::DOM::MutationType { @@ -19,4 +20,6 @@ namespace Web::DOM::MutationType { ENUMERATE_MUTATION_TYPES #undef __ENUMERATE_MUTATION_TYPE +ErrorOr initialize_strings(); + } diff --git a/Userland/Libraries/LibWeb/HTML/AttributeNames.cpp b/Userland/Libraries/LibWeb/HTML/AttributeNames.cpp index 3d4d0b88fa4..ead23b4133c 100644 --- a/Userland/Libraries/LibWeb/HTML/AttributeNames.cpp +++ b/Userland/Libraries/LibWeb/HTML/AttributeNames.cpp @@ -14,11 +14,10 @@ namespace AttributeNames { ENUMERATE_HTML_ATTRIBUTES #undef __ENUMERATE_HTML_ATTRIBUTE -[[gnu::constructor]] static void initialize() +ErrorOr initialize_strings() { static bool s_initialized = false; - if (s_initialized) - return; + VERIFY(!s_initialized); #define __ENUMERATE_HTML_ATTRIBUTE(name) \ name = #name; @@ -36,6 +35,7 @@ ENUMERATE_HTML_ATTRIBUTES http_equiv = "http-equiv"; s_initialized = true; + return {}; } } diff --git a/Userland/Libraries/LibWeb/HTML/AttributeNames.h b/Userland/Libraries/LibWeb/HTML/AttributeNames.h index 399a820812d..10cf26c8c05 100644 --- a/Userland/Libraries/LibWeb/HTML/AttributeNames.h +++ b/Userland/Libraries/LibWeb/HTML/AttributeNames.h @@ -7,6 +7,7 @@ #pragma once #include +#include namespace Web { namespace HTML { @@ -233,6 +234,8 @@ namespace AttributeNames { ENUMERATE_HTML_ATTRIBUTES #undef __ENUMERATE_HTML_ATTRIBUTE +ErrorOr initialize_strings(); + } bool is_boolean_attribute(DeprecatedFlyString const& attribute); diff --git a/Userland/Libraries/LibWeb/HTML/EventNames.cpp b/Userland/Libraries/LibWeb/HTML/EventNames.cpp index f0c0d2e58d1..2824b907788 100644 --- a/Userland/Libraries/LibWeb/HTML/EventNames.cpp +++ b/Userland/Libraries/LibWeb/HTML/EventNames.cpp @@ -12,11 +12,10 @@ namespace Web::HTML::EventNames { ENUMERATE_HTML_EVENTS #undef __ENUMERATE_HTML_EVENT -[[gnu::constructor]] static void initialize() +ErrorOr initialize_strings() { static bool s_initialized = false; - if (s_initialized) - return; + VERIFY(!s_initialized); #define __ENUMERATE_HTML_EVENT(name) \ name = #name; @@ -24,6 +23,7 @@ ENUMERATE_HTML_EVENTS #undef __ENUMERATE_HTML_EVENT s_initialized = true; + return {}; } } diff --git a/Userland/Libraries/LibWeb/HTML/EventNames.h b/Userland/Libraries/LibWeb/HTML/EventNames.h index 911f2bd5cf0..a55b95813c8 100644 --- a/Userland/Libraries/LibWeb/HTML/EventNames.h +++ b/Userland/Libraries/LibWeb/HTML/EventNames.h @@ -7,6 +7,7 @@ #pragma once #include +#include namespace Web::HTML::EventNames { @@ -64,4 +65,6 @@ namespace Web::HTML::EventNames { ENUMERATE_HTML_EVENTS #undef __ENUMERATE_HTML_EVENT +ErrorOr initialize_strings(); + } diff --git a/Userland/Libraries/LibWeb/HTML/TagNames.cpp b/Userland/Libraries/LibWeb/HTML/TagNames.cpp index 435755b9f2c..3d0b1913039 100644 --- a/Userland/Libraries/LibWeb/HTML/TagNames.cpp +++ b/Userland/Libraries/LibWeb/HTML/TagNames.cpp @@ -12,11 +12,10 @@ namespace Web::HTML::TagNames { ENUMERATE_HTML_TAGS #undef __ENUMERATE_HTML_TAG -[[gnu::constructor]] static void initialize() +ErrorOr initialize_strings() { static bool s_initialized = false; - if (s_initialized) - return; + VERIFY(!s_initialized); #define __ENUMERATE_HTML_TAG(name) \ name = #name; @@ -26,6 +25,7 @@ ENUMERATE_HTML_TAGS template_ = "template"; s_initialized = true; + return {}; } } diff --git a/Userland/Libraries/LibWeb/HTML/TagNames.h b/Userland/Libraries/LibWeb/HTML/TagNames.h index e8fb8dd0497..eb0efb76042 100644 --- a/Userland/Libraries/LibWeb/HTML/TagNames.h +++ b/Userland/Libraries/LibWeb/HTML/TagNames.h @@ -7,6 +7,7 @@ #pragma once #include +#include namespace Web::HTML::TagNames { @@ -156,4 +157,6 @@ namespace Web::HTML::TagNames { ENUMERATE_HTML_TAGS #undef __ENUMERATE_HTML_TAG +ErrorOr initialize_strings(); + } diff --git a/Userland/Libraries/LibWeb/Namespace.cpp b/Userland/Libraries/LibWeb/Namespace.cpp index eb05860f045..fa44dfc8229 100644 --- a/Userland/Libraries/LibWeb/Namespace.cpp +++ b/Userland/Libraries/LibWeb/Namespace.cpp @@ -12,11 +12,10 @@ namespace Web::Namespace { ENUMERATE_NAMESPACES #undef __ENUMERATE_NAMESPACE -[[gnu::constructor]] static void initialize() +ErrorOr initialize_strings() { static bool s_initialized = false; - if (s_initialized) - return; + VERIFY(!s_initialized); #define __ENUMERATE_NAMESPACE(name, namespace_) \ name = namespace_; @@ -24,6 +23,7 @@ ENUMERATE_NAMESPACES #undef __ENUMERATE_NAMESPACE s_initialized = true; + return {}; } } diff --git a/Userland/Libraries/LibWeb/Namespace.h b/Userland/Libraries/LibWeb/Namespace.h index 330663dfbf9..ea13e258745 100644 --- a/Userland/Libraries/LibWeb/Namespace.h +++ b/Userland/Libraries/LibWeb/Namespace.h @@ -7,6 +7,7 @@ #pragma once #include +#include namespace Web::Namespace { @@ -22,4 +23,6 @@ namespace Web::Namespace { ENUMERATE_NAMESPACES #undef __ENUMERATE_NAMESPACE +ErrorOr initialize_strings(); + } diff --git a/Userland/Libraries/LibWeb/SVG/AttributeNames.cpp b/Userland/Libraries/LibWeb/SVG/AttributeNames.cpp index b24c69a2d86..c01f0cb4087 100644 --- a/Userland/Libraries/LibWeb/SVG/AttributeNames.cpp +++ b/Userland/Libraries/LibWeb/SVG/AttributeNames.cpp @@ -12,11 +12,10 @@ namespace Web::SVG::AttributeNames { ENUMERATE_SVG_ATTRIBUTES(__ENUMERATE_SVG_ATTRIBUTE) #undef __ENUMERATE_SVG_ATTRIBUTE -[[gnu::constructor]] static void initialize() +ErrorOr initialize_strings() { static bool s_initialized = false; - if (s_initialized) - return; + VERIFY(!s_initialized); #define __ENUMERATE_SVG_ATTRIBUTE(name) \ name = #name; @@ -24,6 +23,7 @@ ENUMERATE_SVG_ATTRIBUTES(__ENUMERATE_SVG_ATTRIBUTE) #undef __ENUMERATE_SVG_ATTRIBUTE s_initialized = true; + return {}; } } diff --git a/Userland/Libraries/LibWeb/SVG/AttributeNames.h b/Userland/Libraries/LibWeb/SVG/AttributeNames.h index 29c64e9718b..786de7c4860 100644 --- a/Userland/Libraries/LibWeb/SVG/AttributeNames.h +++ b/Userland/Libraries/LibWeb/SVG/AttributeNames.h @@ -7,6 +7,7 @@ #pragma once #include +#include namespace Web::SVG::AttributeNames { @@ -91,4 +92,6 @@ namespace Web::SVG::AttributeNames { ENUMERATE_SVG_ATTRIBUTES(__ENUMERATE_SVG_ATTRIBUTE) #undef __ENUMERATE_SVG_ATTRIBUTE +ErrorOr initialize_strings(); + } diff --git a/Userland/Libraries/LibWeb/SVG/TagNames.cpp b/Userland/Libraries/LibWeb/SVG/TagNames.cpp index fe6b698a324..a2c4a5b5748 100644 --- a/Userland/Libraries/LibWeb/SVG/TagNames.cpp +++ b/Userland/Libraries/LibWeb/SVG/TagNames.cpp @@ -12,17 +12,17 @@ namespace Web::SVG::TagNames { ENUMERATE_SVG_TAGS #undef __ENUMERATE_SVG_TAG -[[gnu::constructor]] static void initialize() +ErrorOr initialize_strings() { static bool s_initialized = false; - if (s_initialized) - return; + VERIFY(!s_initialized); #define __ENUMERATE_SVG_TAG(name) name = #name; ENUMERATE_SVG_TAGS #undef __ENUMERATE_SVG_TAG s_initialized = true; + return {}; } } diff --git a/Userland/Libraries/LibWeb/SVG/TagNames.h b/Userland/Libraries/LibWeb/SVG/TagNames.h index f7794445918..449c8ac2dc3 100644 --- a/Userland/Libraries/LibWeb/SVG/TagNames.h +++ b/Userland/Libraries/LibWeb/SVG/TagNames.h @@ -7,6 +7,7 @@ #pragma once #include +#include namespace Web::SVG::TagNames { @@ -35,4 +36,6 @@ namespace Web::SVG::TagNames { ENUMERATE_SVG_TAGS #undef __ENUMERATE_SVG_TAG +ErrorOr initialize_strings(); + } diff --git a/Userland/Libraries/LibWeb/UIEvents/EventNames.cpp b/Userland/Libraries/LibWeb/UIEvents/EventNames.cpp index a84be33b56a..2f2ed22ca56 100644 --- a/Userland/Libraries/LibWeb/UIEvents/EventNames.cpp +++ b/Userland/Libraries/LibWeb/UIEvents/EventNames.cpp @@ -12,11 +12,10 @@ namespace Web::UIEvents::EventNames { ENUMERATE_UI_EVENTS #undef __ENUMERATE_UI_EVENT -[[gnu::constructor]] static void initialize() +ErrorOr initialize_strings() { static bool s_initialized = false; - if (s_initialized) - return; + VERIFY(!s_initialized); #define __ENUMERATE_UI_EVENT(name) \ name = #name; @@ -24,6 +23,7 @@ ENUMERATE_UI_EVENTS #undef __ENUMERATE_UI_EVENT s_initialized = true; + return {}; } } diff --git a/Userland/Libraries/LibWeb/UIEvents/EventNames.h b/Userland/Libraries/LibWeb/UIEvents/EventNames.h index 22e0892804e..27dad4c5b1c 100644 --- a/Userland/Libraries/LibWeb/UIEvents/EventNames.h +++ b/Userland/Libraries/LibWeb/UIEvents/EventNames.h @@ -8,6 +8,7 @@ #pragma once #include +#include namespace Web::UIEvents::EventNames { @@ -33,4 +34,6 @@ namespace Web::UIEvents::EventNames { ENUMERATE_UI_EVENTS #undef __ENUMERATE_UI_EVENT +ErrorOr initialize_strings(); + } diff --git a/Userland/Libraries/LibWeb/XHR/EventNames.cpp b/Userland/Libraries/LibWeb/XHR/EventNames.cpp index b3848d0b9e5..90b747c34e6 100644 --- a/Userland/Libraries/LibWeb/XHR/EventNames.cpp +++ b/Userland/Libraries/LibWeb/XHR/EventNames.cpp @@ -12,11 +12,10 @@ namespace Web::XHR::EventNames { ENUMERATE_XHR_EVENTS #undef __ENUMERATE_XHR_EVENT -[[gnu::constructor]] static void initialize() +ErrorOr initialize_strings() { static bool s_initialized = false; - if (s_initialized) - return; + VERIFY(!s_initialized); #define __ENUMERATE_XHR_EVENT(name) \ name = #name; @@ -24,6 +23,7 @@ ENUMERATE_XHR_EVENTS #undef __ENUMERATE_XHR_EVENT s_initialized = true; + return {}; } } diff --git a/Userland/Libraries/LibWeb/XHR/EventNames.h b/Userland/Libraries/LibWeb/XHR/EventNames.h index 9cf36a61027..a543cea26cc 100644 --- a/Userland/Libraries/LibWeb/XHR/EventNames.h +++ b/Userland/Libraries/LibWeb/XHR/EventNames.h @@ -7,6 +7,7 @@ #pragma once #include +#include namespace Web::XHR::EventNames { @@ -24,4 +25,6 @@ namespace Web::XHR::EventNames { ENUMERATE_XHR_EVENTS #undef __ENUMERATE_XHR_EVENT +ErrorOr initialize_strings(); + }