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

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

Issue 2822453003: Wrap large IndexedDB values into Blobs before writing to LevelDB. (Closed)
Patch Set: Created 3 years, 8 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/IDBRequestLoader.h
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBRequestLoader.h b/third_party/WebKit/Source/modules/indexeddb/IDBRequestLoader.h
new file mode 100644
index 0000000000000000000000000000000000000000..908c294c2cfc68d13c9dae5edcb8b5db43a0860a
--- /dev/null
+++ b/third_party/WebKit/Source/modules/indexeddb/IDBRequestLoader.h
@@ -0,0 +1,114 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IDBRequestLoader_h
+#define IDBRequestLoader_h
+
+#include "core/fileapi/FileReaderLoaderClient.h"
+#include "platform/heap/Handle.h"
+#include "platform/wtf/PassRefPtr.h"
+#include "platform/wtf/RefPtr.h"
+#include "platform/wtf/Vector.h"
+
+#include <memory>
+
+namespace blink {
+
+class FileReaderLoader;
+class IDBKey;
+class IDBRequest;
+class IDBValue;
+class WebIDBCursor;
+
+// Loads IndexedDB values that have been wrapped in Blobs by IDBValueWrapper.
+class IDBRequestLoader : public GarbageCollectedFinalized<IDBRequestLoader>,
+ public FileReaderLoaderClient {
+ public:
+ // Creates a reader that will unwrap IDBValues received by a IDBRequest.
+ IDBRequestLoader(IDBRequest*);
+
+ ~IDBRequestLoader() override;
+
+ static bool NeedsUnwrapping(IDBValue*);
+ static bool NeedUnwrapping(const Vector<RefPtr<IDBValue>>&);
+
+ // Start unwrapping values.
+ //
+ // Exactly one of these methods should be called for a reader.
+ void Start(PassRefPtr<IDBValue>);
+ void Start(const Vector<RefPtr<IDBValue>>&);
+ void Start(IDBKey*, IDBKey* primary_key, PassRefPtr<IDBValue>);
+ void Start(std::unique_ptr<WebIDBCursor> backend,
+ IDBKey*,
+ IDBKey* primary_key,
+ PassRefPtr<IDBValue>);
+
+ // FileReaderLoaderClient implementaton.
+ void DidStartLoading() override;
+ void DidReceiveDataForClient(const char* data, unsigned data_length) override;
+ void DidFinishLoading() override;
+ void DidFail(FileError::ErrorCode) override;
+
+ DEFINE_INLINE_TRACE() {
+ visitor->Trace(request_);
+ visitor->Trace(key_);
+ visitor->Trace(primary_key_);
+ }
+
+ private:
+ // The IDBRequest callback that will be called by this reader.
+ enum Mode {
+ kUninitialized = 0,
+ kValue,
+ kValueArray,
+ kKeyPrimaryKeyValue,
+ kBackendKeyPrimaryKeyValue,
+ };
+
+ // Starts unwrapping the next wrapped IDBValue.
+ //
+ // If no more wrapped IDBValues are found, this calls the IDBRequest
+ // callbacks.
+ void StartNextValue();
+
+ void ReportSuccess();
+ void ReportError();
+
+ // The IDBRequest callback that will be called by this reader.
+ Mode mode_;
+
+ std::unique_ptr<FileReaderLoader> loader_;
+
+ // The IDBRequest whose IDBValues are unwrapped by this reader.
+ Member<IDBRequest> request_;
+
+ // All the values that will be passed back to the IDBRequest.
+ Vector<RefPtr<IDBValue>> values_;
+
+ // The key argument to the IDBRequest callback.
+ //
+ // Only used if mode_ is kKeyPrimaryKeyValue.
+ Member<IDBKey> key_;
+
+ // The primary_key argument to the IDBRequest callback.
+ //
+ // Only used if mode_ is kKeyPrimaryKeyValue.
+ Member<IDBKey> primary_key_;
+
+ // The backend argument to the IDBRequest callback.
+ std::unique_ptr<WebIDBCursor> backend_;
+
+ // Indexes of the IDBValues in values_ that have been wrapped in Blobs.
+ Vector<unsigned> wrapped_value_indexes_;
+
+ // Buffer used to unwrap an IDBValue.
+ Vector<char> wrapped_data_;
+
+ // The value being currently unwrapped.
+ Vector<RefPtr<IDBValue>>::iterator current_value_;
+};
+
+} // namespace blink
+
+#endif // IDBRequestLoader_h

Powered by Google App Engine
This is Rietveld 408576698