From 2505cecc0f6d8b70b21952c30ee1f885c67debd8 Mon Sep 17 00:00:00 2001 From: Andrew Kaster Date: Thu, 18 Jan 2024 16:59:22 -0700 Subject: [PATCH] LibWeb: Exclude [Global] interfaces from legacy platform object methods Window and other global objects are not technically legacy platform objects, and have other ways to override their setters and getters. However, Window does need to share some code with the legacy platform object paths, and simply adding another bool check to the mix seems the shortest putt. --- .../expected/HTML/Window-set-properties.txt | 6 +++++ .../input/HTML/Window-set-properties.html | 22 +++++++++++++++++++ .../LibWeb/Bindings/PlatformObject.cpp | 10 ++++----- 3 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 Tests/LibWeb/Text/expected/HTML/Window-set-properties.txt create mode 100644 Tests/LibWeb/Text/input/HTML/Window-set-properties.html diff --git a/Tests/LibWeb/Text/expected/HTML/Window-set-properties.txt b/Tests/LibWeb/Text/expected/HTML/Window-set-properties.txt new file mode 100644 index 0000000000..ec001f5d98 --- /dev/null +++ b/Tests/LibWeb/Text/expected/HTML/Window-set-properties.txt @@ -0,0 +1,6 @@ +window.__NEXT_DATA__ = [object HTMLScriptElement] +window.__NEXT_DATA__ = undefined +window[0] = undefined +e = TypeError: Cannot set property '0' of [object WindowProxy] +window[0] = undefined +window[0] = 42 diff --git a/Tests/LibWeb/Text/input/HTML/Window-set-properties.html b/Tests/LibWeb/Text/input/HTML/Window-set-properties.html new file mode 100644 index 0000000000..9637531eb7 --- /dev/null +++ b/Tests/LibWeb/Text/input/HTML/Window-set-properties.html @@ -0,0 +1,22 @@ + + + diff --git a/Userland/Libraries/LibWeb/Bindings/PlatformObject.cpp b/Userland/Libraries/LibWeb/Bindings/PlatformObject.cpp index 6dfd8a4919..30804ae952 100644 --- a/Userland/Libraries/LibWeb/Bindings/PlatformObject.cpp +++ b/Userland/Libraries/LibWeb/Bindings/PlatformObject.cpp @@ -217,7 +217,7 @@ WebIDL::ExceptionOr PlatformObject::invoke_named_property_setter(String co // https://webidl.spec.whatwg.org/#legacy-platform-object-getownproperty JS::ThrowCompletionOr> PlatformObject::internal_get_own_property(JS::PropertyKey const& property_name) const { - if (m_legacy_platform_object_flags.has_value()) { + if (m_legacy_platform_object_flags.has_value() && !m_legacy_platform_object_flags->has_global_interface_extended_attribute) { // 1. Return ? PlatformObjectGetOwnProperty(O, P, false). return TRY(legacy_platform_object_get_own_property(property_name, IgnoreNamedProps::No)); } else { @@ -228,7 +228,7 @@ JS::ThrowCompletionOr> PlatformObject::internal // https://webidl.spec.whatwg.org/#legacy-platform-object-set JS::ThrowCompletionOr PlatformObject::internal_set(JS::PropertyKey const& property_name, JS::Value value, JS::Value receiver, JS::CacheablePropertyMetadata* metadata) { - if (!m_legacy_platform_object_flags.has_value()) + if (!m_legacy_platform_object_flags.has_value() || m_legacy_platform_object_flags->has_global_interface_extended_attribute) return Base::internal_set(property_name, value, receiver, metadata); auto& vm = this->vm(); @@ -266,7 +266,7 @@ JS::ThrowCompletionOr PlatformObject::internal_set(JS::PropertyKey const& // https://webidl.spec.whatwg.org/#legacy-platform-object-defineownproperty JS::ThrowCompletionOr PlatformObject::internal_define_own_property(JS::PropertyKey const& property_name, JS::PropertyDescriptor const& property_descriptor) { - if (!m_legacy_platform_object_flags.has_value()) + if (!m_legacy_platform_object_flags.has_value() || m_legacy_platform_object_flags->has_global_interface_extended_attribute) return Base::internal_define_own_property(property_name, property_descriptor); auto& vm = this->vm(); @@ -335,7 +335,7 @@ JS::ThrowCompletionOr PlatformObject::internal_define_own_property(JS::Pro // https://webidl.spec.whatwg.org/#legacy-platform-object-delete JS::ThrowCompletionOr PlatformObject::internal_delete(JS::PropertyKey const& property_name) { - if (!m_legacy_platform_object_flags.has_value()) + if (!m_legacy_platform_object_flags.has_value() || m_legacy_platform_object_flags->has_global_interface_extended_attribute) return Base::internal_delete(property_name); auto& vm = this->vm(); @@ -403,7 +403,7 @@ JS::ThrowCompletionOr PlatformObject::internal_delete(JS::PropertyKey cons // https://webidl.spec.whatwg.org/#legacy-platform-object-preventextensions JS::ThrowCompletionOr PlatformObject::internal_prevent_extensions() { - if (!m_legacy_platform_object_flags.has_value()) + if (!m_legacy_platform_object_flags.has_value() || m_legacy_platform_object_flags->has_global_interface_extended_attribute) return Base::internal_prevent_extensions(); // 1. Return false.