void Database::runTransaction( SQLTransactionCallback* callback, SQLTransactionErrorCallback* errorCallback, VoidCallback* successCallback, bool readOnly, const ChangeVersionData* changeVersionData) { ASSERT(executionContext()->isContextThread()); // FIXME: Rather than passing errorCallback to SQLTransaction and then // sometimes firing it ourselves, this code should probably be pushed down // into Database so that we only create the SQLTransaction if we're // actually going to run it. #if ENABLE(ASSERT) SQLTransactionErrorCallback* originalErrorCallback = errorCallback; #endif SQLTransaction* transaction = SQLTransaction::create(this, callback, successCallback, errorCallback, readOnly); SQLTransactionBackend* transactionBackend = runTransaction(transaction, readOnly, changeVersionData); if (!transactionBackend) { SQLTransactionErrorCallback* callback = transaction->releaseErrorCallback(); ASSERT(callback == originalErrorCallback); if (callback) { OwnPtr<SQLErrorData> error = SQLErrorData::create(SQLError::UNKNOWN_ERR, "database has been closed"); executionContext()->postTask(BLINK_FROM_HERE, createSameThreadTask(&callTransactionErrorCallback, callback, error.release())); } } }