diff --git a/Libraries/LibWeb/IndexedDB/Internal/Algorithms.cpp b/Libraries/LibWeb/IndexedDB/Internal/Algorithms.cpp index 4f0515a6844..edf45f05a71 100644 --- a/Libraries/LibWeb/IndexedDB/Internal/Algorithms.cpp +++ b/Libraries/LibWeb/IndexedDB/Internal/Algorithms.cpp @@ -1901,4 +1901,32 @@ GC::Ref retrieve_multiple_values_from_an_object_store(JS::Realm& real return list; } +// https://w3c.github.io/IndexedDB/#retrieve-multiple-keys-from-an-object-store +GC::Ref retrieve_multiple_keys_from_an_object_store(JS::Realm& realm, GC::Ref store, GC::Ref range, Optional count) +{ + // 1. If count is not given or is 0 (zero), let count be infinity. + if (count.has_value() && *count == 0) + count = OptionalNone(); + + // 2. Let records be a list containing the first count records in store’s list of records whose key is in range. + auto records = store->first_n_in_range(range, count); + + // 3. Let list be an empty list. + auto list = MUST(JS::Array::create(realm, records.size())); + + // 4. For each record of records: + for (u32 i = 0; i < records.size(); ++i) { + auto& record = records[i]; + + // 1. Let entry be the result of converting a key to a value with record’s key. + auto entry = convert_a_key_to_a_value(realm, record.key); + + // 2. Append entry to list. + MUST(list->create_data_property_or_throw(i, entry)); + } + + // 5. Return list converted to a sequence. + return list; +} + } diff --git a/Libraries/LibWeb/IndexedDB/Internal/Algorithms.h b/Libraries/LibWeb/IndexedDB/Internal/Algorithms.h index ce18d2baa05..1e809d2bfb6 100644 --- a/Libraries/LibWeb/IndexedDB/Internal/Algorithms.h +++ b/Libraries/LibWeb/IndexedDB/Internal/Algorithms.h @@ -49,5 +49,6 @@ GC::Ptr iterate_a_cursor(JS::Realm&, GC::Ref, GC::Ptr JS::Value clear_an_object_store(GC::Ref); JS::Value retrieve_a_key_from_an_object_store(JS::Realm&, GC::Ref, GC::Ref); GC::Ref retrieve_multiple_values_from_an_object_store(JS::Realm&, GC::Ref, GC::Ref, Optional); +GC::Ref retrieve_multiple_keys_from_an_object_store(JS::Realm&, GC::Ref, GC::Ref, Optional); }