From 34fed7bfcc4171e7c9f41302434d254693f45ec8 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Sat, 5 Mar 2022 20:43:45 +0100 Subject: [PATCH] LibWeb: Implement the CrossOriginPropertyFallback AO --- .../CrossOriginAbstractOperations.cpp | 25 +++++++++++++++++++ .../Bindings/CrossOriginAbstractOperations.h | 1 + 2 files changed, 26 insertions(+) diff --git a/Userland/Libraries/LibWeb/Bindings/CrossOriginAbstractOperations.cpp b/Userland/Libraries/LibWeb/Bindings/CrossOriginAbstractOperations.cpp index b608ea133de..fc397a87078 100644 --- a/Userland/Libraries/LibWeb/Bindings/CrossOriginAbstractOperations.cpp +++ b/Userland/Libraries/LibWeb/Bindings/CrossOriginAbstractOperations.cpp @@ -6,10 +6,17 @@ #include #include +#include +#include #include +#include +#include #include +#include #include #include +#include +#include namespace Web::Bindings { @@ -46,4 +53,22 @@ Vector cross_origin_properties(Variant cross_origin_property_fallback(JS::GlobalObject& global_object, JS::PropertyKey const& property_key) +{ + auto& vm = global_object.vm(); + + // 1. If P is "then", @@toStringTag, @@hasInstance, or @@isConcatSpreadable, then return PropertyDescriptor{ [[Value]]: undefined, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }. + auto property_key_is_then = property_key.is_string() && property_key.as_string() == vm.names.then.as_string(); + auto property_key_is_allowed_symbol = property_key.is_symbol() + && (property_key.as_symbol() == vm.well_known_symbol_to_string_tag() + || property_key.as_symbol() == vm.well_known_symbol_has_instance() + || property_key.as_symbol() == vm.well_known_symbol_is_concat_spreadable()); + if (property_key_is_then || property_key_is_allowed_symbol) + return JS::PropertyDescriptor { .value = JS::js_undefined(), .writable = false, .enumerable = false, .configurable = true }; + + // 2. Throw a "SecurityError" DOMException. + return vm.throw_completion(global_object, DOM::SecurityError::create(String::formatted("Can't access property '{}' on cross-origin object", property_key))); +} + } diff --git a/Userland/Libraries/LibWeb/Bindings/CrossOriginAbstractOperations.h b/Userland/Libraries/LibWeb/Bindings/CrossOriginAbstractOperations.h index ba2c1c9cc67..748b0556458 100644 --- a/Userland/Libraries/LibWeb/Bindings/CrossOriginAbstractOperations.h +++ b/Userland/Libraries/LibWeb/Bindings/CrossOriginAbstractOperations.h @@ -28,6 +28,7 @@ struct CrossOriginKey { using CrossOriginPropertyDescriptorMap = HashMap; Vector cross_origin_properties(Variant const&); +JS::ThrowCompletionOr cross_origin_property_fallback(JS::GlobalObject&, JS::PropertyKey const&); }