[webkit-changes] [WebKit/WebKit] b5d274: [IndexedDB] Added records should be removed if tra...

Sihui noreply at github.com
Wed Feb 26 08:58:46 PST 2025


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: b5d274d82a73a96011e412c2d46d824ba4b42b3e
      https://github.com/WebKit/WebKit/commit/b5d274d82a73a96011e412c2d46d824ba4b42b3e
  Author: Sihui Liu <sihui_liu at apple.com>
  Date:   2025-02-26 (Wed, 26 Feb 2025)

  Changed paths:
    A LayoutTests/storage/indexeddb/resources/transaction-abort-revert-records.js
    A LayoutTests/storage/indexeddb/transaction-abort-revert-records-expected.txt
    A LayoutTests/storage/indexeddb/transaction-abort-revert-records-private-expected.txt
    A LayoutTests/storage/indexeddb/transaction-abort-revert-records-private.html
    A LayoutTests/storage/indexeddb/transaction-abort-revert-records.html
    M Source/WebCore/Modules/indexeddb/server/MemoryBackingStoreTransaction.cpp
    M Source/WebCore/Modules/indexeddb/server/MemoryBackingStoreTransaction.h
    M Source/WebCore/Modules/indexeddb/server/MemoryObjectStore.cpp
    M Source/WebCore/Modules/indexeddb/server/MemoryObjectStore.h

  Log Message:
  -----------
  [IndexedDB] Added records should be removed if transaction aborts
https://bugs.webkit.org/show_bug.cgi?id=288346
rdar://problem/145501159

Reviewed by Brady Eidson.

In current implementation, the memory backend does not roll back added records when transaction aborts. See the new test
for an example: before this patch, transaction-abort-revert-records-private.html would fail for keys added in
versionchnage transaction still present after the transaction is aborted.

The cause is MemoryBackingStoreTransaction only tracks records that are removed from object store during transaction,
but not records that are newly added. To fix that, now MemoryObjectStore tracks both added keys and removed records.
When transaction aborts, MemoryObjectStore deletes added records and re-adds deleted records. By moving the ownership of
changed records from MemoryBackingStoreTransaction to MemoryObjectStore, MemoryObjectStore does not need to notify
MemoryBackingStoreTransaction about changes, which makes the lifetime management more clear.

Tests: storage/indexeddb/transaction-abort-revert-records.html
       storage/indexeddb/transaction-abort-revert-records-private.html

* LayoutTests/storage/indexeddb/resources/transaction-abort-revert-records.js: Added.
(prepareDatabase):
(onDatabasePrepared):
(onDatabaseUpgrade):
(onTranactionAbort):
(onDatabaseError):
(onDatabaseOpen):
(onGetAllKeysSuccess):
(onGetSuccess):
* LayoutTests/storage/indexeddb/transaction-abort-revert-records-expected.txt: Added.
* LayoutTests/storage/indexeddb/transaction-abort-revert-records-private-expected.txt: Added.
* LayoutTests/storage/indexeddb/transaction-abort-revert-records-private.html: Added.
* LayoutTests/storage/indexeddb/transaction-abort-revert-records.html: Added.
* Source/WebCore/Modules/indexeddb/server/MemoryBackingStoreTransaction.cpp:
(WebCore::IDBServer::MemoryBackingStoreTransaction::addExistingObjectStore):
(WebCore::IDBServer::MemoryBackingStoreTransaction::abort):
(WebCore::IDBServer::MemoryBackingStoreTransaction::objectStoreCleared): Deleted.
(WebCore::IDBServer::MemoryBackingStoreTransaction::recordValueChanged): Deleted.
* Source/WebCore/Modules/indexeddb/server/MemoryBackingStoreTransaction.h:
* Source/WebCore/Modules/indexeddb/server/MemoryObjectStore.cpp:
(WebCore::IDBServer::MemoryObjectStore::writeTransactionStarted):
(WebCore::IDBServer::MemoryObjectStore::transactionAborted):
(WebCore::IDBServer::MemoryObjectStore::writeTransactionFinished):
(WebCore::IDBServer::MemoryObjectStore::clear):
(WebCore::IDBServer::MemoryObjectStore::deleteRecord):
(WebCore::IDBServer::MemoryObjectStore::addRecord):
(WebCore::IDBServer::MemoryObjectStore::replaceKeyValueStore): Deleted.
(WebCore::IDBServer::MemoryObjectStore::unregisterIndex): Deleted.
* Source/WebCore/Modules/indexeddb/server/MemoryObjectStore.h:

Canonical link: https://commits.webkit.org/291126@main



To unsubscribe from these emails, change your notification settings at https://github.com/WebKit/WebKit/settings/notifications


More information about the webkit-changes mailing list