From 29e190da154df657b1a39437041c64e0bbfd7ae9 Mon Sep 17 00:00:00 2001 From: stelar7 Date: Wed, 9 Apr 2025 22:59:07 +0200 Subject: [PATCH] LibWeb/IDB: Keep track of the connection used to start a transaction --- Libraries/LibWeb/IndexedDB/IDBDatabase.cpp | 1 + Libraries/LibWeb/IndexedDB/IDBDatabase.h | 6 ++++++ Libraries/LibWeb/IndexedDB/IDBTransaction.cpp | 1 + 3 files changed, 8 insertions(+) diff --git a/Libraries/LibWeb/IndexedDB/IDBDatabase.cpp b/Libraries/LibWeb/IndexedDB/IDBDatabase.cpp index 781136c3b35..a527609be87 100644 --- a/Libraries/LibWeb/IndexedDB/IDBDatabase.cpp +++ b/Libraries/LibWeb/IndexedDB/IDBDatabase.cpp @@ -44,6 +44,7 @@ void IDBDatabase::visit_edges(Visitor& visitor) Base::visit_edges(visitor); visitor.visit(m_object_store_set); visitor.visit(m_associated_database); + visitor.visit(m_transactions); } void IDBDatabase::set_onabort(WebIDL::CallbackType* event_handler) diff --git a/Libraries/LibWeb/IndexedDB/IDBDatabase.h b/Libraries/LibWeb/IndexedDB/IDBDatabase.h index d2127fcfc97..73578505ca3 100644 --- a/Libraries/LibWeb/IndexedDB/IDBDatabase.h +++ b/Libraries/LibWeb/IndexedDB/IDBDatabase.h @@ -59,6 +59,9 @@ public: m_object_store_set.remove_first_matching([&](auto& entry) { return entry == object_store; }); } + [[nodiscard]] ReadonlySpan> transactions() { return m_transactions; } + void add_transaction(GC::Ref transaction) { m_transactions.append(transaction); } + [[nodiscard]] GC::Ref object_store_names(); WebIDL::ExceptionOr> create_object_store(String const&, IDBObjectStoreParameters const&); WebIDL::ExceptionOr delete_object_store(String const&); @@ -98,6 +101,9 @@ private: // So we stash the one we have when opening a connection. GC::Ref m_associated_database; + // NOTE: We need to keep track of what transactions were created by this connection + Vector> m_transactions; + // NOTE: Used for debug purposes String m_uuid; }; diff --git a/Libraries/LibWeb/IndexedDB/IDBTransaction.cpp b/Libraries/LibWeb/IndexedDB/IDBTransaction.cpp index a1d56e322cf..7cca446090f 100644 --- a/Libraries/LibWeb/IndexedDB/IDBTransaction.cpp +++ b/Libraries/LibWeb/IndexedDB/IDBTransaction.cpp @@ -24,6 +24,7 @@ IDBTransaction::IDBTransaction(JS::Realm& realm, GC::Ref connection , m_scope(move(scopes)) { m_uuid = MUST(Crypto::generate_random_uuid()); + connection->add_transaction(*this); } GC::Ref IDBTransaction::create(JS::Realm& realm, GC::Ref connection, Bindings::IDBTransactionMode mode, Bindings::IDBTransactionDurability durability = Bindings::IDBTransactionDurability::Default, Vector> scopes = {})