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

Side by Side Diff: Source/modules/indexeddb/IDBObjectStore.cpp

Issue 295163005: Remove ScriptState::current() from IDBRequest (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 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 | Annotate | Revision Log
« no previous file with comments | « Source/modules/indexeddb/IDBObjectStore.h ('k') | Source/modules/indexeddb/IDBObjectStore.idl » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 PassRefPtrWillBeRawPtr<DOMStringList> IDBObjectStore::indexNames() const 77 PassRefPtrWillBeRawPtr<DOMStringList> IDBObjectStore::indexNames() const
78 { 78 {
79 IDB_TRACE("IDBObjectStore::indexNames"); 79 IDB_TRACE("IDBObjectStore::indexNames");
80 RefPtrWillBeRawPtr<DOMStringList> indexNames = DOMStringList::create(); 80 RefPtrWillBeRawPtr<DOMStringList> indexNames = DOMStringList::create();
81 for (IDBObjectStoreMetadata::IndexMap::const_iterator it = m_metadata.indexe s.begin(); it != m_metadata.indexes.end(); ++it) 81 for (IDBObjectStoreMetadata::IndexMap::const_iterator it = m_metadata.indexe s.begin(); it != m_metadata.indexes.end(); ++it)
82 indexNames->append(it->value.name); 82 indexNames->append(it->value.name);
83 indexNames->sort(); 83 indexNames->sort();
84 return indexNames.release(); 84 return indexNames.release();
85 } 85 }
86 86
87 IDBRequest* IDBObjectStore::get(ExecutionContext* context, const ScriptValue& ke y, ExceptionState& exceptionState) 87 IDBRequest* IDBObjectStore::get(ScriptState* scriptState, const ScriptValue& key , ExceptionState& exceptionState)
88 { 88 {
89 IDB_TRACE("IDBObjectStore::get"); 89 IDB_TRACE("IDBObjectStore::get");
90 if (isDeleted()) { 90 if (isDeleted()) {
91 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS toreDeletedErrorMessage); 91 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS toreDeletedErrorMessage);
92 return 0; 92 return 0;
93 } 93 }
94 if (m_transaction->isFinished() || m_transaction->isFinishing()) { 94 if (m_transaction->isFinished() || m_transaction->isFinishing()) {
95 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionFinishedErrorMessage); 95 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionFinishedErrorMessage);
96 return 0; 96 return 0;
97 } 97 }
98 if (!m_transaction->isActive()) { 98 if (!m_transaction->isActive()) {
99 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionInactiveErrorMessage); 99 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionInactiveErrorMessage);
100 return 0; 100 return 0;
101 } 101 }
102 IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(context, key, exception State); 102 IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->executionC ontext(), key, exceptionState);
103 if (exceptionState.hadException()) 103 if (exceptionState.hadException())
104 return 0; 104 return 0;
105 if (!keyRange) { 105 if (!keyRange) {
106 exceptionState.throwDOMException(DataError, IDBDatabase::noKeyOrKeyRange ErrorMessage); 106 exceptionState.throwDOMException(DataError, IDBDatabase::noKeyOrKeyRange ErrorMessage);
107 return 0; 107 return 0;
108 } 108 }
109 if (!backendDB()) { 109 if (!backendDB()) {
110 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databas eClosedErrorMessage); 110 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databas eClosedErrorMessage);
111 return 0; 111 return 0;
112 } 112 }
113 113
114 IDBRequest* request = IDBRequest::create(context, IDBAny::create(this), m_tr ansaction.get()); 114 IDBRequest* request = IDBRequest::create(scriptState, IDBAny::create(this), m_transaction.get());
115 backendDB()->get(m_transaction->id(), id(), IDBIndexMetadata::InvalidId, key Range, false, WebIDBCallbacksImpl::create(request).leakPtr()); 115 backendDB()->get(m_transaction->id(), id(), IDBIndexMetadata::InvalidId, key Range, false, WebIDBCallbacksImpl::create(request).leakPtr());
116 return request; 116 return request;
117 } 117 }
118 118
119 static void generateIndexKeysForValue(v8::Isolate* isolate, const IDBIndexMetada ta& indexMetadata, const ScriptValue& objectValue, IDBObjectStore::IndexKeys* in dexKeys) 119 static void generateIndexKeysForValue(v8::Isolate* isolate, const IDBIndexMetada ta& indexMetadata, const ScriptValue& objectValue, IDBObjectStore::IndexKeys* in dexKeys)
120 { 120 {
121 ASSERT(indexKeys); 121 ASSERT(indexKeys);
122 IDBKey* indexKey = createIDBKeyFromScriptValueAndKeyPath(isolate, objectValu e, indexMetadata.keyPath); 122 IDBKey* indexKey = createIDBKeyFromScriptValueAndKeyPath(isolate, objectValu e, indexMetadata.keyPath);
123 123
124 if (!indexKey) 124 if (!indexKey)
125 return; 125 return;
126 126
127 if (!indexMetadata.multiEntry || indexKey->type() != IDBKey::ArrayType) { 127 if (!indexMetadata.multiEntry || indexKey->type() != IDBKey::ArrayType) {
128 if (!indexKey->isValid()) 128 if (!indexKey->isValid())
129 return; 129 return;
130 130
131 indexKeys->append(indexKey); 131 indexKeys->append(indexKey);
132 } else { 132 } else {
133 ASSERT(indexMetadata.multiEntry); 133 ASSERT(indexMetadata.multiEntry);
134 ASSERT(indexKey->type() == IDBKey::ArrayType); 134 ASSERT(indexKey->type() == IDBKey::ArrayType);
135 indexKey = IDBKey::createMultiEntryArray(indexKey->array()); 135 indexKey = IDBKey::createMultiEntryArray(indexKey->array());
136 136
137 for (size_t i = 0; i < indexKey->array().size(); ++i) 137 for (size_t i = 0; i < indexKey->array().size(); ++i)
138 indexKeys->append(indexKey->array()[i]); 138 indexKeys->append(indexKey->array()[i]);
139 } 139 }
140 } 140 }
141 141
142 IDBRequest* IDBObjectStore::add(ExecutionContext* executionContext, ScriptValue& value, const ScriptValue& key, ExceptionState& exceptionState) 142 IDBRequest* IDBObjectStore::add(ScriptState* scriptState, ScriptValue& value, co nst ScriptValue& key, ExceptionState& exceptionState)
143 { 143 {
144 IDB_TRACE("IDBObjectStore::add"); 144 IDB_TRACE("IDBObjectStore::add");
145 return put(executionContext, WebIDBDatabase::AddOnly, IDBAny::create(this), value, key, exceptionState); 145 return put(scriptState, WebIDBDatabase::AddOnly, IDBAny::create(this), value , key, exceptionState);
146 } 146 }
147 147
148 IDBRequest* IDBObjectStore::put(ExecutionContext* executionContext, ScriptValue& value, const ScriptValue& key, ExceptionState& exceptionState) 148 IDBRequest* IDBObjectStore::put(ScriptState* scriptState, ScriptValue& value, co nst ScriptValue& key, ExceptionState& exceptionState)
149 { 149 {
150 IDB_TRACE("IDBObjectStore::put"); 150 IDB_TRACE("IDBObjectStore::put");
151 return put(executionContext, WebIDBDatabase::AddOrUpdate, IDBAny::create(thi s), value, key, exceptionState); 151 return put(scriptState, WebIDBDatabase::AddOrUpdate, IDBAny::create(this), v alue, key, exceptionState);
152 } 152 }
153 153
154 IDBRequest* IDBObjectStore::put(ExecutionContext* executionContext, WebIDBDataba se::PutMode putMode, IDBAny* source, ScriptValue& value, const ScriptValue& keyV alue, ExceptionState& exceptionState) 154 IDBRequest* IDBObjectStore::put(ScriptState* scriptState, WebIDBDatabase::PutMod e putMode, IDBAny* source, ScriptValue& value, const ScriptValue& keyValue, Exce ptionState& exceptionState)
155 { 155 {
156 IDBKey* key = keyValue.isUndefined() ? 0 : scriptValueToIDBKey(toIsolate(exe cutionContext), keyValue); 156 IDBKey* key = keyValue.isUndefined() ? nullptr : scriptValueToIDBKey(scriptS tate->isolate(), keyValue);
157 return put(executionContext, putMode, source, value, key, exceptionState); 157 return put(scriptState, putMode, source, value, key, exceptionState);
158 } 158 }
159 159
160 IDBRequest* IDBObjectStore::put(ExecutionContext* executionContext, WebIDBDataba se::PutMode putMode, IDBAny* source, ScriptValue& value, IDBKey* key, ExceptionS tate& exceptionState) 160 IDBRequest* IDBObjectStore::put(ScriptState* scriptState, WebIDBDatabase::PutMod e putMode, IDBAny* source, ScriptValue& value, IDBKey* key, ExceptionState& exce ptionState)
161 { 161 {
162 if (isDeleted()) { 162 if (isDeleted()) {
163 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS toreDeletedErrorMessage); 163 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS toreDeletedErrorMessage);
164 return 0; 164 return 0;
165 } 165 }
166 if (m_transaction->isFinished() || m_transaction->isFinishing()) { 166 if (m_transaction->isFinished() || m_transaction->isFinishing()) {
167 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionFinishedErrorMessage); 167 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionFinishedErrorMessage);
168 return 0; 168 return 0;
169 } 169 }
170 if (!m_transaction->isActive()) { 170 if (!m_transaction->isActive()) {
171 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionInactiveErrorMessage); 171 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionInactiveErrorMessage);
172 return 0; 172 return 0;
173 } 173 }
174 if (m_transaction->isReadOnly()) { 174 if (m_transaction->isReadOnly()) {
175 exceptionState.throwDOMException(ReadOnlyError, IDBDatabase::transaction ReadOnlyErrorMessage); 175 exceptionState.throwDOMException(ReadOnlyError, IDBDatabase::transaction ReadOnlyErrorMessage);
176 return 0; 176 return 0;
177 } 177 }
178 178
179 Vector<WebBlobInfo> blobInfo; 179 Vector<WebBlobInfo> blobInfo;
180 180
181 RefPtr<SerializedScriptValue> serializedValue = SerializedScriptValue::creat e(value, &blobInfo, exceptionState, toIsolate(executionContext)); 181 RefPtr<SerializedScriptValue> serializedValue = SerializedScriptValue::creat e(value, &blobInfo, exceptionState, scriptState->isolate());
182 if (exceptionState.hadException()) 182 if (exceptionState.hadException())
183 return 0; 183 return 0;
184 184
185 if (serializedValue->containsBlobs()) { 185 if (serializedValue->containsBlobs()) {
186 // FIXME: Add Blob/File/FileList support 186 // FIXME: Add Blob/File/FileList support
187 exceptionState.throwDOMException(DataCloneError, "The object store curre ntly does not support blob values."); 187 exceptionState.throwDOMException(DataCloneError, "The object store curre ntly does not support blob values.");
188 return 0; 188 return 0;
189 } 189 }
190 ASSERT(blobInfo.isEmpty()); 190 ASSERT(blobInfo.isEmpty());
191 191
192 const IDBKeyPath& keyPath = m_metadata.keyPath; 192 const IDBKeyPath& keyPath = m_metadata.keyPath;
193 const bool usesInLineKeys = !keyPath.isNull(); 193 const bool usesInLineKeys = !keyPath.isNull();
194 const bool hasKeyGenerator = autoIncrement(); 194 const bool hasKeyGenerator = autoIncrement();
195 195
196 if (putMode != WebIDBDatabase::CursorUpdate && usesInLineKeys && key) { 196 if (putMode != WebIDBDatabase::CursorUpdate && usesInLineKeys && key) {
197 exceptionState.throwDOMException(DataError, "The object store uses in-li ne keys and the key parameter was provided."); 197 exceptionState.throwDOMException(DataError, "The object store uses in-li ne keys and the key parameter was provided.");
198 return 0; 198 return 0;
199 } 199 }
200 if (!usesInLineKeys && !hasKeyGenerator && !key) { 200 if (!usesInLineKeys && !hasKeyGenerator && !key) {
201 exceptionState.throwDOMException(DataError, "The object store uses out-o f-line keys and has no key generator and the key parameter was not provided."); 201 exceptionState.throwDOMException(DataError, "The object store uses out-o f-line keys and has no key generator and the key parameter was not provided.");
202 return 0; 202 return 0;
203 } 203 }
204 if (usesInLineKeys) { 204 if (usesInLineKeys) {
205 IDBKey* keyPathKey = createIDBKeyFromScriptValueAndKeyPath(toIsolate(exe cutionContext), value, keyPath); 205 IDBKey* keyPathKey = createIDBKeyFromScriptValueAndKeyPath(scriptState-> isolate(), value, keyPath);
206 if (keyPathKey && !keyPathKey->isValid()) { 206 if (keyPathKey && !keyPathKey->isValid()) {
207 exceptionState.throwDOMException(DataError, "Evaluating the object s tore's key path yielded a value that is not a valid key."); 207 exceptionState.throwDOMException(DataError, "Evaluating the object s tore's key path yielded a value that is not a valid key.");
208 return 0; 208 return 0;
209 } 209 }
210 if (!hasKeyGenerator && !keyPathKey) { 210 if (!hasKeyGenerator && !keyPathKey) {
211 exceptionState.throwDOMException(DataError, "Evaluating the object s tore's key path did not yield a value."); 211 exceptionState.throwDOMException(DataError, "Evaluating the object s tore's key path did not yield a value.");
212 return 0; 212 return 0;
213 } 213 }
214 if (hasKeyGenerator && !keyPathKey) { 214 if (hasKeyGenerator && !keyPathKey) {
215 if (!canInjectIDBKeyIntoScriptValue(toIsolate(executionContext), val ue, keyPath)) { 215 if (!canInjectIDBKeyIntoScriptValue(scriptState->isolate(), value, k eyPath)) {
216 exceptionState.throwDOMException(DataError, "A generated key cou ld not be inserted into the value."); 216 exceptionState.throwDOMException(DataError, "A generated key cou ld not be inserted into the value.");
217 return 0; 217 return 0;
218 } 218 }
219 } 219 }
220 if (keyPathKey) 220 if (keyPathKey)
221 key = keyPathKey; 221 key = keyPathKey;
222 } 222 }
223 if (key && !key->isValid()) { 223 if (key && !key->isValid()) {
224 exceptionState.throwDOMException(DataError, IDBDatabase::notValidKeyErro rMessage); 224 exceptionState.throwDOMException(DataError, IDBDatabase::notValidKeyErro rMessage);
225 return 0; 225 return 0;
226 } 226 }
227 227
228 if (!backendDB()) { 228 if (!backendDB()) {
229 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databas eClosedErrorMessage); 229 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databas eClosedErrorMessage);
230 return 0; 230 return 0;
231 } 231 }
232 232
233 Vector<int64_t> indexIds; 233 Vector<int64_t> indexIds;
234 HeapVector<IndexKeys> indexKeys; 234 HeapVector<IndexKeys> indexKeys;
235 for (IDBObjectStoreMetadata::IndexMap::const_iterator it = m_metadata.indexe s.begin(); it != m_metadata.indexes.end(); ++it) { 235 for (IDBObjectStoreMetadata::IndexMap::const_iterator it = m_metadata.indexe s.begin(); it != m_metadata.indexes.end(); ++it) {
236 IndexKeys keys; 236 IndexKeys keys;
237 generateIndexKeysForValue(toIsolate(executionContext), it->value, value, &keys); 237 generateIndexKeysForValue(scriptState->isolate(), it->value, value, &key s);
238 indexIds.append(it->key); 238 indexIds.append(it->key);
239 indexKeys.append(keys); 239 indexKeys.append(keys);
240 } 240 }
241 241
242 IDBRequest* request = IDBRequest::create(executionContext, source, m_transac tion.get()); 242 IDBRequest* request = IDBRequest::create(scriptState, source, m_transaction. get());
243 Vector<char> wireBytes; 243 Vector<char> wireBytes;
244 serializedValue->toWireBytes(wireBytes); 244 serializedValue->toWireBytes(wireBytes);
245 RefPtr<SharedBuffer> valueBuffer = SharedBuffer::adoptVector(wireBytes); 245 RefPtr<SharedBuffer> valueBuffer = SharedBuffer::adoptVector(wireBytes);
246 246
247 backendDB()->put(m_transaction->id(), id(), blink::WebData(valueBuffer), blo bInfo, key, static_cast<WebIDBDatabase::PutMode>(putMode), WebIDBCallbacksImpl:: create(request).leakPtr(), indexIds, indexKeys); 247 backendDB()->put(m_transaction->id(), id(), blink::WebData(valueBuffer), blo bInfo, key, static_cast<WebIDBDatabase::PutMode>(putMode), WebIDBCallbacksImpl:: create(request).leakPtr(), indexIds, indexKeys);
248 return request; 248 return request;
249 } 249 }
250 250
251 IDBRequest* IDBObjectStore::deleteFunction(ExecutionContext* context, const Scri ptValue& key, ExceptionState& exceptionState) 251 IDBRequest* IDBObjectStore::deleteFunction(ScriptState* scriptState, const Scrip tValue& key, ExceptionState& exceptionState)
252 { 252 {
253 IDB_TRACE("IDBObjectStore::delete"); 253 IDB_TRACE("IDBObjectStore::delete");
254 if (isDeleted()) { 254 if (isDeleted()) {
255 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS toreDeletedErrorMessage); 255 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS toreDeletedErrorMessage);
256 return 0; 256 return 0;
257 } 257 }
258 if (m_transaction->isFinished() || m_transaction->isFinishing()) { 258 if (m_transaction->isFinished() || m_transaction->isFinishing()) {
259 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionFinishedErrorMessage); 259 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionFinishedErrorMessage);
260 return 0; 260 return 0;
261 } 261 }
262 if (!m_transaction->isActive()) { 262 if (!m_transaction->isActive()) {
263 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionInactiveErrorMessage); 263 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionInactiveErrorMessage);
264 return 0; 264 return 0;
265 } 265 }
266 if (m_transaction->isReadOnly()) { 266 if (m_transaction->isReadOnly()) {
267 exceptionState.throwDOMException(ReadOnlyError, IDBDatabase::transaction ReadOnlyErrorMessage); 267 exceptionState.throwDOMException(ReadOnlyError, IDBDatabase::transaction ReadOnlyErrorMessage);
268 return 0; 268 return 0;
269 } 269 }
270 270
271 IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(context, key, exception State); 271 IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->executionC ontext(), key, exceptionState);
272 if (exceptionState.hadException()) 272 if (exceptionState.hadException())
273 return 0; 273 return 0;
274 if (!keyRange) { 274 if (!keyRange) {
275 exceptionState.throwDOMException(DataError, IDBDatabase::noKeyOrKeyRange ErrorMessage); 275 exceptionState.throwDOMException(DataError, IDBDatabase::noKeyOrKeyRange ErrorMessage);
276 return 0; 276 return 0;
277 } 277 }
278 if (!backendDB()) { 278 if (!backendDB()) {
279 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databas eClosedErrorMessage); 279 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databas eClosedErrorMessage);
280 return 0; 280 return 0;
281 } 281 }
282 282
283 IDBRequest* request = IDBRequest::create(context, IDBAny::create(this), m_tr ansaction.get()); 283 IDBRequest* request = IDBRequest::create(scriptState, IDBAny::create(this), m_transaction.get());
284 backendDB()->deleteRange(m_transaction->id(), id(), keyRange, WebIDBCallback sImpl::create(request).leakPtr()); 284 backendDB()->deleteRange(m_transaction->id(), id(), keyRange, WebIDBCallback sImpl::create(request).leakPtr());
285 return request; 285 return request;
286 } 286 }
287 287
288 IDBRequest* IDBObjectStore::clear(ExecutionContext* context, ExceptionState& exc eptionState) 288 IDBRequest* IDBObjectStore::clear(ScriptState* scriptState, ExceptionState& exce ptionState)
289 { 289 {
290 IDB_TRACE("IDBObjectStore::clear"); 290 IDB_TRACE("IDBObjectStore::clear");
291 if (isDeleted()) { 291 if (isDeleted()) {
292 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS toreDeletedErrorMessage); 292 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS toreDeletedErrorMessage);
293 return 0; 293 return 0;
294 } 294 }
295 if (m_transaction->isFinished() || m_transaction->isFinishing()) { 295 if (m_transaction->isFinished() || m_transaction->isFinishing()) {
296 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionFinishedErrorMessage); 296 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionFinishedErrorMessage);
297 return 0; 297 return 0;
298 } 298 }
299 if (!m_transaction->isActive()) { 299 if (!m_transaction->isActive()) {
300 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionInactiveErrorMessage); 300 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionInactiveErrorMessage);
301 return 0; 301 return 0;
302 } 302 }
303 if (m_transaction->isReadOnly()) { 303 if (m_transaction->isReadOnly()) {
304 exceptionState.throwDOMException(ReadOnlyError, IDBDatabase::transaction ReadOnlyErrorMessage); 304 exceptionState.throwDOMException(ReadOnlyError, IDBDatabase::transaction ReadOnlyErrorMessage);
305 return 0; 305 return 0;
306 } 306 }
307 if (!backendDB()) { 307 if (!backendDB()) {
308 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databas eClosedErrorMessage); 308 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databas eClosedErrorMessage);
309 return 0; 309 return 0;
310 } 310 }
311 311
312 IDBRequest* request = IDBRequest::create(context, IDBAny::create(this), m_tr ansaction.get()); 312 IDBRequest* request = IDBRequest::create(scriptState, IDBAny::create(this), m_transaction.get());
313 backendDB()->clear(m_transaction->id(), id(), WebIDBCallbacksImpl::create(re quest).leakPtr()); 313 backendDB()->clear(m_transaction->id(), id(), WebIDBCallbacksImpl::create(re quest).leakPtr());
314 return request; 314 return request;
315 } 315 }
316 316
317 namespace { 317 namespace {
318 // This class creates the index keys for a given index by extracting 318 // This class creates the index keys for a given index by extracting
319 // them from the SerializedScriptValue, for all the existing values in 319 // them from the SerializedScriptValue, for all the existing values in
320 // the objectStore. It only needs to be kept alive by virtue of being 320 // the objectStore. It only needs to be kept alive by virtue of being
321 // a listener on an IDBRequest object, in the same way that JavaScript 321 // a listener on an IDBRequest object, in the same way that JavaScript
322 // cursor success handlers are kept alive. 322 // cursor success handlers are kept alive.
(...skipping 13 matching lines...) Expand all
336 IndexPopulator(ScriptState* scriptState, IDBDatabase* database, int64_t tran sactionId, int64_t objectStoreId, const IDBIndexMetadata& indexMetadata) 336 IndexPopulator(ScriptState* scriptState, IDBDatabase* database, int64_t tran sactionId, int64_t objectStoreId, const IDBIndexMetadata& indexMetadata)
337 : EventListener(CPPEventListenerType) 337 : EventListener(CPPEventListenerType)
338 , m_scriptState(scriptState) 338 , m_scriptState(scriptState)
339 , m_database(database) 339 , m_database(database)
340 , m_transactionId(transactionId) 340 , m_transactionId(transactionId)
341 , m_objectStoreId(objectStoreId) 341 , m_objectStoreId(objectStoreId)
342 , m_indexMetadata(indexMetadata) 342 , m_indexMetadata(indexMetadata)
343 { 343 {
344 } 344 }
345 345
346 virtual void handleEvent(ExecutionContext* context, Event* event) OVERRIDE 346 virtual void handleEvent(ExecutionContext* executionContext, Event* event) O VERRIDE
347 { 347 {
348 ASSERT(m_scriptState->executionContext() == executionContext);
348 ASSERT(event->type() == EventTypeNames::success); 349 ASSERT(event->type() == EventTypeNames::success);
349 EventTarget* target = event->target(); 350 EventTarget* target = event->target();
350 IDBRequest* request = static_cast<IDBRequest*>(target); 351 IDBRequest* request = static_cast<IDBRequest*>(target);
351 352
352 if (!m_database->backend()) // If database is stopped? 353 if (!m_database->backend()) // If database is stopped?
353 return; 354 return;
354 355
355 IDBAny* cursorAny = request->resultAsAny(); 356 IDBAny* cursorAny = request->resultAsAny();
356 IDBCursorWithValue* cursor = 0; 357 IDBCursorWithValue* cursor = 0;
357 if (cursorAny->type() == IDBAny::IDBCursorWithValueType) 358 if (cursorAny->type() == IDBAny::IDBCursorWithValueType)
358 cursor = cursorAny->idbCursorWithValue(); 359 cursor = cursorAny->idbCursorWithValue();
359 360
360 Vector<int64_t> indexIds; 361 Vector<int64_t> indexIds;
361 indexIds.append(m_indexMetadata.id); 362 indexIds.append(m_indexMetadata.id);
362 if (cursor && !cursor->isDeleted()) { 363 if (cursor && !cursor->isDeleted()) {
363 cursor->continueFunction(static_cast<IDBKey*>(0), static_cast<IDBKey *>(0), ASSERT_NO_EXCEPTION); 364 cursor->continueFunction(static_cast<IDBKey*>(0), static_cast<IDBKey *>(0), ASSERT_NO_EXCEPTION);
364 365
365 IDBKey* primaryKey = cursor->idbPrimaryKey(); 366 IDBKey* primaryKey = cursor->idbPrimaryKey();
366 ScriptValue value = cursor->value(m_scriptState.get()); 367 ScriptValue value = cursor->value(m_scriptState.get());
367 368
368 IDBObjectStore::IndexKeys indexKeys; 369 IDBObjectStore::IndexKeys indexKeys;
369 generateIndexKeysForValue(toIsolate(context), m_indexMetadata, value , &indexKeys); 370 generateIndexKeysForValue(m_scriptState->isolate(), m_indexMetadata, value, &indexKeys);
370 371
371 HeapVector<IDBObjectStore::IndexKeys> indexKeysList; 372 HeapVector<IDBObjectStore::IndexKeys> indexKeysList;
372 indexKeysList.append(indexKeys); 373 indexKeysList.append(indexKeys);
373 374
374 m_database->backend()->setIndexKeys(m_transactionId, m_objectStoreId , primaryKey, indexIds, indexKeysList); 375 m_database->backend()->setIndexKeys(m_transactionId, m_objectStoreId , primaryKey, indexIds, indexKeysList);
375 } else { 376 } else {
376 // Now that we are done indexing, tell the backend to go 377 // Now that we are done indexing, tell the backend to go
377 // back to processing tasks of type NormalTask. 378 // back to processing tasks of type NormalTask.
378 m_database->backend()->setIndexesReady(m_transactionId, m_objectStor eId, indexIds); 379 m_database->backend()->setIndexesReady(m_transactionId, m_objectStor eId, indexIds);
379 m_database.clear(); 380 m_database.clear();
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 IDBIndexMetadata metadata(name, indexId, keyPath, unique, multiEntry); 450 IDBIndexMetadata metadata(name, indexId, keyPath, unique, multiEntry);
450 IDBIndex* index = IDBIndex::create(metadata, this, m_transaction.get()); 451 IDBIndex* index = IDBIndex::create(metadata, this, m_transaction.get());
451 m_indexMap.set(name, index); 452 m_indexMap.set(name, index);
452 m_metadata.indexes.set(indexId, metadata); 453 m_metadata.indexes.set(indexId, metadata);
453 m_transaction->db()->indexCreated(id(), metadata); 454 m_transaction->db()->indexCreated(id(), metadata);
454 455
455 ASSERT(!exceptionState.hadException()); 456 ASSERT(!exceptionState.hadException());
456 if (exceptionState.hadException()) 457 if (exceptionState.hadException())
457 return 0; 458 return 0;
458 459
459 IDBRequest* indexRequest = openCursor(scriptState->executionContext(), stati c_cast<IDBKeyRange*>(0), blink::WebIDBCursor::Next, WebIDBDatabase::PreemptiveTa sk); 460 IDBRequest* indexRequest = openCursor(scriptState, static_cast<IDBKeyRange*> (0), blink::WebIDBCursor::Next, WebIDBDatabase::PreemptiveTask);
460 indexRequest->preventPropagation(); 461 indexRequest->preventPropagation();
461 462
462 // This is kept alive by being the success handler of the request, which is in turn kept alive by the owning transaction. 463 // This is kept alive by being the success handler of the request, which is in turn kept alive by the owning transaction.
463 RefPtr<IndexPopulator> indexPopulator = IndexPopulator::create(scriptState, transaction()->db(), m_transaction->id(), id(), metadata); 464 RefPtr<IndexPopulator> indexPopulator = IndexPopulator::create(scriptState, transaction()->db(), m_transaction->id(), id(), metadata);
464 indexRequest->setOnsuccess(indexPopulator); 465 indexRequest->setOnsuccess(indexPopulator);
465 return index; 466 return index;
466 } 467 }
467 468
468 IDBIndex* IDBObjectStore::index(const String& name, ExceptionState& exceptionSta te) 469 IDBIndex* IDBObjectStore::index(const String& name, ExceptionState& exceptionSta te)
469 { 470 {
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 536
536 m_metadata.indexes.remove(indexId); 537 m_metadata.indexes.remove(indexId);
537 m_transaction->db()->indexDeleted(id(), indexId); 538 m_transaction->db()->indexDeleted(id(), indexId);
538 IDBIndexMap::iterator it = m_indexMap.find(name); 539 IDBIndexMap::iterator it = m_indexMap.find(name);
539 if (it != m_indexMap.end()) { 540 if (it != m_indexMap.end()) {
540 it->value->markDeleted(); 541 it->value->markDeleted();
541 m_indexMap.remove(name); 542 m_indexMap.remove(name);
542 } 543 }
543 } 544 }
544 545
545 IDBRequest* IDBObjectStore::openCursor(ExecutionContext* context, const ScriptVa lue& range, const String& directionString, ExceptionState& exceptionState) 546 IDBRequest* IDBObjectStore::openCursor(ScriptState* scriptState, const ScriptVal ue& range, const String& directionString, ExceptionState& exceptionState)
546 { 547 {
547 IDB_TRACE("IDBObjectStore::openCursor"); 548 IDB_TRACE("IDBObjectStore::openCursor");
548 if (isDeleted()) { 549 if (isDeleted()) {
549 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS toreDeletedErrorMessage); 550 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS toreDeletedErrorMessage);
550 return 0; 551 return 0;
551 } 552 }
552 if (m_transaction->isFinished() || m_transaction->isFinishing()) { 553 if (m_transaction->isFinished() || m_transaction->isFinishing()) {
553 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionFinishedErrorMessage); 554 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionFinishedErrorMessage);
554 return 0; 555 return 0;
555 } 556 }
556 if (!m_transaction->isActive()) { 557 if (!m_transaction->isActive()) {
557 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionInactiveErrorMessage); 558 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionInactiveErrorMessage);
558 return 0; 559 return 0;
559 } 560 }
560 561
561 WebIDBCursor::Direction direction = IDBCursor::stringToDirection(directionSt ring, exceptionState); 562 WebIDBCursor::Direction direction = IDBCursor::stringToDirection(directionSt ring, exceptionState);
562 if (exceptionState.hadException()) 563 if (exceptionState.hadException())
563 return 0; 564 return 0;
564 565
565 IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(context, range, excepti onState); 566 IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->executionC ontext(), range, exceptionState);
566 if (exceptionState.hadException()) 567 if (exceptionState.hadException())
567 return 0; 568 return 0;
568 569
569 if (!backendDB()) { 570 if (!backendDB()) {
570 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databas eClosedErrorMessage); 571 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databas eClosedErrorMessage);
571 return 0; 572 return 0;
572 } 573 }
573 574
574 return openCursor(context, keyRange, direction, WebIDBDatabase::NormalTask); 575 return openCursor(scriptState, keyRange, direction, WebIDBDatabase::NormalTa sk);
575 } 576 }
576 577
577 IDBRequest* IDBObjectStore::openCursor(ExecutionContext* context, IDBKeyRange* r ange, WebIDBCursor::Direction direction, WebIDBDatabase::TaskType taskType) 578 IDBRequest* IDBObjectStore::openCursor(ScriptState* scriptState, IDBKeyRange* ra nge, WebIDBCursor::Direction direction, WebIDBDatabase::TaskType taskType)
578 { 579 {
579 IDBRequest* request = IDBRequest::create(context, IDBAny::create(this), m_tr ansaction.get()); 580 IDBRequest* request = IDBRequest::create(scriptState, IDBAny::create(this), m_transaction.get());
580 request->setCursorDetails(IndexedDB::CursorKeyAndValue, direction); 581 request->setCursorDetails(IndexedDB::CursorKeyAndValue, direction);
581 582
582 backendDB()->openCursor(m_transaction->id(), id(), IDBIndexMetadata::Invalid Id, range, direction, false, taskType, WebIDBCallbacksImpl::create(request).leak Ptr()); 583 backendDB()->openCursor(m_transaction->id(), id(), IDBIndexMetadata::Invalid Id, range, direction, false, taskType, WebIDBCallbacksImpl::create(request).leak Ptr());
583 return request; 584 return request;
584 } 585 }
585 586
586 IDBRequest* IDBObjectStore::openKeyCursor(ExecutionContext* context, const Scrip tValue& range, const String& directionString, ExceptionState& exceptionState) 587 IDBRequest* IDBObjectStore::openKeyCursor(ScriptState* scriptState, const Script Value& range, const String& directionString, ExceptionState& exceptionState)
587 { 588 {
588 IDB_TRACE("IDBObjectStore::openKeyCursor"); 589 IDB_TRACE("IDBObjectStore::openKeyCursor");
589 if (isDeleted()) { 590 if (isDeleted()) {
590 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS toreDeletedErrorMessage); 591 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS toreDeletedErrorMessage);
591 return 0; 592 return 0;
592 } 593 }
593 if (m_transaction->isFinished() || m_transaction->isFinishing()) { 594 if (m_transaction->isFinished() || m_transaction->isFinishing()) {
594 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionFinishedErrorMessage); 595 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionFinishedErrorMessage);
595 return 0; 596 return 0;
596 } 597 }
597 if (!m_transaction->isActive()) { 598 if (!m_transaction->isActive()) {
598 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionInactiveErrorMessage); 599 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionInactiveErrorMessage);
599 return 0; 600 return 0;
600 } 601 }
601 602
602 WebIDBCursor::Direction direction = IDBCursor::stringToDirection(directionSt ring, exceptionState); 603 WebIDBCursor::Direction direction = IDBCursor::stringToDirection(directionSt ring, exceptionState);
603 if (exceptionState.hadException()) 604 if (exceptionState.hadException())
604 return 0; 605 return 0;
605 606
606 IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(context, range, excepti onState); 607 IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->executionC ontext(), range, exceptionState);
607 if (exceptionState.hadException()) 608 if (exceptionState.hadException())
608 return 0; 609 return 0;
609 610
610 if (!backendDB()) { 611 if (!backendDB()) {
611 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databas eClosedErrorMessage); 612 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databas eClosedErrorMessage);
612 return 0; 613 return 0;
613 } 614 }
614 615
615 IDBRequest* request = IDBRequest::create(context, IDBAny::create(this), m_tr ansaction.get()); 616 IDBRequest* request = IDBRequest::create(scriptState, IDBAny::create(this), m_transaction.get());
616 request->setCursorDetails(IndexedDB::CursorKeyOnly, direction); 617 request->setCursorDetails(IndexedDB::CursorKeyOnly, direction);
617 618
618 backendDB()->openCursor(m_transaction->id(), id(), IDBIndexMetadata::Invalid Id, keyRange, direction, true, WebIDBDatabase::NormalTask, WebIDBCallbacksImpl:: create(request).leakPtr()); 619 backendDB()->openCursor(m_transaction->id(), id(), IDBIndexMetadata::Invalid Id, keyRange, direction, true, WebIDBDatabase::NormalTask, WebIDBCallbacksImpl:: create(request).leakPtr());
619 return request; 620 return request;
620 } 621 }
621 622
622 IDBRequest* IDBObjectStore::count(ExecutionContext* context, const ScriptValue& range, ExceptionState& exceptionState) 623 IDBRequest* IDBObjectStore::count(ScriptState* scriptState, const ScriptValue& r ange, ExceptionState& exceptionState)
623 { 624 {
624 IDB_TRACE("IDBObjectStore::count"); 625 IDB_TRACE("IDBObjectStore::count");
625 if (isDeleted()) { 626 if (isDeleted()) {
626 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS toreDeletedErrorMessage); 627 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS toreDeletedErrorMessage);
627 return 0; 628 return 0;
628 } 629 }
629 if (m_transaction->isFinished() || m_transaction->isFinishing()) { 630 if (m_transaction->isFinished() || m_transaction->isFinishing()) {
630 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionFinishedErrorMessage); 631 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionFinishedErrorMessage);
631 return 0; 632 return 0;
632 } 633 }
633 if (!m_transaction->isActive()) { 634 if (!m_transaction->isActive()) {
634 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionInactiveErrorMessage); 635 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionInactiveErrorMessage);
635 return 0; 636 return 0;
636 } 637 }
637 638
638 IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(context, range, excepti onState); 639 IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->executionC ontext(), range, exceptionState);
639 if (exceptionState.hadException()) 640 if (exceptionState.hadException())
640 return 0; 641 return 0;
641 642
642 if (!backendDB()) { 643 if (!backendDB()) {
643 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databas eClosedErrorMessage); 644 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databas eClosedErrorMessage);
644 return 0; 645 return 0;
645 } 646 }
646 647
647 IDBRequest* request = IDBRequest::create(context, IDBAny::create(this), m_tr ansaction.get()); 648 IDBRequest* request = IDBRequest::create(scriptState, IDBAny::create(this), m_transaction.get());
648 backendDB()->count(m_transaction->id(), id(), IDBIndexMetadata::InvalidId, k eyRange, WebIDBCallbacksImpl::create(request).leakPtr()); 649 backendDB()->count(m_transaction->id(), id(), IDBIndexMetadata::InvalidId, k eyRange, WebIDBCallbacksImpl::create(request).leakPtr());
649 return request; 650 return request;
650 } 651 }
651 652
652 void IDBObjectStore::transactionFinished() 653 void IDBObjectStore::transactionFinished()
653 { 654 {
654 ASSERT(m_transaction->isFinished()); 655 ASSERT(m_transaction->isFinished());
655 656
656 // Break reference cycles. 657 // Break reference cycles.
657 m_indexMap.clear(); 658 m_indexMap.clear();
658 } 659 }
659 660
660 int64_t IDBObjectStore::findIndexId(const String& name) const 661 int64_t IDBObjectStore::findIndexId(const String& name) const
661 { 662 {
662 for (IDBObjectStoreMetadata::IndexMap::const_iterator it = m_metadata.indexe s.begin(); it != m_metadata.indexes.end(); ++it) { 663 for (IDBObjectStoreMetadata::IndexMap::const_iterator it = m_metadata.indexe s.begin(); it != m_metadata.indexes.end(); ++it) {
663 if (it->value.name == name) { 664 if (it->value.name == name) {
664 ASSERT(it->key != IDBIndexMetadata::InvalidId); 665 ASSERT(it->key != IDBIndexMetadata::InvalidId);
665 return it->key; 666 return it->key;
666 } 667 }
667 } 668 }
668 return IDBIndexMetadata::InvalidId; 669 return IDBIndexMetadata::InvalidId;
669 } 670 }
670 671
671 WebIDBDatabase* IDBObjectStore::backendDB() const 672 WebIDBDatabase* IDBObjectStore::backendDB() const
672 { 673 {
673 return m_transaction->backendDB(); 674 return m_transaction->backendDB();
674 } 675 }
675 676
676 } // namespace WebCore 677 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/modules/indexeddb/IDBObjectStore.h ('k') | Source/modules/indexeddb/IDBObjectStore.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698