IDLGenerators: Set Iterator @@toStringTag with correct descriptor

This commit is contained in:
Tim Ledbetter 2025-01-11 13:15:00 +00:00 committed by Tim Flynn
parent 5b6f2bb23a
commit b6ec055bf9
Notes: github-actions[bot] 2025-01-11 15:03:39 +00:00
4 changed files with 39 additions and 3 deletions

View file

@ -5070,6 +5070,7 @@ void generate_iterator_prototype_implementation(IDL::Interface const& interface,
generator.set("name", ByteString::formatted("{}Iterator", interface.name));
generator.set("parent_name", interface.parent_name);
generator.set("prototype_class", ByteString::formatted("{}IteratorPrototype", interface.name));
generator.set("to_string_tag", ByteString::formatted("{} Iterator", interface.name));
generator.set("prototype_base_class", interface.prototype_base_class);
generator.set("fully_qualified_name", ByteString::formatted("{}Iterator", interface.fully_qualified_name));
generator.set("possible_include_path", ByteString::formatted("{}Iterator", interface.name.replace("::"sv, "/"sv, ReplaceMode::All)));
@ -5111,7 +5112,7 @@ void @prototype_class@::initialize(JS::Realm& realm)
auto& vm = this->vm();
Base::initialize(realm);
define_native_function(realm, vm.names.next, next, 0, JS::Attribute::Writable | JS::Attribute::Enumerable | JS::Attribute::Configurable);
define_direct_property(vm.well_known_symbol_to_string_tag(), JS::PrimitiveString::create(vm, "Iterator"_string), JS::Attribute::Configurable);
define_direct_property(vm.well_known_symbol_to_string_tag(), JS::PrimitiveString::create(vm, "@to_string_tag@"_string), JS::Attribute::Configurable);
}
static JS::ThrowCompletionOr<@fully_qualified_name@*> impl_from(JS::VM& vm)

View file

@ -1,5 +1,5 @@
[object Iterator]
[object Iterator]
[object URLSearchParams Iterator]
[object URLSearchParams Iterator]
true
hello
1

View file

@ -0,0 +1,8 @@
Harness status: OK
Found 3 tests
3 Pass
Pass Default iterator objects for an interface have the same prototype
Pass Object.prototype.toString returns correct value
Pass @@toStringTag has correct value from prototype

View file

@ -0,0 +1,27 @@
<!doctype html>
<meta charset="utf-8">
<title>Default iterator objects</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script>
test(() => {
const iterator1 = new URLSearchParams()[Symbol.iterator]();
const iterator2 = new URLSearchParams().keys();
const iterator3 = new URLSearchParams().values();
const iterator4 = new URLSearchParams().entries();
assert_equals(Object.getPrototypeOf(iterator1), Object.getPrototypeOf(iterator2));
assert_equals(Object.getPrototypeOf(iterator1), Object.getPrototypeOf(iterator3));
assert_equals(Object.getPrototypeOf(iterator1), Object.getPrototypeOf(iterator4));
}, "Default iterator objects for an interface have the same prototype");
test(() => {
const iterator = new URLSearchParams().entries();
assert_equals(Object.prototype.toString.call(iterator), "[object URLSearchParams Iterator]");
}, "Object.prototype.toString returns correct value");
test(() => {
const iterator = new URLSearchParams().entries();
assert_equals(iterator[Symbol.toStringTag], "URLSearchParams Iterator");
assert_equals(Object.getOwnPropertyDescriptor(iterator, Symbol.toStringTag), undefined);
}, "@@toStringTag has correct value from prototype");
</script>