LibWeb/IDB: Implement IDBObjectStore::name

This commit is contained in:
stelar7 2025-03-24 21:18:26 +01:00 committed by Jelle Raaijmakers
parent 2e02b62126
commit 3879391fa6
Notes: github-actions[bot] 2025-03-27 15:49:10 +00:00
6 changed files with 80 additions and 13 deletions

View file

@ -21,6 +21,7 @@ IDBObjectStore::IDBObjectStore(JS::Realm& realm, GC::Ref<ObjectStore> store, GC:
: PlatformObject(realm)
, m_store(store)
, m_transaction(transaction)
, m_name(store->name())
{
}
@ -59,4 +60,45 @@ JS::Value IDBObjectStore::key_path() const
});
}
// https://w3c.github.io/IndexedDB/#dom-idbobjectstore-name
WebIDL::ExceptionOr<void> IDBObjectStore::set_name(String const& value)
{
auto& realm = this->realm();
// 1. Let name be the given value.
auto const& name = value;
// 2. Let transaction be thiss transaction.
auto& transaction = m_transaction;
// 3. Let store be thiss object store.
auto& store = m_store;
// FIXME: 4. If store has been deleted, throw an "InvalidStateError" DOMException.
// 5. If transaction is not an upgrade transaction, throw an "InvalidStateError" DOMException.
if (transaction->mode() != Bindings::IDBTransactionMode::Versionchange)
return WebIDL::InvalidStateError::create(realm, "Attempted to set name outside of version change"_string);
// 6. If transactions state is not active, throw a "TransactionInactiveError" DOMException.
if (transaction->state() != IDBTransaction::TransactionState::Active)
return WebIDL::TransactionInactiveError::create(realm, "Transaction is not active"_string);
// 7. If stores name is equal to name, terminate these steps.
if (store->name() == name)
return {};
// 8. If an object store named name already exists in stores database, throw a "ConstraintError" DOMException.
if (store->database()->has_object_store_named(name))
return WebIDL::ConstraintError::create(realm, "Object store with the given name already exists"_string);
// 9. Set stores name to name.
store->set_name(name);
// 10. Set thiss name to name.
m_name = name;
return {};
}
}