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 EnqueueResult(). |
| 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 been enqueued yet. |
| 229 // |
| 230 // When a result requires post-processing, such as large value unwrapping, it |
| 231 // is queued up until post-processing completes. All the results that arrive |
| 232 // during the post-processing phase are also queued up, so their result events |
| 233 // are fired in the order in which the requests were performed, as prescribed |
| 234 // by the IndexedDB specification. |
| 235 Deque<std::unique_ptr<IDBRequestQueueItem>> result_queue_; |
| 236 |
215 #if DCHECK_IS_ON() | 237 #if DCHECK_IS_ON() |
216 bool finish_called_ = false; | 238 bool finish_called_ = false; |
217 #endif // DCHECK_IS_ON() | 239 #endif // DCHECK_IS_ON() |
218 | 240 |
219 // Caches the IDBObjectStore instances returned by the objectStore() method. | 241 // Caches the IDBObjectStore instances returned by the objectStore() method. |
220 // | 242 // |
221 // The spec requires that a transaction's objectStore() returns the same | 243 // The spec requires that a transaction's objectStore() returns the same |
222 // IDBObjectStore instance for a specific store, so this cache is necessary | 244 // IDBObjectStore instance for a specific store, so this cache is necessary |
223 // for correctness. | 245 // for correctness. |
224 // | 246 // |
(...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 | 278 // This does not include a snapshot of the database's object store / index |
257 // metadata. | 279 // metadata. |
258 // | 280 // |
259 // Only valid for versionchange transactions. | 281 // Only valid for versionchange transactions. |
260 IDBDatabaseMetadata old_database_metadata_; | 282 IDBDatabaseMetadata old_database_metadata_; |
261 }; | 283 }; |
262 | 284 |
263 } // namespace blink | 285 } // namespace blink |
264 | 286 |
265 #endif // IDBTransaction_h | 287 #endif // IDBTransaction_h |
OLD | NEW |