mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-11 18:50:50 +00:00
LibWeb/IDB: Fix a bug where the KeyGenerator was not incremented
This commit is contained in:
parent
facfcd87c2
commit
577f799240
Notes:
github-actions[bot]
2025-04-28 09:32:51 +00:00
Author: https://github.com/stelar7
Commit: 577f799240
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4476
Reviewed-by: https://github.com/gmta ✅
4 changed files with 8 additions and 7 deletions
|
@ -250,7 +250,7 @@ WebIDL::ExceptionOr<GC::Ref<IDBRequest>> IDBObjectStore::add_or_put(GC::Ref<IDBO
|
|||
return WebIDL::DataError::create(realm, "Store uses in-line keys and key was given"_string);
|
||||
|
||||
// 7. If store uses out-of-line keys and has no key generator and key was not given, throw a "DataError" DOMException.
|
||||
if (store.uses_out_of_line_keys() && !store.key_generator().has_value() && !key_was_given)
|
||||
if (store.uses_out_of_line_keys() && !store.uses_a_key_generator() && !key_was_given)
|
||||
return WebIDL::DataError::create(realm, "Store uses out-of-line keys and has no key generator and key was not given"_string);
|
||||
|
||||
GC::Ptr<Key> key_value;
|
||||
|
@ -291,7 +291,7 @@ WebIDL::ExceptionOr<GC::Ref<IDBRequest>> IDBObjectStore::add_or_put(GC::Ref<IDBO
|
|||
// 4. Otherwise (kpk is failure):
|
||||
else {
|
||||
// 1. If store does not have a key generator, throw a "DataError" DOMException.
|
||||
if (!store.key_generator().has_value())
|
||||
if (!store.uses_a_key_generator())
|
||||
return WebIDL::DataError::create(realm, "Store does not have a key generator"_string);
|
||||
|
||||
// 2. Otherwise, if check that a key could be injected into a value with clone and store’s key path return false, throw a "DataError" DOMException.
|
||||
|
|
|
@ -31,7 +31,7 @@ public:
|
|||
|
||||
// https://w3c.github.io/IndexedDB/#dom-idbobjectstore-autoincrement
|
||||
// The autoIncrement getter steps are to return true if this’s object store has a key generator, and false otherwise.
|
||||
bool auto_increment() const { return m_store->key_generator().has_value(); }
|
||||
bool auto_increment() const { return m_store->uses_a_key_generator(); }
|
||||
JS::Value key_path() const;
|
||||
String name() const { return m_name; }
|
||||
WebIDL::ExceptionOr<void> set_name(String const& value);
|
||||
|
|
|
@ -1220,7 +1220,7 @@ GC::Ref<IDBRequest> asynchronously_execute_a_request(JS::Realm& realm, IDBReques
|
|||
ErrorOr<u64> generate_a_key(GC::Ref<ObjectStore> store)
|
||||
{
|
||||
// 1. Let generator be store’s key generator.
|
||||
auto generator = store->key_generator().value();
|
||||
auto& generator = store->key_generator();
|
||||
|
||||
// 2. Let key be generator’s current number.
|
||||
auto key = generator.current_number();
|
||||
|
@ -1253,7 +1253,7 @@ void possibly_update_the_key_generator(GC::Ref<ObjectStore> store, GC::Ref<Key>
|
|||
u64 value = floor(temp_value);
|
||||
|
||||
// 5. Let generator be store’s key generator.
|
||||
auto generator = store->key_generator().value();
|
||||
auto& generator = store->key_generator();
|
||||
|
||||
// 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())
|
||||
|
@ -1324,7 +1324,7 @@ void delete_records_from_an_object_store(GC::Ref<ObjectStore> store, GC::Ref<IDB
|
|||
WebIDL::ExceptionOr<GC::Ptr<Key>> store_a_record_into_an_object_store(JS::Realm& realm, GC::Ref<ObjectStore> store, JS::Value value, GC::Ptr<Key> key, bool no_overwrite)
|
||||
{
|
||||
// 1. If store uses a key generator, then:
|
||||
if (store->key_generator().has_value()) {
|
||||
if (store->uses_a_key_generator()) {
|
||||
// 1. If key is undefined, then:
|
||||
if (key == nullptr) {
|
||||
// 1. Let key be the result of generating a key for store.
|
||||
|
|
|
@ -43,7 +43,8 @@ public:
|
|||
Optional<KeyPath> key_path() const { return m_key_path; }
|
||||
bool uses_inline_keys() const { return m_key_path.has_value(); }
|
||||
bool uses_out_of_line_keys() const { return !m_key_path.has_value(); }
|
||||
Optional<KeyGenerator> key_generator() const { return m_key_generator; }
|
||||
KeyGenerator& key_generator() { return *m_key_generator; }
|
||||
bool uses_a_key_generator() const { return m_key_generator.has_value(); }
|
||||
AK::HashMap<String, GC::Ref<Index>>& index_set() { return m_indexes; }
|
||||
|
||||
GC::Ref<Database> database() const { return m_database; }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue