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

Side by Side Diff: third_party/WebKit/Source/modules/indexeddb/IDBRequestLoader.h

Issue 2822453003: Wrap large IndexedDB values into Blobs before writing to LevelDB. (Closed)
Patch Set: Addressed last round of feedback. Created 3 years, 6 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef IDBRequestLoader_h
6 #define IDBRequestLoader_h
7
8 #include "core/fileapi/FileReaderLoaderClient.h"
9 #include "platform/wtf/Allocator.h"
10 #include "platform/wtf/PassRefPtr.h"
11 #include "platform/wtf/RefPtr.h"
12 #include "platform/wtf/Vector.h"
13
14 #include <memory>
15
16 namespace blink {
17
18 class FileReaderLoader;
19 class IDBRequestQueueItem;
20 class IDBRequest;
21 class IDBValue;
22
23 // Loads IndexedDB values that have been wrapped in Blobs by IDBValueWrapper.
24 //
25 // An IDBRequestLoader unwraps the result of a single IDBRequest. While most
26 // IndexedDB requests result in a single value, getAll() in IDBObjectStore and
27 // IDBIndex results in an array of values. In the interest of simplicity,
28 // IDBRequestLoader only knows how to unwrap an array of values, even though
29 // most of the time the array will consist of a single element. This design
30 // assumes that the overhead of creating and destroying a Vector is much smaller
31 // than the IPC overhead required to load the Blob data into the renderer.
32 class IDBRequestLoader : public FileReaderLoaderClient {
33 USING_FAST_MALLOC(IDBRequestLoader);
34
35 public:
36 // Creates a loader that will unwrap IDBValues received by a IDBRequest.
37 //
38 // result_values must be kept alive until the loader calls
39 // IDBRequestQueueItem::OnResultLoadComplete().
40 IDBRequestLoader(IDBRequestQueueItem*,
41 Vector<RefPtr<IDBValue>>* result_values);
42
43 ~IDBRequestLoader() override;
44
45 // Start unwrapping values.
46 //
47 // When the unwrapping completes, the loader will call OnResultLoadComplete()
48 // on the request queue item.
49 void Start();
50 // Halt the process of unwrapping values, if possible.
51 void Cancel();
52
53 // FileReaderLoaderClient implementaton.
54 void DidStartLoading() override;
55 void DidReceiveDataForClient(const char* data, unsigned data_length) override;
56 void DidFinishLoading() override;
57 void DidFail(FileError::ErrorCode) override;
58
59 private:
60 // Starts unwrapping the next wrapped IDBValue.
61 //
62 // If no more wrapped IDBValues are found, this calls ReportSuccess(), which
63 // ends up calling IDBRequestQueueItem::OnResultLoadComplete().
64 void StartNextValue();
65
66 void ReportSuccess();
67 void ReportError();
68
69 std::unique_ptr<FileReaderLoader> loader_;
70
71 // Transaction result queue item for the IDBRequest.
72 //
73 // The IDBRequestQueueItem owns this loader.
74 IDBRequestQueueItem* queue_item_;
75
76 // All the values that will be passed back to the IDBRequest.
77 //
78 // The Vector is owned by the IDBRequestLoader owner, which is currently a
79 // IDBRequestQueueItem.
80 Vector<RefPtr<IDBValue>>* const values_;
81
82 // Buffer used to unwrap an IDBValue.
83 Vector<char> wrapped_data_;
84
85 // The value being currently unwrapped.
86 Vector<RefPtr<IDBValue>>::iterator current_value_;
87 };
88
89 } // namespace blink
90
91 #endif // IDBRequestLoader_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698