summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibJS/Runtime
diff options
context:
space:
mode:
authorTimothy Flynn <trflynn89@pm.me>2021-09-08 14:55:39 -0400
committerLinus Groh <mail@linusgroh.de>2022-01-29 20:27:24 +0000
commit4a99170cd2b0778b3445ade45f268d25f4822226 (patch)
tree77cebedd1d3f5caaaddcfa71a35cb272962f2542 /Userland/Libraries/LibJS/Runtime
parent17306078b5abea88f91a1e991b50999f9d1eb72d (diff)
downloadserenity-4a99170cd2b0778b3445ade45f268d25f4822226.zip
LibJS: Implement Intl.Collator.prototype.resolvedOptions
Diffstat (limited to 'Userland/Libraries/LibJS/Runtime')
-rw-r--r--Userland/Libraries/LibJS/Runtime/Intl/CollatorPrototype.cpp35
-rw-r--r--Userland/Libraries/LibJS/Runtime/Intl/CollatorPrototype.h3
2 files changed, 38 insertions, 0 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/Intl/CollatorPrototype.cpp b/Userland/Libraries/LibJS/Runtime/Intl/CollatorPrototype.cpp
index a5ef624274..7c39726ab1 100644
--- a/Userland/Libraries/LibJS/Runtime/Intl/CollatorPrototype.cpp
+++ b/Userland/Libraries/LibJS/Runtime/Intl/CollatorPrototype.cpp
@@ -5,6 +5,7 @@
*/
#include <LibJS/Runtime/GlobalObject.h>
+#include <LibJS/Runtime/Intl/Collator.h>
#include <LibJS/Runtime/Intl/CollatorPrototype.h>
namespace JS::Intl {
@@ -23,6 +24,40 @@ void CollatorPrototype::initialize(GlobalObject& global_object)
// 10.3.2 Intl.Collator.prototype [ @@toStringTag ], https://tc39.es/ecma402/#sec-intl.collator.prototype-@@tostringtag
define_direct_property(*vm.well_known_symbol_to_string_tag(), js_string(vm, "Intl.Collator"), Attribute::Configurable);
+
+ u8 attr = Attribute::Writable | Attribute::Configurable;
+ define_native_function(vm.names.resolvedOptions, resolved_options, 0, attr);
+}
+
+// 10.3.4 Intl.Collator.prototype.resolvedOptions ( ), https://tc39.es/ecma402/#sec-intl.collator.prototype.resolvedoptions
+JS_DEFINE_NATIVE_FUNCTION(CollatorPrototype::resolved_options)
+{
+ // 1. Let collator be the this value.
+ // 2. Perform ? RequireInternalSlot(collator, [[InitializedCollator]]).
+ auto* collator = TRY(typed_this_object(global_object));
+
+ // 3. Let options be ! OrdinaryObjectCreate(%Object.prototype%).
+ auto* options = Object::create(global_object, global_object.object_prototype());
+
+ // 4. For each row of Table 3, except the header row, in table order, do
+ // a. Let p be the Property value of the current row.
+ // b. Let v be the value of collator's internal slot whose name is the Internal Slot value of the current row.
+ // c. If the current row has an Extension Key value, then
+ // i. Let extensionKey be the Extension Key value of the current row.
+ // ii. If %Collator%.[[RelevantExtensionKeys]] does not contain extensionKey, then
+ // 1. Let v be undefined.
+ // d. If v is not undefined, then
+ // i. Perform ! CreateDataPropertyOrThrow(options, p, v).
+ MUST(options->create_data_property_or_throw(vm.names.locale, js_string(vm, collator->locale())));
+ MUST(options->create_data_property_or_throw(vm.names.usage, js_string(vm, collator->usage_string())));
+ MUST(options->create_data_property_or_throw(vm.names.sensitivity, js_string(vm, collator->sensitivity_string())));
+ MUST(options->create_data_property_or_throw(vm.names.ignorePunctuation, Value(collator->ignore_punctuation())));
+ MUST(options->create_data_property_or_throw(vm.names.collation, js_string(vm, collator->collation())));
+ MUST(options->create_data_property_or_throw(vm.names.numeric, Value(collator->numeric())));
+ MUST(options->create_data_property_or_throw(vm.names.caseFirst, js_string(vm, collator->case_first_string())));
+
+ // 5. Return options.
+ return options;
}
}
diff --git a/Userland/Libraries/LibJS/Runtime/Intl/CollatorPrototype.h b/Userland/Libraries/LibJS/Runtime/Intl/CollatorPrototype.h
index 24b3806b85..5dda42be89 100644
--- a/Userland/Libraries/LibJS/Runtime/Intl/CollatorPrototype.h
+++ b/Userland/Libraries/LibJS/Runtime/Intl/CollatorPrototype.h
@@ -18,6 +18,9 @@ public:
explicit CollatorPrototype(GlobalObject&);
virtual void initialize(GlobalObject&) override;
virtual ~CollatorPrototype() override = default;
+
+private:
+ JS_DECLARE_NATIVE_FUNCTION(resolved_options);
};
}