mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-08 01:00:05 +00:00
LibWeb/IDB: Implement IDBDatabase::createObjectStore
This commit is contained in:
parent
3c5578cc87
commit
1057c88fdd
Notes:
github-actions[bot]
2025-03-27 15:49:41 +00:00
Author: https://github.com/stelar7
Commit: 1057c88fdd
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4077
Reviewed-by: https://github.com/AtkinsSJ
Reviewed-by: https://github.com/gmta ✅
7 changed files with 102 additions and 10 deletions
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2024, stelar7 <dudedbz@gmail.com>
|
||||
* Copyright (c) 2024-2025, stelar7 <dudedbz@gmail.com>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
@ -8,6 +8,7 @@
|
|||
#include <LibWeb/Bindings/Intrinsics.h>
|
||||
#include <LibWeb/HTML/EventNames.h>
|
||||
#include <LibWeb/IndexedDB/IDBDatabase.h>
|
||||
#include <LibWeb/IndexedDB/IDBObjectStore.h>
|
||||
#include <LibWeb/IndexedDB/Internal/Algorithms.h>
|
||||
|
||||
namespace Web::IndexedDB {
|
||||
|
@ -90,4 +91,52 @@ void IDBDatabase::close()
|
|||
close_a_database_connection(*this);
|
||||
}
|
||||
|
||||
// https://w3c.github.io/IndexedDB/#dom-idbdatabase-createobjectstore
|
||||
WebIDL::ExceptionOr<GC::Ref<IDBObjectStore>> IDBDatabase::create_object_store(String const& name, IDBObjectStoreParameters const& options)
|
||||
{
|
||||
auto& realm = this->realm();
|
||||
|
||||
// 1. Let database be this's associated database.
|
||||
auto database = associated_database();
|
||||
|
||||
// 2. Let transaction be database’s upgrade transaction if it is not null, or throw an "InvalidStateError" DOMException otherwise.
|
||||
auto transaction = database->upgrade_transaction();
|
||||
if (!transaction)
|
||||
return WebIDL::InvalidStateError::create(realm, "Upgrade transaction is null"_string);
|
||||
|
||||
// 3. If transaction’s state is not active, then throw a "TransactionInactiveError" DOMException.
|
||||
if (transaction->state() != IDBTransaction::TransactionState::Active)
|
||||
return WebIDL::TransactionInactiveError::create(realm, "Transaction is not active"_string);
|
||||
|
||||
// 4. Let keyPath be options’s keyPath member if it is not undefined or null, or null otherwise.
|
||||
auto key_path = options.key_path;
|
||||
|
||||
// 5. If keyPath is not null and is not a valid key path, throw a "SyntaxError" DOMException.
|
||||
if (key_path.has_value() && !is_valid_key_path(key_path.value()))
|
||||
return WebIDL::SyntaxError::create(realm, "Invalid key path"_string);
|
||||
|
||||
// 6. If an object store named name already exists in database throw a "ConstraintError" DOMException.
|
||||
if (database->has_object_store_named(name))
|
||||
return WebIDL::ConstraintError::create(realm, "Object store already exists"_string);
|
||||
|
||||
// 7. Let autoIncrement be options’s autoIncrement member.
|
||||
auto auto_increment = options.auto_increment;
|
||||
|
||||
bool is_empty_key_path_or_sequence = key_path.has_value() && key_path.value().visit([](String const& value) -> bool { return value.is_empty(); }, [](Vector<String> const&) -> bool { return true; });
|
||||
|
||||
// 8. If autoIncrement is true and keyPath is an empty string or any sequence (empty or otherwise), throw an "InvalidAccessError" DOMException.
|
||||
if (auto_increment && is_empty_key_path_or_sequence)
|
||||
return WebIDL::InvalidAccessError::create(realm, "Auto increment is true and key path is empty or sequence"_string);
|
||||
|
||||
// 9. Let store be a new object store in database.
|
||||
// Set the created object store's name to name.
|
||||
// If autoIncrement is true, then the created object store uses a key generator.
|
||||
// If keyPath is not null, set the created object store's key path to keyPath.
|
||||
auto object_store = ObjectStore::create(realm, name, auto_increment, key_path);
|
||||
database->add_object_store(object_store);
|
||||
|
||||
// 10. Return a new object store handle associated with store and transaction.
|
||||
return IDBObjectStore::create(realm, object_store, *transaction);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue