OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
11 * notice, this list of conditions and the following disclaimer in the | 11 * notice, this list of conditions and the following disclaimer in the |
12 * documentation and/or other materials provided with the distribution. | 12 * documentation and/or other materials provided with the distribution. |
13 * | 13 * |
14 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY | 14 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY |
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
17 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY | 17 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY |
18 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 18 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
19 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 19 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
20 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 20 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
21 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 21 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
24 */ | 24 */ |
25 | 25 |
26 #ifndef IDBTransaction_h | 26 #ifndef IDBTransaction_h |
27 #define IDBTransaction_h | 27 #define IDBTransaction_h |
28 | 28 |
29 #include <memory> | |
30 | |
29 #include "core/dom/ContextLifecycleObserver.h" | 31 #include "core/dom/ContextLifecycleObserver.h" |
30 #include "core/dom/DOMStringList.h" | 32 #include "core/dom/DOMStringList.h" |
31 #include "core/events/EventListener.h" | 33 #include "core/events/EventListener.h" |
32 #include "modules/EventModules.h" | 34 #include "modules/EventModules.h" |
33 #include "modules/EventTargetModules.h" | 35 #include "modules/EventTargetModules.h" |
34 #include "modules/ModulesExport.h" | 36 #include "modules/ModulesExport.h" |
35 #include "modules/indexeddb/IDBMetadata.h" | 37 #include "modules/indexeddb/IDBMetadata.h" |
36 #include "modules/indexeddb/IndexedDB.h" | 38 #include "modules/indexeddb/IndexedDB.h" |
37 #include "platform/bindings/ActiveScriptWrappable.h" | 39 #include "platform/bindings/ActiveScriptWrappable.h" |
38 #include "platform/heap/Handle.h" | 40 #include "platform/heap/Handle.h" |
41 #include "platform/wtf/Deque.h" | |
39 #include "platform/wtf/HashSet.h" | 42 #include "platform/wtf/HashSet.h" |
40 #include "platform/wtf/Vector.h" | 43 #include "platform/wtf/Vector.h" |
41 #include "public/platform/modules/indexeddb/WebIDBDatabase.h" | 44 #include "public/platform/modules/indexeddb/WebIDBDatabase.h" |
42 #include "public/platform/modules/indexeddb/WebIDBTypes.h" | 45 #include "public/platform/modules/indexeddb/WebIDBTypes.h" |
43 | 46 |
44 namespace blink { | 47 namespace blink { |
45 | 48 |
46 class DOMException; | 49 class DOMException; |
47 class ExecutionContext; | 50 class ExecutionContext; |
48 class ExceptionState; | 51 class ExceptionState; |
49 class IDBDatabase; | 52 class IDBDatabase; |
50 class IDBIndex; | 53 class IDBIndex; |
51 class IDBObjectStore; | 54 class IDBObjectStore; |
52 class IDBOpenDBRequest; | 55 class IDBOpenDBRequest; |
53 class IDBRequest; | 56 class IDBRequest; |
57 class IDBRequestQueueItem; | |
54 class ScriptState; | 58 class ScriptState; |
55 | 59 |
56 class MODULES_EXPORT IDBTransaction final | 60 class MODULES_EXPORT IDBTransaction final |
57 : public EventTargetWithInlineData, | 61 : public EventTargetWithInlineData, |
58 public ActiveScriptWrappable<IDBTransaction>, | 62 public ActiveScriptWrappable<IDBTransaction>, |
59 public ContextLifecycleObserver { | 63 public ContextLifecycleObserver { |
60 USING_GARBAGE_COLLECTED_MIXIN(IDBTransaction); | 64 USING_GARBAGE_COLLECTED_MIXIN(IDBTransaction); |
61 DEFINE_WRAPPERTYPEINFO(); | 65 DEFINE_WRAPPERTYPEINFO(); |
62 | 66 |
63 public: | 67 public: |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
98 const String& mode() const; | 102 const String& mode() const; |
99 DOMStringList* objectStoreNames() const; | 103 DOMStringList* objectStoreNames() const; |
100 IDBDatabase* db() const { return database_.Get(); } | 104 IDBDatabase* db() const { return database_.Get(); } |
101 DOMException* error() const { return error_; } | 105 DOMException* error() const { return error_; } |
102 IDBObjectStore* objectStore(const String& name, ExceptionState&); | 106 IDBObjectStore* objectStore(const String& name, ExceptionState&); |
103 void abort(ExceptionState&); | 107 void abort(ExceptionState&); |
104 | 108 |
105 void RegisterRequest(IDBRequest*); | 109 void RegisterRequest(IDBRequest*); |
106 void UnregisterRequest(IDBRequest*); | 110 void UnregisterRequest(IDBRequest*); |
107 | 111 |
112 // True if this transaction has at least one request whose result is being | |
113 // post-processed. | |
114 // | |
115 // While this is true, new results must be queued using QueueResult(). | |
jsbell
2017/05/15 23:37:38
nit: EnqueueResult
pwnall
2017/05/19 18:27:35
Done.
| |
116 inline bool HasQueuedResults() const { return !result_queue_.empty(); } | |
117 void EnqueueResult(std::unique_ptr<IDBRequestQueueItem> result); | |
118 // Called when a result's post-processing has completed. | |
119 void OnResultReady(); | |
120 | |
108 // The methods below are called right before the changes are applied to the | 121 // The methods below are called right before the changes are applied to the |
109 // database's metadata. We use this unusual sequencing because some of the | 122 // database's metadata. We use this unusual sequencing because some of the |
110 // methods below need to access the metadata values before the change, and | 123 // methods below need to access the metadata values before the change, and |
111 // following the same lifecycle for all methods makes the code easier to | 124 // following the same lifecycle for all methods makes the code easier to |
112 // reason about. | 125 // reason about. |
113 void ObjectStoreCreated(const String& name, IDBObjectStore*); | 126 void ObjectStoreCreated(const String& name, IDBObjectStore*); |
114 void ObjectStoreDeleted(const int64_t object_store_id, const String& name); | 127 void ObjectStoreDeleted(const int64_t object_store_id, const String& name); |
115 void ObjectStoreRenamed(const String& old_name, const String& new_name); | 128 void ObjectStoreRenamed(const String& old_name, const String& new_name); |
116 // Called when deleting an index whose IDBIndex had been created. | 129 // Called when deleting an index whose IDBIndex had been created. |
117 void IndexDeleted(IDBIndex*); | 130 void IndexDeleted(IDBIndex*); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
205 // because object stores cannot be renamed in non-versionchange | 218 // because object stores cannot be renamed in non-versionchange |
206 // transactions. | 219 // transactions. |
207 const HashSet<String> scope_; | 220 const HashSet<String> scope_; |
208 | 221 |
209 State state_ = kActive; | 222 State state_ = kActive; |
210 bool has_pending_activity_ = true; | 223 bool has_pending_activity_ = true; |
211 Member<DOMException> error_; | 224 Member<DOMException> error_; |
212 | 225 |
213 HeapListHashSet<Member<IDBRequest>> request_list_; | 226 HeapListHashSet<Member<IDBRequest>> request_list_; |
214 | 227 |
228 // The IDBRequest results whose events have not fired yet. | |
jsbell
2017/05/15 23:37:38
nit: enqueued, not fired
pwnall
2017/05/19 18:27:35
Done.
| |
229 // | |
230 // When a result requires post-processing, such as large value unwrapping, all | |
231 // the results that arrive during the post-processing phase are queued up. | |
232 // This guarantees that result events are fired in the order in which the | |
233 // requests were performed, as prescribed by the IndexedDB specification. | |
234 Deque<std::unique_ptr<IDBRequestQueueItem>> result_queue_; | |
235 | |
215 #if DCHECK_IS_ON() | 236 #if DCHECK_IS_ON() |
216 bool finish_called_ = false; | 237 bool finish_called_ = false; |
217 #endif // DCHECK_IS_ON() | 238 #endif // DCHECK_IS_ON() |
218 | 239 |
219 // Caches the IDBObjectStore instances returned by the objectStore() method. | 240 // Caches the IDBObjectStore instances returned by the objectStore() method. |
220 // | 241 // |
221 // The spec requires that a transaction's objectStore() returns the same | 242 // The spec requires that a transaction's objectStore() returns the same |
222 // IDBObjectStore instance for a specific store, so this cache is necessary | 243 // IDBObjectStore instance for a specific store, so this cache is necessary |
223 // for correctness. | 244 // for correctness. |
224 // | 245 // |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
256 // This does not include a snapshot of the database's object store / index | 277 // This does not include a snapshot of the database's object store / index |
257 // metadata. | 278 // metadata. |
258 // | 279 // |
259 // Only valid for versionchange transactions. | 280 // Only valid for versionchange transactions. |
260 IDBDatabaseMetadata old_database_metadata_; | 281 IDBDatabaseMetadata old_database_metadata_; |
261 }; | 282 }; |
262 | 283 |
263 } // namespace blink | 284 } // namespace blink |
264 | 285 |
265 #endif // IDBTransaction_h | 286 #endif // IDBTransaction_h |
OLD | NEW |