diff --git a/Libraries/LibWeb/IndexedDB/Internal/Algorithms.cpp b/Libraries/LibWeb/IndexedDB/Internal/Algorithms.cpp index 43dc098db5d..e6b1e60b2fd 100644 --- a/Libraries/LibWeb/IndexedDB/Internal/Algorithms.cpp +++ b/Libraries/LibWeb/IndexedDB/Internal/Algorithms.cpp @@ -1235,4 +1235,28 @@ ErrorOr generate_a_key(GC::Ref store) return key; } +// https://w3c.github.io/IndexedDB/#possibly-update-the-key-generator +void possibly_update_the_key_generator(GC::Ref store, GC::Ref key) +{ + // 1. If the type of key is not number, abort these steps. + if (key->type() != Key::KeyType::Number) + return; + + // 2. Let value be the value of key. + auto temp_value = key->value_as_double(); + + // 3. Set value to the minimum of value and 2^53 (9007199254740992). + temp_value = min(temp_value, MAX_KEY_GENERATOR_VALUE); + + // 4. Set value to the largest integer not greater than value. + u64 value = floor(temp_value); + + // 5. Let generator be store’s key generator. + auto generator = store->key_generator().value(); + + // 6. If value is greater than or equal to generator’s current number, then set generator’s current number to value + 1. + if (value >= generator.current_number()) + generator.set(value + 1); +} + } diff --git a/Libraries/LibWeb/IndexedDB/Internal/Algorithms.h b/Libraries/LibWeb/IndexedDB/Internal/Algorithms.h index 9b16ede3d9d..8b6472602fc 100644 --- a/Libraries/LibWeb/IndexedDB/Internal/Algorithms.h +++ b/Libraries/LibWeb/IndexedDB/Internal/Algorithms.h @@ -37,5 +37,6 @@ void fire_an_error_event(JS::Realm&, GC::Ref); void fire_a_success_event(JS::Realm&, GC::Ref); GC::Ref asynchronously_execute_a_request(JS::Realm&, IDBRequestSource, GC::Ref()>>, GC::Ptr = nullptr); ErrorOr generate_a_key(GC::Ref); +void possibly_update_the_key_generator(GC::Ref, GC::Ref); }