Index: Source/modules/webdatabase/Database.cpp |
diff --git a/Source/modules/webdatabase/Database.cpp b/Source/modules/webdatabase/Database.cpp |
index ce79895b1445a21d56a4981089adfbc7bc3ee9a3..7b64ae60c2774d73c4cc615440706f7fc23e2afa 100644 |
--- a/Source/modules/webdatabase/Database.cpp |
+++ b/Source/modules/webdatabase/Database.cpp |
@@ -140,38 +140,45 @@ void Database::closeImmediately() |
} |
} |
-void Database::changeVersion(const String& oldVersion, const String& newVersion, PassRefPtr<SQLTransactionCallback> callback, PassRefPtr<SQLTransactionErrorCallback> errorCallback, PassRefPtr<SQLVoidCallback> successCallback) |
+void Database::changeVersion(const String& oldVersion, const String& newVersion, PassOwnPtr<SQLTransactionCallback> callback, PassOwnPtr<SQLTransactionErrorCallback> errorCallback, PassOwnPtr<SQLVoidCallback> successCallback) |
{ |
ChangeVersionData data(oldVersion, newVersion); |
runTransaction(callback, errorCallback, successCallback, false, &data); |
} |
-void Database::transaction(PassRefPtr<SQLTransactionCallback> callback, PassRefPtr<SQLTransactionErrorCallback> errorCallback, PassRefPtr<SQLVoidCallback> successCallback) |
+void Database::transaction(PassOwnPtr<SQLTransactionCallback> callback, PassOwnPtr<SQLTransactionErrorCallback> errorCallback, PassOwnPtr<SQLVoidCallback> successCallback) |
{ |
runTransaction(callback, errorCallback, successCallback, false); |
} |
-void Database::readTransaction(PassRefPtr<SQLTransactionCallback> callback, PassRefPtr<SQLTransactionErrorCallback> errorCallback, PassRefPtr<SQLVoidCallback> successCallback) |
+void Database::readTransaction(PassOwnPtr<SQLTransactionCallback> callback, PassOwnPtr<SQLTransactionErrorCallback> errorCallback, PassOwnPtr<SQLVoidCallback> successCallback) |
{ |
runTransaction(callback, errorCallback, successCallback, true); |
} |
-static void callTransactionErrorCallback(ExecutionContext*, PassRefPtr<SQLTransactionErrorCallback> callback, PassRefPtr<SQLError> error) |
+static void callTransactionErrorCallback(ExecutionContext*, PassOwnPtr<SQLTransactionErrorCallback> callback, PassRefPtr<SQLError> error) |
{ |
callback->handleEvent(error.get()); |
} |
-void Database::runTransaction(PassRefPtr<SQLTransactionCallback> callback, PassRefPtr<SQLTransactionErrorCallback> errorCallback, |
- PassRefPtr<SQLVoidCallback> successCallback, bool readOnly, const ChangeVersionData* changeVersionData) |
+void Database::runTransaction(PassOwnPtr<SQLTransactionCallback> callback, PassOwnPtr<SQLTransactionErrorCallback> errorCallback, |
+ PassOwnPtr<SQLVoidCallback> successCallback, bool readOnly, const ChangeVersionData* changeVersionData) |
{ |
- RefPtr<SQLTransactionErrorCallback> anotherRefToErrorCallback = errorCallback; |
- RefPtr<SQLTransaction> transaction = SQLTransaction::create(this, callback, successCallback, anotherRefToErrorCallback, readOnly); |
- |
- RefPtr<SQLTransactionBackend> transactionBackend; |
- transactionBackend = backend()->runTransaction(transaction.release(), readOnly, changeVersionData); |
- if (!transactionBackend && anotherRefToErrorCallback) { |
- RefPtr<SQLError> error = SQLError::create(SQLError::UNKNOWN_ERR, "database has been closed"); |
- executionContext()->postTask(createCallbackTask(&callTransactionErrorCallback, anotherRefToErrorCallback, error.release())); |
+ // FIXME: Rather than passing errorCallback to SQLTransaction and then sometimes firing it ourselves, |
+ // this code should probably be pushed down into DatabaseBackend so that we only create the SQLTransaction |
+ // if we're actually going to run it. |
+#if !ASSERT_DISABLED |
+ SQLTransactionErrorCallback* originalErrorCallback = errorCallback.get(); |
+#endif |
+ RefPtr<SQLTransaction> transaction = SQLTransaction::create(this, callback, successCallback, errorCallback, readOnly); |
+ RefPtr<SQLTransactionBackend> transactionBackend = backend()->runTransaction(transaction, readOnly, changeVersionData); |
+ if (!transactionBackend) { |
+ OwnPtr<SQLTransactionErrorCallback> callback = transaction->releaseErrorCallback(); |
+ ASSERT(callback == originalErrorCallback); |
+ if (callback) { |
+ RefPtr<SQLError> error = SQLError::create(SQLError::UNKNOWN_ERR, "database has been closed"); |
+ executionContext()->postTask(createCallbackTask(&callTransactionErrorCallback, callback.release(), error.release())); |
+ } |
} |
} |