// Copyright 2017 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_IDB_REQUEST_QUEUE_ITEM_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_IDB_REQUEST_QUEUE_ITEM_H_ #include <memory> #include "base/dcheck_is_on.h" #include "base/functional/callback.h" #include "base/memory/weak_ptr.h" #include "mojo/public/cpp/bindings/pending_associated_remote.h" #include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h" #include "third_party/blink/renderer/platform/heap/persistent.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "third_party/blink/renderer/platform/wtf/deque.h" #include "third_party/blink/renderer/platform/wtf/vector.h" namespace blink { class DOMException; class IDBDatabaseGetAllResultSinkImpl; class IDBKey; class IDBRequest; class IDBRequestLoader; class IDBRequestTest; class IDBValue; // Queues up a transaction's IDBRequest results for orderly delivery. // // The IndexedDB specification requires that the events corresponding to IDB // request results fire in the order in which the requests were issued. The // browser-side backend processes requests in order, but the Blink side may need // to perform post-processing on the results (e.g. large value unwrapping). // When a result needs post-processing, this queue captures all results received // during the post-processing steps. The events for these results may only fire // after the post-processed result's event is fired. // // A queue item holds a Persistent (not garbage-collected) reference to the // IDBRequest whose result it will deliver. This creates a reference cycle, // because IDBRequest holds a pointer to its IDBTransaction, and IDBTransaction // stores all pending IDBRequestQueueItem instances for its requests in a queue // via non-garbage-collected pointers (std::unique_ptr). To avoid leaks, the // request-processing code must ensure that IDBTransaction's queue gets drained // at some point, even if the transaction's ExecutionContext goes away. The // lifecycle tests in IDBTransactionTest aim to cover this requirement. // // Given that the cycle above exists, the closures passed to IDBRequestQueueItem // can safely store Persistent pointers the IDBRequest or to the IDBTransaction. class MODULES_EXPORT IDBRequestQueueItem { … }; IDBRequestQueue; } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_IDB_REQUEST_QUEUE_ITEM_H_