diff --git a/Userland/Libraries/LibJS/Runtime/Intl/SegmentsPrototype.cpp b/Userland/Libraries/LibJS/Runtime/Intl/SegmentsPrototype.cpp index 7a0bfd999f..3141b65ea1 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/SegmentsPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/SegmentsPrototype.cpp @@ -5,6 +5,7 @@ */ #include +#include #include #include @@ -19,6 +20,28 @@ SegmentsPrototype::SegmentsPrototype(GlobalObject& global_object) void SegmentsPrototype::initialize(GlobalObject& global_object) { Object::initialize(global_object); + + auto& vm = this->vm(); + + u8 attr = Attribute::Writable | Attribute::Configurable; + define_native_function(*vm.well_known_symbol_iterator(), symbol_iterator, 0, attr); +} + +// 18.5.2.2 %SegmentsPrototype% [ @@iterator ] ( ), https://tc39.es/ecma402/#sec-%segmentsprototype%-@@iterator +JS_DEFINE_NATIVE_FUNCTION(SegmentsPrototype::symbol_iterator) +{ + // 1. Let segments be the this value. + // 2. Perform ? RequireInternalSlot(segments, [[SegmentsSegmenter]]). + auto* segments = TRY(typed_this_object(global_object)); + + // 3. Let segmenter be segments.[[SegmentsSegmenter]]. + auto& segmenter = segments->segments_segmenter(); + + // 4. Let string be segments.[[SegmentsString]]. + auto& string = segments->segments_string(); + + // 5. Return ! CreateSegmentIterator(segmenter, string). + return SegmentIterator::create(global_object, segmenter, string); } } diff --git a/Userland/Libraries/LibJS/Runtime/Intl/SegmentsPrototype.h b/Userland/Libraries/LibJS/Runtime/Intl/SegmentsPrototype.h index 77a526a2b4..143a4870bb 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/SegmentsPrototype.h +++ b/Userland/Libraries/LibJS/Runtime/Intl/SegmentsPrototype.h @@ -18,6 +18,9 @@ public: explicit SegmentsPrototype(GlobalObject&); virtual void initialize(GlobalObject&) override; virtual ~SegmentsPrototype() override = default; + +private: + JS_DECLARE_NATIVE_FUNCTION(symbol_iterator); }; } diff --git a/Userland/Libraries/LibJS/Tests/builtins/Intl/Segmenter/Segmenter.prototype.segment.js b/Userland/Libraries/LibJS/Tests/builtins/Intl/Segmenter/Segmenter.prototype.segment.js index 9654df59f2..0369987c61 100644 --- a/Userland/Libraries/LibJS/Tests/builtins/Intl/Segmenter/Segmenter.prototype.segment.js +++ b/Userland/Libraries/LibJS/Tests/builtins/Intl/Segmenter/Segmenter.prototype.segment.js @@ -9,4 +9,12 @@ describe("correct behavior", () => { Object.getPrototypeOf(segmenter.segment("friends")) ); }); + + test("returns segments object segment iterator", () => { + const segmenter = new Intl.Segmenter(); + const segments = segmenter.segment("hello friends!"); + expect(Object.getPrototypeOf(segments[Symbol.iterator]())[Symbol.toStringTag]).toBe( + "Segmenter String Iterator" + ); + }); });