diff --git a/Libraries/LibWeb/IndexedDB/Internal/Algorithms.cpp b/Libraries/LibWeb/IndexedDB/Internal/Algorithms.cpp index 0955f80aaf8..f018aab5c95 100644 --- a/Libraries/LibWeb/IndexedDB/Internal/Algorithms.cpp +++ b/Libraries/LibWeb/IndexedDB/Internal/Algorithms.cpp @@ -120,7 +120,8 @@ WebIDL::ExceptionOr> open_a_database_connection(JS::Realm& })); // 6. Run upgrade a database using connection, version and request. - upgrade_a_database(realm, connection, version, request); + // AD-HOC: https://github.com/w3c/IndexedDB/issues/433#issuecomment-2512330086 + auto upgrade_transaction = upgrade_a_database(realm, connection, version, request); // 7. If connection was closed, return a newly created "AbortError" DOMException and abort these steps. if (connection->state() == IDBDatabase::ConnectionState::Closed) { @@ -129,8 +130,7 @@ WebIDL::ExceptionOr> open_a_database_connection(JS::Realm& // 8. If the upgrade transaction was aborted, run the steps to close a database connection with connection, // return a newly created "AbortError" DOMException and abort these steps. - auto transaction = connection->associated_database()->upgrade_transaction(); - if (transaction->aborted()) { + if (upgrade_transaction->aborted()) { close_a_database_connection(*connection, true); return WebIDL::AbortError::create(realm, "Upgrade transaction was aborted"_string); } @@ -304,7 +304,7 @@ void close_a_database_connection(IDBDatabase& connection, bool forced) } // https://w3c.github.io/IndexedDB/#upgrade-a-database -void upgrade_a_database(JS::Realm& realm, GC::Ref connection, u64 version, GC::Ref request) +GC::Ref upgrade_a_database(JS::Realm& realm, GC::Ref connection, u64 version, GC::Ref request) { // 1. Let db be connection’s database. auto db = connection->associated_database(); @@ -365,6 +365,8 @@ void upgrade_a_database(JS::Realm& realm, GC::Ref connection, u64 v HTML::main_thread_event_loop().spin_until(GC::create_function(realm.vm().heap(), [&wait_for_transaction]() { return !wait_for_transaction; })); + + return transaction; } // https://w3c.github.io/IndexedDB/#deleting-a-database diff --git a/Libraries/LibWeb/IndexedDB/Internal/Algorithms.h b/Libraries/LibWeb/IndexedDB/Internal/Algorithms.h index 7e9a1182b59..2814a282127 100644 --- a/Libraries/LibWeb/IndexedDB/Internal/Algorithms.h +++ b/Libraries/LibWeb/IndexedDB/Internal/Algorithms.h @@ -17,7 +17,7 @@ WebIDL::ExceptionOr> open_a_database_connection(JS::Realm&, bool fire_a_version_change_event(JS::Realm&, FlyString const&, GC::Ref, u64, Optional); ErrorOr> convert_a_value_to_a_key(JS::Realm&, JS::Value, Vector = {}); void close_a_database_connection(IDBDatabase&, bool forced = false); -void upgrade_a_database(JS::Realm&, GC::Ref, u64, GC::Ref); +GC::Ref upgrade_a_database(JS::Realm&, GC::Ref, u64, GC::Ref); WebIDL::ExceptionOr delete_a_database(JS::Realm&, StorageAPI::StorageKey, String, GC::Ref); void abort_a_transaction(IDBTransaction&, GC::Ptr); JS::Value convert_a_key_to_a_value(JS::Realm&, GC::Ref);