Просмотр исходного кода

LibWeb: Always assert that principal realm returns a principal realm

There was a bug in the HTML proposal where a synthetic realm settings
object's principal realm was a shadow realm if there were nested shadow
realms, which this assertion catches more directly (rather than later
down the track, where it is used).

We were meant to also assert for this case, but we were previously
returning early.
Shannon Booth 8 месяцев назад
Родитель
Сommit
bb10b0e301

+ 5 - 5
Libraries/LibWeb/HTML/Scripting/Environments.cpp

@@ -360,19 +360,19 @@ JS::Realm& current_principal_realm()
 }
 }
 
 
 // https://whatpr.org/html/9893/webappapis.html#concept-principal-realm-of-realm
 // https://whatpr.org/html/9893/webappapis.html#concept-principal-realm-of-realm
-JS::Realm& principal_realm(JS::Realm& realm)
+JS::Realm& principal_realm(GC::Ref<JS::Realm> realm)
 {
 {
-    VERIFY(realm.host_defined());
+    VERIFY(realm->host_defined());
 
 
     // 1. If realm.[[HostDefined]] is a synthetic realm settings object, then:
     // 1. If realm.[[HostDefined]] is a synthetic realm settings object, then:
-    if (is<Bindings::SyntheticHostDefined>(*realm.host_defined())) {
+    if (is<Bindings::SyntheticHostDefined>(*realm->host_defined())) {
         // 1. Assert: realm is a synthetic realm.
         // 1. Assert: realm is a synthetic realm.
         // 2. Set realm to the principal realm of realm.[[HostDefined]].
         // 2. Set realm to the principal realm of realm.[[HostDefined]].
-        return static_cast<Bindings::SyntheticHostDefined const&>(*realm.host_defined()).synthetic_realm_settings.principal_realm;
+        realm = static_cast<Bindings::SyntheticHostDefined const&>(*realm->host_defined()).synthetic_realm_settings.principal_realm;
     }
     }
 
 
     // 2. Assert: realm.[[HostDefined]] is an environment settings object and realm is a principal realm.
     // 2. Assert: realm.[[HostDefined]] is an environment settings object and realm is a principal realm.
-    VERIFY(is<Bindings::PrincipalHostDefined>(*realm.host_defined()));
+    VERIFY(is<Bindings::PrincipalHostDefined>(*realm->host_defined()));
 
 
     // 3. Return realm.
     // 3. Return realm.
     return realm;
     return realm;

+ 1 - 1
Libraries/LibWeb/HTML/Scripting/Environments.h

@@ -149,7 +149,7 @@ JS::Realm& current_principal_realm();
 EnvironmentSettingsObject& principal_realm_settings_object(JS::Realm&);
 EnvironmentSettingsObject& principal_realm_settings_object(JS::Realm&);
 EnvironmentSettingsObject& current_principal_settings_object();
 EnvironmentSettingsObject& current_principal_settings_object();
 
 
-JS::Realm& principal_realm(JS::Realm&);
+JS::Realm& principal_realm(GC::Ref<JS::Realm>);
 JS::Object& current_principal_global_object();
 JS::Object& current_principal_global_object();
 JS::Realm& relevant_realm(JS::Object const&);
 JS::Realm& relevant_realm(JS::Object const&);
 EnvironmentSettingsObject& relevant_settings_object(JS::Object const&);
 EnvironmentSettingsObject& relevant_settings_object(JS::Object const&);