| 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 |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 { | 207 { |
| 208 if (!m_result) | 208 if (!m_result) |
| 209 return 0; | 209 return 0; |
| 210 if (m_result->type() == IDBAny::IDBCursorType) | 210 if (m_result->type() == IDBAny::IDBCursorType) |
| 211 return m_result->idbCursor(); | 211 return m_result->idbCursor(); |
| 212 if (m_result->type() == IDBAny::IDBCursorWithValueType) | 212 if (m_result->type() == IDBAny::IDBCursorWithValueType) |
| 213 return m_result->idbCursorWithValue(); | 213 return m_result->idbCursorWithValue(); |
| 214 return 0; | 214 return 0; |
| 215 } | 215 } |
| 216 | 216 |
| 217 void IDBRequest::setResultCursor(PassRefPtr<IDBCursor> cursor, PassRefPtr<IDBKey
> key, PassRefPtr<IDBKey> primaryKey, const ScriptValue& value) | 217 void IDBRequest::setResultCursor(PassRefPtr<IDBCursor> cursor, PassRefPtr<IDBKey
> key, PassRefPtr<IDBKey> primaryKey, PassRefPtr<SerializedScriptValue> value) |
| 218 { | 218 { |
| 219 ASSERT(m_readyState == PENDING); | 219 ASSERT(m_readyState == PENDING); |
| 220 m_cursorKey = key; | 220 m_cursorKey = key; |
| 221 m_cursorPrimaryKey = primaryKey; | 221 m_cursorPrimaryKey = primaryKey; |
| 222 m_cursorValue = value; | 222 m_cursorValue = value; |
| 223 | 223 |
| 224 if (m_cursorType == IDBCursorBackendInterface::IndexKeyCursor) { | 224 if (m_cursorType == IDBCursorBackendInterface::IndexKeyCursor) { |
| 225 m_result = IDBAny::create(cursor); | 225 m_result = IDBAny::create(cursor); |
| 226 return; | 226 return; |
| 227 } | 227 } |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 void IDBRequest::onSuccess(PassRefPtr<DOMStringList> domStringList) | 269 void IDBRequest::onSuccess(PassRefPtr<DOMStringList> domStringList) |
| 270 { | 270 { |
| 271 IDB_TRACE("IDBRequest::onSuccess(DOMStringList)"); | 271 IDB_TRACE("IDBRequest::onSuccess(DOMStringList)"); |
| 272 if (!shouldEnqueueEvent()) | 272 if (!shouldEnqueueEvent()) |
| 273 return; | 273 return; |
| 274 | 274 |
| 275 m_result = IDBAny::create(domStringList); | 275 m_result = IDBAny::create(domStringList); |
| 276 enqueueEvent(createSuccessEvent()); | 276 enqueueEvent(createSuccessEvent()); |
| 277 } | 277 } |
| 278 | 278 |
| 279 void IDBRequest::onSuccess(PassRefPtr<IDBCursorBackendInterface> backend, PassRe
fPtr<IDBKey> key, PassRefPtr<IDBKey> primaryKey, PassRefPtr<SerializedScriptValu
e> serializedValue) | 279 void IDBRequest::onSuccess(PassRefPtr<IDBCursorBackendInterface> backend, PassRe
fPtr<IDBKey> key, PassRefPtr<IDBKey> primaryKey, PassRefPtr<SerializedScriptValu
e> value) |
| 280 { | 280 { |
| 281 IDB_TRACE("IDBRequest::onSuccess(IDBCursor)"); | 281 IDB_TRACE("IDBRequest::onSuccess(IDBCursor)"); |
| 282 if (!shouldEnqueueEvent()) | 282 if (!shouldEnqueueEvent()) |
| 283 return; | 283 return; |
| 284 | 284 |
| 285 ScriptValue value = deserializeIDBValue(scriptExecutionContext(), serialized
Value); | |
| 286 ASSERT(m_cursorType != IDBCursorBackendInterface::InvalidCursorType); | 285 ASSERT(m_cursorType != IDBCursorBackendInterface::InvalidCursorType); |
| 287 RefPtr<IDBCursor> cursor; | 286 RefPtr<IDBCursor> cursor; |
| 288 if (m_cursorType == IDBCursorBackendInterface::IndexKeyCursor) | 287 if (m_cursorType == IDBCursorBackendInterface::IndexKeyCursor) |
| 289 cursor = IDBCursor::create(backend, m_cursorDirection, this, m_source.ge
t(), m_transaction.get()); | 288 cursor = IDBCursor::create(backend, m_cursorDirection, this, m_source.ge
t(), m_transaction.get()); |
| 290 else | 289 else |
| 291 cursor = IDBCursorWithValue::create(backend, m_cursorDirection, this, m_
source.get(), m_transaction.get()); | 290 cursor = IDBCursorWithValue::create(backend, m_cursorDirection, this, m_
source.get(), m_transaction.get()); |
| 292 setResultCursor(cursor, key, primaryKey, value); | 291 setResultCursor(cursor, key, primaryKey, value); |
| 293 | 292 |
| 294 enqueueEvent(createSuccessEvent()); | 293 enqueueEvent(createSuccessEvent()); |
| 295 } | 294 } |
| 296 | 295 |
| 297 void IDBRequest::onSuccess(PassRefPtr<IDBKey> idbKey) | 296 void IDBRequest::onSuccess(PassRefPtr<IDBKey> idbKey) |
| 298 { | 297 { |
| 299 IDB_TRACE("IDBRequest::onSuccess(IDBKey)"); | 298 IDB_TRACE("IDBRequest::onSuccess(IDBKey)"); |
| 300 if (!shouldEnqueueEvent()) | 299 if (!shouldEnqueueEvent()) |
| 301 return; | 300 return; |
| 302 | 301 |
| 303 if (idbKey && idbKey->isValid()) | 302 if (idbKey && idbKey->isValid()) |
| 304 m_result = IDBAny::create(idbKey); | 303 m_result = IDBAny::create(idbKey); |
| 305 else | 304 else |
| 306 m_result = IDBAny::createInvalid(); | 305 m_result = IDBAny::create(SerializedScriptValue::undefinedValue()); |
| 307 enqueueEvent(createSuccessEvent()); | 306 enqueueEvent(createSuccessEvent()); |
| 308 } | 307 } |
| 309 | 308 |
| 310 void IDBRequest::onSuccess(PassRefPtr<IDBTransactionBackendInterface> prpBackend
) | 309 void IDBRequest::onSuccess(PassRefPtr<IDBTransactionBackendInterface> prpBackend
) |
| 311 { | 310 { |
| 312 IDB_TRACE("IDBRequest::onSuccess(IDBTransaction)"); | 311 IDB_TRACE("IDBRequest::onSuccess(IDBTransaction)"); |
| 313 RefPtr<IDBTransactionBackendInterface> backend = prpBackend; | 312 RefPtr<IDBTransactionBackendInterface> backend = prpBackend; |
| 314 | 313 |
| 315 if (m_contextStopped || !scriptExecutionContext()) { | 314 if (m_contextStopped || !scriptExecutionContext()) { |
| 316 // Should only be null in tests. | 315 // Should only be null in tests. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 331 m_result = IDBAny::create(frontend.release()); | 330 m_result = IDBAny::create(frontend.release()); |
| 332 enqueueEvent(createSuccessEvent()); | 331 enqueueEvent(createSuccessEvent()); |
| 333 } | 332 } |
| 334 | 333 |
| 335 void IDBRequest::onSuccess(PassRefPtr<SerializedScriptValue> serializedScriptVal
ue) | 334 void IDBRequest::onSuccess(PassRefPtr<SerializedScriptValue> serializedScriptVal
ue) |
| 336 { | 335 { |
| 337 IDB_TRACE("IDBRequest::onSuccess(SerializedScriptValue)"); | 336 IDB_TRACE("IDBRequest::onSuccess(SerializedScriptValue)"); |
| 338 if (!shouldEnqueueEvent()) | 337 if (!shouldEnqueueEvent()) |
| 339 return; | 338 return; |
| 340 | 339 |
| 341 ScriptValue value = deserializeIDBValue(scriptExecutionContext(), serialized
ScriptValue); | 340 m_result = IDBAny::create(serializedScriptValue); |
| 342 onSuccessInternal(value); | 341 m_pendingCursor.clear(); |
| 342 enqueueEvent(createSuccessEvent()); |
| 343 } | 343 } |
| 344 | 344 |
| 345 #ifndef NDEBUG | 345 #ifndef NDEBUG |
| 346 static PassRefPtr<IDBObjectStore> effectiveObjectStore(PassRefPtr<IDBAny> source
) | 346 static PassRefPtr<IDBObjectStore> effectiveObjectStore(PassRefPtr<IDBAny> source
) |
| 347 { | 347 { |
| 348 if (source->type() == IDBAny::IDBObjectStoreType) | 348 if (source->type() == IDBAny::IDBObjectStoreType) |
| 349 return source->idbObjectStore(); | 349 return source->idbObjectStore(); |
| 350 if (source->type() == IDBAny::IDBIndexType) | 350 if (source->type() == IDBAny::IDBIndexType) |
| 351 return source->idbIndex()->objectStore(); | 351 return source->idbIndex()->objectStore(); |
| 352 | 352 |
| 353 ASSERT_NOT_REACHED(); | 353 ASSERT_NOT_REACHED(); |
| 354 return 0; | 354 return 0; |
| 355 } | 355 } |
| 356 #endif | 356 #endif |
| 357 | 357 |
| 358 void IDBRequest::onSuccess(PassRefPtr<SerializedScriptValue> prpSerializedScript
Value, PassRefPtr<IDBKey> prpPrimaryKey, const IDBKeyPath& keyPath) | 358 void IDBRequest::onSuccess(PassRefPtr<SerializedScriptValue> prpSerializedScript
Value, PassRefPtr<IDBKey> prpPrimaryKey, const IDBKeyPath& keyPath) |
| 359 { | 359 { |
| 360 IDB_TRACE("IDBRequest::onSuccess(SerializedScriptValue, IDBKey, IDBKeyPath)"
); | 360 IDB_TRACE("IDBRequest::onSuccess(SerializedScriptValue, IDBKey, IDBKeyPath)"
); |
| 361 if (!shouldEnqueueEvent()) | 361 if (!shouldEnqueueEvent()) |
| 362 return; | 362 return; |
| 363 | 363 |
| 364 #ifndef NDEBUG | 364 #ifndef NDEBUG |
| 365 ASSERT(keyPath == effectiveObjectStore(m_source)->keyPath()); | 365 ASSERT(keyPath == effectiveObjectStore(m_source)->keyPath()); |
| 366 #endif | 366 #endif |
| 367 ScriptValue value = deserializeIDBValue(scriptExecutionContext(), prpSeriali
zedScriptValue); | 367 RefPtr<SerializedScriptValue> value = prpSerializedScriptValue; |
| 368 | 368 |
| 369 RefPtr<IDBKey> primaryKey = prpPrimaryKey; | 369 RefPtr<IDBKey> primaryKey = prpPrimaryKey; |
| 370 #ifndef NDEBUG | 370 #ifndef NDEBUG |
| 371 RefPtr<IDBKey> expectedKey = createIDBKeyFromScriptValueAndKeyPath(value, ke
yPath); | 371 RefPtr<IDBKey> expectedKey = createIDBKeyFromSerializedValueAndKeyPath(value
, keyPath); |
| 372 ASSERT(!expectedKey || expectedKey->isEqual(primaryKey.get())); | 372 ASSERT(!expectedKey || expectedKey->isEqual(primaryKey.get())); |
| 373 #endif | 373 #endif |
| 374 bool injected = injectIDBKeyIntoScriptValue(primaryKey, value, keyPath); | 374 RefPtr<SerializedScriptValue> valueAfterInjection = injectIDBKeyIntoSerializ
edValue(primaryKey, value, keyPath); |
| 375 ASSERT_UNUSED(injected, injected); | 375 ASSERT(valueAfterInjection); |
| 376 onSuccessInternal(value); | 376 if (!valueAfterInjection) { |
| 377 // Checks in put() ensure this should only happen if I/O error occurs. |
| 378 onError(IDBDatabaseError::create(IDBDatabaseException::UNKNOWN_ERR, "Int
ernal error inserting generated key into the object.")); |
| 379 return; |
| 380 } |
| 381 value = valueAfterInjection; |
| 382 onSuccess(value.release()); |
| 377 } | 383 } |
| 378 | 384 |
| 379 void IDBRequest::onSuccessInternal(const ScriptValue& value) | 385 void IDBRequest::onSuccess(PassRefPtr<IDBKey> key, PassRefPtr<IDBKey> primaryKey
, PassRefPtr<SerializedScriptValue> value) |
| 380 { | |
| 381 m_result = IDBAny::create(value); | |
| 382 m_pendingCursor.clear(); | |
| 383 enqueueEvent(createSuccessEvent()); | |
| 384 } | |
| 385 | |
| 386 void IDBRequest::onSuccess(PassRefPtr<IDBKey> key, PassRefPtr<IDBKey> primaryKey
, PassRefPtr<SerializedScriptValue> serializedValue) | |
| 387 { | 386 { |
| 388 IDB_TRACE("IDBRequest::onSuccess(key, primaryKey, value)"); | 387 IDB_TRACE("IDBRequest::onSuccess(key, primaryKey, value)"); |
| 389 if (!shouldEnqueueEvent()) | 388 if (!shouldEnqueueEvent()) |
| 390 return; | 389 return; |
| 391 | 390 |
| 392 ScriptValue value = deserializeIDBValue(scriptExecutionContext(), serialized
Value); | |
| 393 ASSERT(m_pendingCursor); | 391 ASSERT(m_pendingCursor); |
| 394 setResultCursor(m_pendingCursor.release(), key, primaryKey, value); | 392 setResultCursor(m_pendingCursor.release(), key, primaryKey, value); |
| 395 enqueueEvent(createSuccessEvent()); | 393 enqueueEvent(createSuccessEvent()); |
| 396 } | 394 } |
| 397 | 395 |
| 398 bool IDBRequest::hasPendingActivity() const | 396 bool IDBRequest::hasPendingActivity() const |
| 399 { | 397 { |
| 400 // FIXME: In an ideal world, we should return true as long as anyone has a o
r can | 398 // FIXME: In an ideal world, we should return true as long as anyone has a o
r can |
| 401 // get a handle to us and we have event listeners. This is order to h
andle | 399 // get a handle to us and we have event listeners. This is order to h
andle |
| 402 // user generated events properly. | 400 // user generated events properly. |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 451 // this object to actually hold a reference to the database (to ensure | 449 // this object to actually hold a reference to the database (to ensure |
| 452 // it stays alive). | 450 // it stays alive). |
| 453 targets.append(m_transaction->db()); | 451 targets.append(m_transaction->db()); |
| 454 } | 452 } |
| 455 | 453 |
| 456 // Cursor properties should not updated until the success event is being dis
patched. | 454 // Cursor properties should not updated until the success event is being dis
patched. |
| 457 RefPtr<IDBCursor> cursorToNotify; | 455 RefPtr<IDBCursor> cursorToNotify; |
| 458 if (event->type() == eventNames().successEvent) { | 456 if (event->type() == eventNames().successEvent) { |
| 459 cursorToNotify = getResultCursor(); | 457 cursorToNotify = getResultCursor(); |
| 460 if (cursorToNotify) | 458 if (cursorToNotify) |
| 461 cursorToNotify->setValueReady(m_cursorKey.release(), m_cursorPrimary
Key.release(), m_cursorValue); | 459 cursorToNotify->setValueReady(m_cursorKey.release(), m_cursorPrimary
Key.release(), m_cursorValue.release()); |
| 462 } | 460 } |
| 463 | 461 |
| 464 if (event->type() == eventNames().upgradeneededEvent) { | 462 if (event->type() == eventNames().upgradeneededEvent) { |
| 465 ASSERT(!m_didFireUpgradeNeededEvent); | 463 ASSERT(!m_didFireUpgradeNeededEvent); |
| 466 m_didFireUpgradeNeededEvent = true; | 464 m_didFireUpgradeNeededEvent = true; |
| 467 } | 465 } |
| 468 | 466 |
| 469 // FIXME: When we allow custom event dispatching, this will probably need to
change. | 467 // FIXME: When we allow custom event dispatching, this will probably need to
change. |
| 470 ASSERT_WITH_MESSAGE(event->type() == eventNames().successEvent || event->typ
e() == eventNames().errorEvent || event->type() == eventNames().blockedEvent ||
event->type() == eventNames().upgradeneededEvent, "event type was %s", event->ty
pe().string().utf8().data()); | 468 ASSERT_WITH_MESSAGE(event->type() == eventNames().successEvent || event->typ
e() == eventNames().errorEvent || event->type() == eventNames().blockedEvent ||
event->type() == eventNames().upgradeneededEvent, "event type was %s", event->ty
pe().string().utf8().data()); |
| 471 const bool setTransactionActive = m_transaction && (event->type() == eventNa
mes().successEvent || event->type() == eventNames().upgradeneededEvent || (event
->type() == eventNames().errorEvent && m_errorCode != IDBDatabaseException::IDB_
ABORT_ERR)); | 469 const bool setTransactionActive = m_transaction && (event->type() == eventNa
mes().successEvent || event->type() == eventNames().upgradeneededEvent || (event
->type() == eventNames().errorEvent && m_errorCode != IDBDatabaseException::IDB_
ABORT_ERR)); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 541 } | 539 } |
| 542 | 540 |
| 543 EventTargetData* IDBRequest::ensureEventTargetData() | 541 EventTargetData* IDBRequest::ensureEventTargetData() |
| 544 { | 542 { |
| 545 return &m_eventTargetData; | 543 return &m_eventTargetData; |
| 546 } | 544 } |
| 547 | 545 |
| 548 } // namespace WebCore | 546 } // namespace WebCore |
| 549 | 547 |
| 550 #endif | 548 #endif |
| OLD | NEW |