Index: Source/modules/indexeddb/IDBTransaction.cpp |
diff --git a/Source/modules/indexeddb/IDBTransaction.cpp b/Source/modules/indexeddb/IDBTransaction.cpp |
index a3f3ea5cedab85656d93bd8ae26666282b879839..71eaaa13de77a77f28e20f965b72930678f4b174 100644 |
--- a/Source/modules/indexeddb/IDBTransaction.cpp |
+++ b/Source/modules/indexeddb/IDBTransaction.cpp |
@@ -59,6 +59,30 @@ IDBTransaction* IDBTransaction::create(ScriptState* scriptState, int64_t id, IDB |
return transaction; |
} |
+namespace { |
+ |
+class DeactivateTransactionTask : public V8PerIsolateData::EndOfScopeTask { |
+public: |
+ static PassOwnPtr<DeactivateTransactionTask> create(IDBTransaction* transaction) |
+ { |
+ return adoptPtr(new DeactivateTransactionTask(transaction)); |
+ } |
+ |
+ void Run() override |
+ { |
+ m_transaction->setActive(false); |
+ m_transaction.clear(); |
+ } |
+ |
+private: |
+ explicit DeactivateTransactionTask(IDBTransaction* transaction) |
+ : m_transaction(transaction) { } |
+ |
+ Persistent<IDBTransaction> m_transaction; |
+}; |
+ |
+} // namespace |
+ |
IDBTransaction::IDBTransaction(ScriptState* scriptState, int64_t id, const Vector<String>& objectStoreNames, WebIDBTransactionMode mode, IDBDatabase* db, IDBOpenDBRequest* openDBRequest, const IDBDatabaseMetadata& previousMetadata) |
: ActiveDOMObject(scriptState->executionContext()) |
, m_id(id) |
@@ -77,7 +101,7 @@ IDBTransaction::IDBTransaction(ScriptState* scriptState, int64_t id, const Vecto |
} |
if (m_state == Active) |
- V8PerIsolateData::from(scriptState->isolate())->ensureIDBPendingTransactionMonitor()->addNewTransaction(*this); |
+ V8PerIsolateData::from(scriptState->isolate())->addEndOfScopeTask(DeactivateTransactionTask::create(this)); |
m_database->transactionCreated(this); |
} |