Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(81)

Unified Diff: Source/modules/webdatabase/Database.cpp

Issue 103473002: Manage WebSQL callbacks with OwnPtr instead of refcounting (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix RefPtr/OwnPtr transition gcc errors Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/modules/webdatabase/Database.h ('k') | Source/modules/webdatabase/DatabaseCallback.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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()));
+ }
}
}
« no previous file with comments | « Source/modules/webdatabase/Database.h ('k') | Source/modules/webdatabase/DatabaseCallback.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698