Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(788)

Unified Diff: third_party/WebKit/Source/modules/indexeddb/IDBRequest.h

Issue 2822453003: Wrap large IndexedDB values into Blobs before writing to LevelDB. (Closed)
Patch Set: WIP: Getting IDBRequestTest.EventsAfterStopping to pass. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/indexeddb/IDBRequest.h
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBRequest.h b/third_party/WebKit/Source/modules/indexeddb/IDBRequest.h
index 9f271b74ea499cc7318d796a7b5fdf5c67f007cd..fdcca3e45ea43f55e0606b404a4ad5697021deaf 100644
--- a/third_party/WebKit/Source/modules/indexeddb/IDBRequest.h
+++ b/third_party/WebKit/Source/modules/indexeddb/IDBRequest.h
@@ -46,6 +46,7 @@
#include "platform/blob/BlobData.h"
#include "platform/heap/Handle.h"
#include "platform/wtf/HashMap.h"
+#include "platform/wtf/RefPtr.h"
#include "public/platform/WebBlobInfo.h"
#include "public/platform/modules/indexeddb/WebIDBCursor.h"
#include "public/platform/modules/indexeddb/WebIDBTypes.h"
@@ -98,24 +99,22 @@ class MODULES_EXPORT IDBRequest : public EventTargetWithInlineData,
void SetPendingCursor(IDBCursor*);
void Abort();
- void EnqueueResponse(DOMException*);
- void EnqueueResponse(std::unique_ptr<WebIDBCursor>,
- IDBKey*,
- IDBKey* primary_key,
- PassRefPtr<IDBValue>);
- void EnqueueResponse(IDBKey*);
- void EnqueueResponse(PassRefPtr<IDBValue>);
- void EnqueueResponse(const Vector<RefPtr<IDBValue>>&);
- void EnqueueResponse();
- void EnqueueResponse(IDBKey*, IDBKey* primary_key, PassRefPtr<IDBValue>);
+ void HandleResponse(DOMException*);
jsbell 2017/05/15 23:37:38 Please add a comment covering the general behavior
pwnall 2017/05/19 18:27:34 Done.
+ void HandleResponse(IDBKey*);
+ void HandleResponse(std::unique_ptr<WebIDBCursor>,
+ IDBKey*,
+ IDBKey* primary_key,
+ RefPtr<IDBValue>&&);
+ void HandleResponse(IDBKey*, IDBKey* primary_key, RefPtr<IDBValue>&&);
+ void HandleResponse(RefPtr<IDBValue>&&);
+ void HandleResponse(const Vector<RefPtr<IDBValue>>&);
+ void HandleResponse(int64_t);
jsbell 2017/05/15 23:37:38 Since it's non-obvious, add the parameter name her
pwnall 2017/05/19 18:27:34 Done. I didn't add the parameter name before becau
+ void HandleResponse();
jsbell 2017/05/15 23:37:38 At one point we had documentation in the .h files
pwnall 2017/05/19 18:27:34 I agree! Can I do that in a follow-up CL? Making
jsbell 2017/05/22 21:54:19 sgtm
// Only used in webkitGetDatabaseNames(), which is deprecated and hopefully
// going away soon.
void EnqueueResponse(const Vector<String>&);
- // Overridden by IDBOpenDBRequest.
- virtual void EnqueueResponse(int64_t);
-
// Only IDBOpenDBRequest instances should receive these:
virtual void EnqueueBlocked(int64_t old_version) { NOTREACHED(); }
virtual void EnqueueUpgradeNeeded(int64_t old_version,
@@ -148,11 +147,29 @@ class MODULES_EXPORT IDBRequest : public EventTargetWithInlineData,
IDBCursor* GetResultCursor() const;
- void StorePutOperationBlobs(
- HashMap<String, RefPtr<BlobDataHandle>> blob_handles) {
- transit_blob_handles_ = std::move(blob_handles);
+ // Used to hang onto Blobs until the browser process handles the request.
+ //
+ // Blobs are ref-counted on the browser side, and BlobDataHandles manage
+ // references from renderers. When a BlobDataHandle gets destroyed, the
+ // browser-side Blob gets derefenced, which might cause it to be destroyed as
+ // well.
+ //
+ // After script uses a Blob in a put() request, the Blink-side Blob object
+ // (which hangs onto the BlobDataHandle) may get garbage-collected. IDBRequest
+ // needs to hang onto the BlobDataHandle as well, to avoid having the
+ // browser-side Blob get destroyed before the IndexedDB request is processed.
+ inline Vector<RefPtr<BlobDataHandle>>* transit_blob_handles() {
+ return &transit_blob_handles_;
}
+#if DCHECK_IS_ON()
+ inline bool TransactionHasQueuedResults() const {
jsbell 2017/05/15 23:37:38 Why did you decide to make this debug-only? Seems
pwnall 2017/05/19 18:27:34 This method does an extra check -- transaction_ !=
+ return transaction_ && transaction_->HasQueuedResults();
+ }
+
+ inline IDBRequestQueueItem* QueueItem() const { return queue_item_; }
+#endif // DCHECK_IS_ON()
+
protected:
IDBRequest(ScriptState*, IDBAny* source, IDBTransaction*);
void EnqueueEvent(Event*);
@@ -161,10 +178,16 @@ class MODULES_EXPORT IDBRequest : public EventTargetWithInlineData,
void EnqueueResultInternal(IDBAny*);
void SetResult(IDBAny*);
+ // Overridden by IDBOpenDBRequest.
+ virtual void EnqueueResponse(int64_t);
+
// EventTarget
DispatchEventResult DispatchEventInternal(Event*) override;
+ // Can be nullptr for requests that are not associated with a transaction,
+ // i.e. delete requests and completed or unsuccessful open requests.
Member<IDBTransaction> transaction_;
+
ReadyState ready_state_ = PENDING;
bool request_aborted_ = false; // May be aborted by transaction then receive
// async onsuccess; ignore vs. assert.
@@ -173,14 +196,26 @@ class MODULES_EXPORT IDBRequest : public EventTargetWithInlineData,
v8::Isolate* isolate_;
private:
+ // Calls into OnError() and OnSuccess().
jsbell 2017/05/15 23:37:38 Comment is obsolete
pwnall 2017/05/19 18:27:34 Done. Updated the method name. Thank you for catch
+ friend class IDBRequestQueueItem;
+
void SetResultCursor(IDBCursor*,
IDBKey*,
IDBKey* primary_key,
- PassRefPtr<IDBValue>);
+ RefPtr<IDBValue>&&);
void AckReceivedBlobs(const IDBValue*);
void AckReceivedBlobs(const Vector<RefPtr<IDBValue>>&);
- void ClearPutOperationBlobs() { transit_blob_handles_.clear(); }
+ void EnqueueResponse(DOMException*);
+ void EnqueueResponse(IDBKey*);
+ void EnqueueResponse(std::unique_ptr<WebIDBCursor>,
+ IDBKey*,
+ IDBKey* primary_key,
+ RefPtr<IDBValue>&&);
+ void EnqueueResponse(IDBKey*, IDBKey* primary_key, RefPtr<IDBValue>&&);
+ void EnqueueResponse(RefPtr<IDBValue>&&);
+ void EnqueueResponse(const Vector<RefPtr<IDBValue>>&);
+ void EnqueueResponse();
Member<IDBAny> source_;
Member<IDBAny> result_;
@@ -201,7 +236,7 @@ class MODULES_EXPORT IDBRequest : public EventTargetWithInlineData,
Member<IDBKey> cursor_primary_key_;
RefPtr<IDBValue> cursor_value_;
- HashMap<String, RefPtr<BlobDataHandle>> transit_blob_handles_;
+ Vector<RefPtr<BlobDataHandle>> transit_blob_handles_;
bool did_fire_upgrade_needed_event_ = false;
bool prevent_propagation_ = false;
@@ -216,6 +251,12 @@ class MODULES_EXPORT IDBRequest : public EventTargetWithInlineData,
// Pointer back to the WebIDBCallbacks that holds a persistent reference to
// this object.
WebIDBCallbacks* web_callbacks_ = nullptr;
+
+#if DCHECK_IS_ON()
+ // Non-null while this request's is queued behind other requests that are
jsbell 2017/05/15 23:37:38 nit: grammar: 'request is'
pwnall 2017/05/19 18:27:34 Done.
+ // still getting post-processed.
+ IDBRequestQueueItem* queue_item_ = nullptr;
+#endif // DCHECK_IS_ON()
};
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698