mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-15 21:41:58 +00:00
LibWeb/IDB: Improve error messages slightly
This commit is contained in:
parent
63e1cc7b50
commit
1fe6060ff9
Notes:
github-actions[bot]
2025-05-08 13:14:39 +00:00
Author: https://github.com/stelar7
Commit: 1fe6060ff9
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4650
Reviewed-by: https://github.com/AtkinsSJ ✅
4 changed files with 15 additions and 12 deletions
|
@ -98,7 +98,7 @@ WebIDL::ExceptionOr<void> IDBCursor::continue_(JS::Value key)
|
||||||
|
|
||||||
// 4. If this's got value flag is false, indicating that the cursor is being iterated or has iterated past its end, throw an "InvalidStateError" DOMException.
|
// 4. If this's got value flag is false, indicating that the cursor is being iterated or has iterated past its end, throw an "InvalidStateError" DOMException.
|
||||||
if (!m_got_value)
|
if (!m_got_value)
|
||||||
return WebIDL::InvalidStateError::create(realm, "Cursor is active or EOL"_string);
|
return WebIDL::InvalidStateError::create(realm, "Cursor is active or EOL while continuing"_string);
|
||||||
|
|
||||||
// 5. If key is given, then:
|
// 5. If key is given, then:
|
||||||
GC::Ptr<Key> key_value;
|
GC::Ptr<Key> key_value;
|
||||||
|
|
|
@ -189,16 +189,19 @@ WebIDL::ExceptionOr<void> IDBDatabase::delete_object_store(String const& name)
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://w3c.github.io/IndexedDB/#dom-idbdatabase-transaction
|
||||||
WebIDL::ExceptionOr<GC::Ref<IDBTransaction>> IDBDatabase::transaction(Variant<String, Vector<String>> store_names, Bindings::IDBTransactionMode mode, IDBTransactionOptions options)
|
WebIDL::ExceptionOr<GC::Ref<IDBTransaction>> IDBDatabase::transaction(Variant<String, Vector<String>> store_names, Bindings::IDBTransactionMode mode, IDBTransactionOptions options)
|
||||||
{
|
{
|
||||||
|
auto& realm = this->realm();
|
||||||
|
|
||||||
// 1. If a live upgrade transaction is associated with the connection, throw an "InvalidStateError" DOMException.
|
// 1. If a live upgrade transaction is associated with the connection, throw an "InvalidStateError" DOMException.
|
||||||
auto database = associated_database();
|
auto database = associated_database();
|
||||||
if (database->upgrade_transaction())
|
if (database->upgrade_transaction())
|
||||||
return WebIDL::InvalidStateError::create(realm(), "Upgrade transaction is live"_string);
|
return WebIDL::InvalidStateError::create(realm, "Upgrade transaction is live"_string);
|
||||||
|
|
||||||
// 2. If this's close pending flag is true, then throw an "InvalidStateError" DOMException.
|
// 2. If this's close pending flag is true, then throw an "InvalidStateError" DOMException.
|
||||||
if (close_pending())
|
if (close_pending())
|
||||||
return WebIDL::InvalidStateError::create(realm(), "Close pending"_string);
|
return WebIDL::InvalidStateError::create(realm, "Close pending"_string);
|
||||||
|
|
||||||
// 3. Let scope be the set of unique strings in storeNames if it is a sequence, or a set containing one string equal to storeNames otherwise.
|
// 3. Let scope be the set of unique strings in storeNames if it is a sequence, or a set containing one string equal to storeNames otherwise.
|
||||||
Vector<String> scope;
|
Vector<String> scope;
|
||||||
|
@ -211,12 +214,12 @@ WebIDL::ExceptionOr<GC::Ref<IDBTransaction>> IDBDatabase::transaction(Variant<St
|
||||||
// 4. If any string in scope is not the name of an object store in the connected database, throw a "NotFoundError" DOMException.
|
// 4. If any string in scope is not the name of an object store in the connected database, throw a "NotFoundError" DOMException.
|
||||||
for (auto const& store_name : scope) {
|
for (auto const& store_name : scope) {
|
||||||
if (!database->object_store_with_name(store_name))
|
if (!database->object_store_with_name(store_name))
|
||||||
return WebIDL::NotFoundError::create(realm(), "Object store not found"_string);
|
return WebIDL::NotFoundError::create(realm, "Provided object store names does not exist in database"_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 5. If scope is empty, throw an "InvalidAccessError" DOMException.
|
// 5. If scope is empty, throw an "InvalidAccessError" DOMException.
|
||||||
if (scope.is_empty())
|
if (scope.is_empty())
|
||||||
return WebIDL::InvalidAccessError::create(realm(), "Scope is empty"_string);
|
return WebIDL::InvalidAccessError::create(realm, "Scope is empty"_string);
|
||||||
|
|
||||||
// 6. If mode is not "readonly" or "readwrite", throw a TypeError.
|
// 6. If mode is not "readonly" or "readwrite", throw a TypeError.
|
||||||
if (mode != Bindings::IDBTransactionMode::Readonly && mode != Bindings::IDBTransactionMode::Readwrite)
|
if (mode != Bindings::IDBTransactionMode::Readonly && mode != Bindings::IDBTransactionMode::Readwrite)
|
||||||
|
@ -229,7 +232,7 @@ WebIDL::ExceptionOr<GC::Ref<IDBTransaction>> IDBDatabase::transaction(Variant<St
|
||||||
scope_stores.append(*store);
|
scope_stores.append(*store);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto transaction = IDBTransaction::create(realm(), *this, mode, options.durability, scope_stores);
|
auto transaction = IDBTransaction::create(realm, *this, mode, options.durability, scope_stores);
|
||||||
|
|
||||||
// 8. Set transaction’s cleanup event loop to the current event loop.
|
// 8. Set transaction’s cleanup event loop to the current event loop.
|
||||||
transaction->set_cleanup_event_loop(HTML::main_thread_event_loop());
|
transaction->set_cleanup_event_loop(HTML::main_thread_event_loop());
|
||||||
|
|
|
@ -188,7 +188,7 @@ WebIDL::ExceptionOr<GC::Ref<IDBIndex>> IDBObjectStore::index(String const& name)
|
||||||
// 5. Let index be the index named name in this’s index set if one exists, or throw a "NotFoundError" DOMException otherwise.
|
// 5. Let index be the index named name in this’s index set if one exists, or throw a "NotFoundError" DOMException otherwise.
|
||||||
auto index = m_indexes.get(name);
|
auto index = m_indexes.get(name);
|
||||||
if (!index.has_value())
|
if (!index.has_value())
|
||||||
return WebIDL::NotFoundError::create(realm(), "Index not found"_string);
|
return WebIDL::NotFoundError::create(realm(), "Index not found in object store"_string);
|
||||||
|
|
||||||
// 6. Return an index handle associated with index and this.
|
// 6. Return an index handle associated with index and this.
|
||||||
return IDBIndex::create(realm(), *index, *this);
|
return IDBIndex::create(realm(), *index, *this);
|
||||||
|
@ -218,7 +218,7 @@ WebIDL::ExceptionOr<void> IDBObjectStore::delete_index(String const& name)
|
||||||
// 6. Let index be the index named name in store if one exists, or throw a "NotFoundError" DOMException otherwise.
|
// 6. Let index be the index named name in store if one exists, or throw a "NotFoundError" DOMException otherwise.
|
||||||
auto index = m_indexes.get(name);
|
auto index = m_indexes.get(name);
|
||||||
if (!index.has_value())
|
if (!index.has_value())
|
||||||
return WebIDL::NotFoundError::create(realm, "Index not found"_string);
|
return WebIDL::NotFoundError::create(realm, "Index not found while trying to delete it"_string);
|
||||||
|
|
||||||
// 7. Remove index from this’s index set.
|
// 7. Remove index from this’s index set.
|
||||||
m_indexes.remove(name);
|
m_indexes.remove(name);
|
||||||
|
|
|
@ -960,7 +960,7 @@ WebIDL::ExceptionOr<ErrorOr<JS::Value>> evaluate_key_path_on_a_value(JS::Realm&
|
||||||
else {
|
else {
|
||||||
// 1. If Type(value) is not Object, return failure.
|
// 1. If Type(value) is not Object, return failure.
|
||||||
if (!value.is_object())
|
if (!value.is_object())
|
||||||
return Error::from_string_literal("Value is not an object");
|
return Error::from_string_literal("Value is not an object during key path evaluation");
|
||||||
|
|
||||||
auto identifier_property = String::from_utf8_without_validation(identifier.bytes());
|
auto identifier_property = String::from_utf8_without_validation(identifier.bytes());
|
||||||
|
|
||||||
|
@ -969,14 +969,14 @@ WebIDL::ExceptionOr<ErrorOr<JS::Value>> evaluate_key_path_on_a_value(JS::Realm&
|
||||||
|
|
||||||
// 3. If hop is false, return failure.
|
// 3. If hop is false, return failure.
|
||||||
if (!hop)
|
if (!hop)
|
||||||
return Error::from_string_literal("Property does not exist");
|
return Error::from_string_literal("Failed to find property on object during key path evaluation");
|
||||||
|
|
||||||
// 4. Let value be ! Get(value, identifier).
|
// 4. Let value be ! Get(value, identifier).
|
||||||
value = MUST(value.as_object().get(identifier_property));
|
value = MUST(value.as_object().get(identifier_property));
|
||||||
|
|
||||||
// 5. If value is undefined, return failure.
|
// 5. If value is undefined, return failure.
|
||||||
if (value.is_undefined())
|
if (value.is_undefined())
|
||||||
return Error::from_string_literal("Value is undefined");
|
return Error::from_string_literal("undefined value on object during key path evaluation");
|
||||||
}
|
}
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
|
@ -1229,7 +1229,7 @@ ErrorOr<u64> generate_a_key(GC::Ref<ObjectStore> store)
|
||||||
|
|
||||||
// 3. If key is greater than 2^53 (9007199254740992), then return failure.
|
// 3. If key is greater than 2^53 (9007199254740992), then return failure.
|
||||||
if (key > static_cast<u64>(MAX_KEY_GENERATOR_VALUE))
|
if (key > static_cast<u64>(MAX_KEY_GENERATOR_VALUE))
|
||||||
return Error::from_string_literal("Key is greater than 2^53");
|
return Error::from_string_literal("Key is greater than 2^53 while trying to generate a key");
|
||||||
|
|
||||||
// 4. Increase generator’s current number by 1.
|
// 4. Increase generator’s current number by 1.
|
||||||
generator.increment(1);
|
generator.increment(1);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue