Browse Source

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().
Timothy Flynn 2 năm trước cách đây
mục cha
commit
db2ba5f1d9

+ 20 - 0
Userland/Libraries/LibWeb/Bindings/MainThreadVM.cpp

@@ -19,16 +19,25 @@
 #include <LibWeb/Bindings/MainThreadVM.h>
 #include <LibWeb/Bindings/WindowExposedInterfaces.h>
 #include <LibWeb/DOM/Document.h>
+#include <LibWeb/DOM/MutationType.h>
+#include <LibWeb/HTML/AttributeNames.h>
+#include <LibWeb/HTML/EventNames.h>
 #include <LibWeb/HTML/Location.h>
 #include <LibWeb/HTML/PromiseRejectionEvent.h>
 #include <LibWeb/HTML/Scripting/ClassicScript.h>
 #include <LibWeb/HTML/Scripting/Environments.h>
 #include <LibWeb/HTML/Scripting/ExceptionReporter.h>
 #include <LibWeb/HTML/Scripting/Fetching.h>
+#include <LibWeb/HTML/TagNames.h>
 #include <LibWeb/HTML/Window.h>
 #include <LibWeb/HTML/WindowProxy.h>
+#include <LibWeb/Namespace.h>
 #include <LibWeb/Platform/EventLoopPlugin.h>
+#include <LibWeb/SVG/AttributeNames.h>
+#include <LibWeb/SVG/TagNames.h>
+#include <LibWeb/UIEvents/EventNames.h>
 #include <LibWeb/WebIDL/AbstractOperations.h>
+#include <LibWeb/XHR/EventNames.h>
 
 namespace Web::Bindings {
 
@@ -64,6 +73,17 @@ ErrorOr<void> 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<WebEngineCustomData*>(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

+ 3 - 3
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<void> 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 {};
 }
 
 }

+ 3 - 0
Userland/Libraries/LibWeb/DOM/MutationType.h

@@ -7,6 +7,7 @@
 #pragma once
 
 #include <AK/DeprecatedFlyString.h>
+#include <AK/Error.h>
 
 namespace Web::DOM::MutationType {
 
@@ -19,4 +20,6 @@ namespace Web::DOM::MutationType {
 ENUMERATE_MUTATION_TYPES
 #undef __ENUMERATE_MUTATION_TYPE
 
+ErrorOr<void> initialize_strings();
+
 }

+ 3 - 3
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<void> 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 {};
 }
 
 }

+ 3 - 0
Userland/Libraries/LibWeb/HTML/AttributeNames.h

@@ -7,6 +7,7 @@
 #pragma once
 
 #include <AK/DeprecatedFlyString.h>
+#include <AK/Error.h>
 
 namespace Web {
 namespace HTML {
@@ -233,6 +234,8 @@ namespace AttributeNames {
 ENUMERATE_HTML_ATTRIBUTES
 #undef __ENUMERATE_HTML_ATTRIBUTE
 
+ErrorOr<void> initialize_strings();
+
 }
 
 bool is_boolean_attribute(DeprecatedFlyString const& attribute);

+ 3 - 3
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<void> 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 {};
 }
 
 }

+ 3 - 0
Userland/Libraries/LibWeb/HTML/EventNames.h

@@ -7,6 +7,7 @@
 #pragma once
 
 #include <AK/DeprecatedFlyString.h>
+#include <AK/Error.h>
 
 namespace Web::HTML::EventNames {
 
@@ -64,4 +65,6 @@ namespace Web::HTML::EventNames {
 ENUMERATE_HTML_EVENTS
 #undef __ENUMERATE_HTML_EVENT
 
+ErrorOr<void> initialize_strings();
+
 }

+ 3 - 3
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<void> 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 {};
 }
 
 }

+ 3 - 0
Userland/Libraries/LibWeb/HTML/TagNames.h

@@ -7,6 +7,7 @@
 #pragma once
 
 #include <AK/DeprecatedFlyString.h>
+#include <AK/Error.h>
 
 namespace Web::HTML::TagNames {
 
@@ -156,4 +157,6 @@ namespace Web::HTML::TagNames {
 ENUMERATE_HTML_TAGS
 #undef __ENUMERATE_HTML_TAG
 
+ErrorOr<void> initialize_strings();
+
 }

+ 3 - 3
Userland/Libraries/LibWeb/Namespace.cpp

@@ -12,11 +12,10 @@ namespace Web::Namespace {
 ENUMERATE_NAMESPACES
 #undef __ENUMERATE_NAMESPACE
 
-[[gnu::constructor]] static void initialize()
+ErrorOr<void> 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 {};
 }
 
 }

+ 3 - 0
Userland/Libraries/LibWeb/Namespace.h

@@ -7,6 +7,7 @@
 #pragma once
 
 #include <AK/DeprecatedFlyString.h>
+#include <AK/Error.h>
 
 namespace Web::Namespace {
 
@@ -22,4 +23,6 @@ namespace Web::Namespace {
 ENUMERATE_NAMESPACES
 #undef __ENUMERATE_NAMESPACE
 
+ErrorOr<void> initialize_strings();
+
 }

+ 3 - 3
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<void> 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 {};
 }
 
 }

+ 3 - 0
Userland/Libraries/LibWeb/SVG/AttributeNames.h

@@ -7,6 +7,7 @@
 #pragma once
 
 #include <AK/DeprecatedFlyString.h>
+#include <AK/Error.h>
 
 namespace Web::SVG::AttributeNames {
 
@@ -91,4 +92,6 @@ namespace Web::SVG::AttributeNames {
 ENUMERATE_SVG_ATTRIBUTES(__ENUMERATE_SVG_ATTRIBUTE)
 #undef __ENUMERATE_SVG_ATTRIBUTE
 
+ErrorOr<void> initialize_strings();
+
 }

+ 3 - 3
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<void> 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 {};
 }
 
 }

+ 3 - 0
Userland/Libraries/LibWeb/SVG/TagNames.h

@@ -7,6 +7,7 @@
 #pragma once
 
 #include <AK/DeprecatedFlyString.h>
+#include <AK/Error.h>
 
 namespace Web::SVG::TagNames {
 
@@ -35,4 +36,6 @@ namespace Web::SVG::TagNames {
 ENUMERATE_SVG_TAGS
 #undef __ENUMERATE_SVG_TAG
 
+ErrorOr<void> initialize_strings();
+
 }

+ 3 - 3
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<void> 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 {};
 }
 
 }

+ 3 - 0
Userland/Libraries/LibWeb/UIEvents/EventNames.h

@@ -8,6 +8,7 @@
 #pragma once
 
 #include <AK/DeprecatedFlyString.h>
+#include <AK/Error.h>
 
 namespace Web::UIEvents::EventNames {
 
@@ -33,4 +34,6 @@ namespace Web::UIEvents::EventNames {
 ENUMERATE_UI_EVENTS
 #undef __ENUMERATE_UI_EVENT
 
+ErrorOr<void> initialize_strings();
+
 }

+ 3 - 3
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<void> 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 {};
 }
 
 }

+ 3 - 0
Userland/Libraries/LibWeb/XHR/EventNames.h

@@ -7,6 +7,7 @@
 #pragma once
 
 #include <AK/DeprecatedFlyString.h>
+#include <AK/Error.h>
 
 namespace Web::XHR::EventNames {
 
@@ -24,4 +25,6 @@ namespace Web::XHR::EventNames {
 ENUMERATE_XHR_EVENTS
 #undef __ENUMERATE_XHR_EVENT
 
+ErrorOr<void> initialize_strings();
+
 }