LibWeb/IDB: Implement generate_a_key

This commit is contained in:
stelar7 2025-04-11 11:25:56 +02:00
parent 032723c224
commit 126e5c8833
3 changed files with 26 additions and 2 deletions

View file

@ -1208,4 +1208,24 @@ GC::Ref<IDBRequest> asynchronously_execute_a_request(JS::Realm& realm, IDBReques
return request;
}
// https://w3c.github.io/IndexedDB/#generate-a-key
ErrorOr<u64> generate_a_key(GC::Ref<ObjectStore> store)
{
// 1. Let generator be stores key generator.
auto generator = store->key_generator().value();
// 2. Let key be generators current number.
auto key = generator.current_number();
// 3. If key is greater than 2^53 (9007199254740992), then return failure.
if (key > 9007199254740992)
return Error::from_string_literal("Key is greater than 2^53");
// 4. Increase generators current number by 1.
generator.increment(1);
// 5. Return key.
return key;
}
}

View file

@ -36,5 +36,6 @@ bool check_that_a_key_could_be_injected_into_a_value(JS::Realm&, JS::Value, KeyP
void fire_an_error_event(JS::Realm&, GC::Ref<IDBRequest>);
void fire_a_success_event(JS::Realm&, GC::Ref<IDBRequest>);
GC::Ref<IDBRequest> asynchronously_execute_a_request(JS::Realm&, IDBRequestSource, GC::Ref<GC::Function<WebIDL::ExceptionOr<JS::Value>()>>, GC::Ptr<IDBRequest> = nullptr);
ErrorOr<u64> generate_a_key(GC::Ref<ObjectStore>);
}

View file

@ -13,13 +13,16 @@ namespace Web::IndexedDB {
// https://w3c.github.io/IndexedDB/#key-generator-construct
class KeyGenerator {
public:
[[nodiscard]] u64 current_number() const { return m_current_number; }
void increment(u64 amount) { m_current_number += amount; }
void set(u64 value) { m_current_number = value; }
private:
// A key generator has a current number.
// The current number is always a positive integer less than or equal to 2^53 (9007199254740992) + 1.
// The initial value of a key generator's current number is 1, set when the associated object store is created.
// The current number is incremented as keys are generated, and may be updated to a specific value by using explicit keys.
// FIXME: Implement support for KeyGenerator in ObjectStore.
[[maybe_unused]] u64 current_number { 1 };
u64 m_current_number { 1 };
};
}