diff --git a/Libraries/LibJS/Runtime/Temporal/DurationPrototype.cpp b/Libraries/LibJS/Runtime/Temporal/DurationPrototype.cpp index 33d0ffdcc49..d73443a87d4 100644 --- a/Libraries/LibJS/Runtime/Temporal/DurationPrototype.cpp +++ b/Libraries/LibJS/Runtime/Temporal/DurationPrototype.cpp @@ -5,6 +5,9 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include +#include +#include #include #include #include @@ -625,15 +628,35 @@ JS_DEFINE_NATIVE_FUNCTION(DurationPrototype::to_json) } // 7.3.24 Temporal.Duration.prototype.toLocaleString ( [ locales [ , options ] ] ), https://tc39.es/proposal-temporal/#sec-temporal.duration.prototype.tolocalestring -// NOTE: This is the minimum toLocaleString implementation for engines without ECMA-402. +// 15.11.1.1 Temporal.Duration.prototype.toLocaleString ( [ locales [ , options ] ] ), https://tc39.es/proposal-temporal/#sup-temporal.duration.prototype.tolocalestring JS_DEFINE_NATIVE_FUNCTION(DurationPrototype::to_locale_string) { + auto& realm = *vm.current_realm(); + + auto locales = vm.argument(0); + auto options = vm.argument(1); + // 1. Let duration be the this value. // 2. Perform ? RequireInternalSlot(duration, [[InitializedTemporalDuration]]). auto duration = TRY(typed_this_object(vm)); - // 3. Return TemporalDurationToString(duration, AUTO). - return PrimitiveString::create(vm, temporal_duration_to_string(duration, Auto {})); + // 3. Let formatter be ? Construct(%Intl.DurationFormat%, « locales, options »). + auto& formatter = static_cast(*TRY(construct(vm, realm.intrinsics().intl_duration_format_constructor(), locales, options))); + + // 4. Let parts be PartitionDurationFormatPattern(formatter, duration). + auto parts = partition_duration_format_pattern(vm, formatter, duration); + + // 5. Let result be the empty String. + StringBuilder result; + + // 6. For each Record { [[Type]], [[Value]], [[Unit]] } part in parts, do + for (auto const& part : parts) { + // a. Set result to the string-concatenation of result and part.[[Value]]. + result.append(part.value); + } + + // 7. Return result. + return PrimitiveString::create(vm, MUST(result.to_string())); } // 7.3.25 Temporal.Duration.prototype.valueOf ( ), https://tc39.es/proposal-temporal/#sec-temporal.duration.prototype.valueof diff --git a/Libraries/LibJS/Tests/builtins/Temporal/Duration/Duration.prototype.toLocaleString.js b/Libraries/LibJS/Tests/builtins/Temporal/Duration/Duration.prototype.toLocaleString.js index 189c3b6846b..05033d45309 100644 --- a/Libraries/LibJS/Tests/builtins/Temporal/Duration/Duration.prototype.toLocaleString.js +++ b/Libraries/LibJS/Tests/builtins/Temporal/Duration/Duration.prototype.toLocaleString.js @@ -5,7 +5,7 @@ describe("correct behavior", () => { test("basic functionality", () => { expect(new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).toLocaleString()).toBe( - "P1Y2M3W4DT5H6M7.00800901S" + "1 yr, 2 mths, 3 wks, 4 days, 5 hr, 6 min, 7 sec, 8 ms, 9 μs, 10 ns" ); }); });