| 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 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 DCHECK(m_transactions.isEmpty()); | 390 DCHECK(m_transactions.isEmpty()); |
| 391 | 391 |
| 392 if (m_backend) { | 392 if (m_backend) { |
| 393 m_backend->close(); | 393 m_backend->close(); |
| 394 m_backend.reset(); | 394 m_backend.reset(); |
| 395 } | 395 } |
| 396 | 396 |
| 397 if (m_databaseCallbacks) | 397 if (m_databaseCallbacks) |
| 398 m_databaseCallbacks->detachWebCallbacks(); | 398 m_databaseCallbacks->detachWebCallbacks(); |
| 399 | 399 |
| 400 if (m_contextStopped || !getExecutionContext()) | 400 if (!getExecutionContext()) |
| 401 return; | 401 return; |
| 402 | 402 |
| 403 EventQueue* eventQueue = getExecutionContext()->getEventQueue(); | 403 EventQueue* eventQueue = getExecutionContext()->getEventQueue(); |
| 404 // Remove any pending versionchange events scheduled to fire on this | 404 // Remove any pending versionchange events scheduled to fire on this |
| 405 // connection. They would have been scheduled by the backend when another | 405 // connection. They would have been scheduled by the backend when another |
| 406 // connection attempted an upgrade, but the frontend connection is being | 406 // connection attempted an upgrade, but the frontend connection is being |
| 407 // closed before they could fire. | 407 // closed before they could fire. |
| 408 for (size_t i = 0; i < m_enqueuedEvents.size(); ++i) { | 408 for (size_t i = 0; i < m_enqueuedEvents.size(); ++i) { |
| 409 bool removed = eventQueue->cancelEvent(m_enqueuedEvents[i].get()); | 409 bool removed = eventQueue->cancelEvent(m_enqueuedEvents[i].get()); |
| 410 DCHECK(removed); | 410 DCHECK(removed); |
| 411 } | 411 } |
| 412 } | 412 } |
| 413 | 413 |
| 414 void IDBDatabase::onVersionChange(int64_t oldVersion, int64_t newVersion) { | 414 void IDBDatabase::onVersionChange(int64_t oldVersion, int64_t newVersion) { |
| 415 IDB_TRACE("IDBDatabase::onVersionChange"); | 415 IDB_TRACE("IDBDatabase::onVersionChange"); |
| 416 if (m_contextStopped || !getExecutionContext()) | 416 if (!getExecutionContext()) |
| 417 return; | 417 return; |
| 418 | 418 |
| 419 if (m_closePending) { | 419 if (m_closePending) { |
| 420 // If we're pending, that means there's a busy transaction. We won't | 420 // If we're pending, that means there's a busy transaction. We won't |
| 421 // fire 'versionchange' but since we're not closing immediately the | 421 // fire 'versionchange' but since we're not closing immediately the |
| 422 // back-end should still send out 'blocked'. | 422 // back-end should still send out 'blocked'. |
| 423 m_backend->versionChangeIgnored(); | 423 m_backend->versionChangeIgnored(); |
| 424 return; | 424 return; |
| 425 } | 425 } |
| 426 | 426 |
| 427 Nullable<unsigned long long> newVersionNullable = | 427 Nullable<unsigned long long> newVersionNullable = |
| 428 (newVersion == IDBDatabaseMetadata::NoVersion) | 428 (newVersion == IDBDatabaseMetadata::NoVersion) |
| 429 ? Nullable<unsigned long long>() | 429 ? Nullable<unsigned long long>() |
| 430 : Nullable<unsigned long long>(newVersion); | 430 : Nullable<unsigned long long>(newVersion); |
| 431 enqueueEvent(IDBVersionChangeEvent::create(EventTypeNames::versionchange, | 431 enqueueEvent(IDBVersionChangeEvent::create(EventTypeNames::versionchange, |
| 432 oldVersion, newVersionNullable)); | 432 oldVersion, newVersionNullable)); |
| 433 } | 433 } |
| 434 | 434 |
| 435 void IDBDatabase::enqueueEvent(Event* event) { | 435 void IDBDatabase::enqueueEvent(Event* event) { |
| 436 DCHECK(!m_contextStopped); | |
| 437 DCHECK(getExecutionContext()); | 436 DCHECK(getExecutionContext()); |
| 438 EventQueue* eventQueue = getExecutionContext()->getEventQueue(); | 437 EventQueue* eventQueue = getExecutionContext()->getEventQueue(); |
| 439 event->setTarget(this); | 438 event->setTarget(this); |
| 440 eventQueue->enqueueEvent(event); | 439 eventQueue->enqueueEvent(event); |
| 441 m_enqueuedEvents.append(event); | 440 m_enqueuedEvents.append(event); |
| 442 } | 441 } |
| 443 | 442 |
| 444 DispatchEventResult IDBDatabase::dispatchEventInternal(Event* event) { | 443 DispatchEventResult IDBDatabase::dispatchEventInternal(Event* event) { |
| 445 IDB_TRACE("IDBDatabase::dispatchEvent"); | 444 IDB_TRACE("IDBDatabase::dispatchEvent"); |
| 446 if (m_contextStopped || !getExecutionContext()) | 445 if (!getExecutionContext()) |
| 447 return DispatchEventResult::CanceledBeforeDispatch; | 446 return DispatchEventResult::CanceledBeforeDispatch; |
| 448 DCHECK(event->type() == EventTypeNames::versionchange || | 447 DCHECK(event->type() == EventTypeNames::versionchange || |
| 449 event->type() == EventTypeNames::close); | 448 event->type() == EventTypeNames::close); |
| 450 for (size_t i = 0; i < m_enqueuedEvents.size(); ++i) { | 449 for (size_t i = 0; i < m_enqueuedEvents.size(); ++i) { |
| 451 if (m_enqueuedEvents[i].get() == event) | 450 if (m_enqueuedEvents[i].get() == event) |
| 452 m_enqueuedEvents.remove(i); | 451 m_enqueuedEvents.remove(i); |
| 453 } | 452 } |
| 454 | 453 |
| 455 DispatchEventResult dispatchResult = | 454 DispatchEventResult dispatchResult = |
| 456 EventTarget::dispatchEventInternal(event); | 455 EventTarget::dispatchEventInternal(event); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 509 << "Object store metadata reverted when versionchange transaction is " | 508 << "Object store metadata reverted when versionchange transaction is " |
| 510 "still active"; | 509 "still active"; |
| 511 DCHECK(oldMetadata.get()); | 510 DCHECK(oldMetadata.get()); |
| 512 m_metadata.objectStores.set(oldMetadata->id, std::move(oldMetadata)); | 511 m_metadata.objectStores.set(oldMetadata->id, std::move(oldMetadata)); |
| 513 } | 512 } |
| 514 | 513 |
| 515 bool IDBDatabase::hasPendingActivity() const { | 514 bool IDBDatabase::hasPendingActivity() const { |
| 516 // The script wrapper must not be collected before the object is closed or | 515 // The script wrapper must not be collected before the object is closed or |
| 517 // we can't fire a "versionchange" event to let script manually close the | 516 // we can't fire a "versionchange" event to let script manually close the |
| 518 // connection. | 517 // connection. |
| 519 return !m_closePending && hasEventListeners() && !m_contextStopped; | 518 return !m_closePending && hasEventListeners() && getExecutionContext(); |
| 520 } | 519 } |
| 521 | 520 |
| 522 void IDBDatabase::contextDestroyed() { | 521 void IDBDatabase::contextDestroyed() { |
| 523 m_contextStopped = true; | |
| 524 | |
| 525 // Immediately close the connection to the back end. Don't attempt a | 522 // Immediately close the connection to the back end. Don't attempt a |
| 526 // normal close() since that may wait on transactions which require a | 523 // normal close() since that may wait on transactions which require a |
| 527 // round trip to the back-end to abort. | 524 // round trip to the back-end to abort. |
| 528 if (m_backend) { | 525 if (m_backend) { |
| 529 m_backend->close(); | 526 m_backend->close(); |
| 530 m_backend.reset(); | 527 m_backend.reset(); |
| 531 } | 528 } |
| 532 | 529 |
| 533 if (m_databaseCallbacks) | 530 if (m_databaseCallbacks) |
| 534 m_databaseCallbacks->detachWebCallbacks(); | 531 m_databaseCallbacks->detachWebCallbacks(); |
| 535 } | 532 } |
| 536 | 533 |
| 537 const AtomicString& IDBDatabase::interfaceName() const { | 534 const AtomicString& IDBDatabase::interfaceName() const { |
| 538 return EventTargetNames::IDBDatabase; | 535 return EventTargetNames::IDBDatabase; |
| 539 } | 536 } |
| 540 | 537 |
| 541 ExecutionContext* IDBDatabase::getExecutionContext() const { | 538 ExecutionContext* IDBDatabase::getExecutionContext() const { |
| 542 return ActiveDOMObject::getExecutionContext(); | 539 return ActiveDOMObject::getExecutionContext(); |
| 543 } | 540 } |
| 544 | 541 |
| 545 void IDBDatabase::recordApiCallsHistogram(IndexedDatabaseMethods method) { | 542 void IDBDatabase::recordApiCallsHistogram(IndexedDatabaseMethods method) { |
| 546 DEFINE_THREAD_SAFE_STATIC_LOCAL( | 543 DEFINE_THREAD_SAFE_STATIC_LOCAL( |
| 547 EnumerationHistogram, apiCallsHistogram, | 544 EnumerationHistogram, apiCallsHistogram, |
| 548 new EnumerationHistogram("WebCore.IndexedDB.FrontEndAPICalls", | 545 new EnumerationHistogram("WebCore.IndexedDB.FrontEndAPICalls", |
| 549 IDBMethodsMax)); | 546 IDBMethodsMax)); |
| 550 apiCallsHistogram.count(method); | 547 apiCallsHistogram.count(method); |
| 551 } | 548 } |
| 552 | 549 |
| 553 } // namespace blink | 550 } // namespace blink |
| OLD | NEW |