Commit 439d2393 authored by Victor Costan's avatar Victor Costan Committed by Chromium LUCI CQ

WebSQL: Simplify API for DatabaseTracker::DeleteDatabase.

The method currently follows an unfortunate maybe-async pattern
established in //net whereby operations may either report an outcome
synchronously by returning a net::Error other than net::ERR_IO_PENDING,
or report the outcome asynchronously by invoking a callback.

This CL changes the method to unconditionally run the callback with the
operation outcome. This is intended to simplify the mental model and
control flow around the method.

Change-Id: Iedf252bae4f6dc82c5570ccc5f1d70f8b2e11c2e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2635679
Auto-Submit: Victor Costan <pwnall@chromium.org>
Commit-Queue: Joshua Bell <jsbell@chromium.org>
Reviewed-by: default avatarJoshua Bell <jsbell@chromium.org>
Cr-Commit-Position: refs/heads/master@{#844862}
parent 2a180771
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <algorithm> #include <algorithm>
#include "base/bind.h" #include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/files/file_enumerator.h" #include "base/files/file_enumerator.h"
#include "base/files/file_util.h" #include "base/files/file_util.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
...@@ -176,8 +177,7 @@ void DatabaseTracker::HandleSqliteError( ...@@ -176,8 +177,7 @@ void DatabaseTracker::HandleSqliteError(
// Note: the client-side filters out all but these two errors as // Note: the client-side filters out all but these two errors as
// a small optimization, see WebDatabaseObserverImpl::HandleSqliteError. // a small optimization, see WebDatabaseObserverImpl::HandleSqliteError.
if (error == SQLITE_CORRUPT || error == SQLITE_NOTADB) { if (error == SQLITE_CORRUPT || error == SQLITE_NOTADB) {
DeleteDatabase(origin_identifier, database_name, DeleteDatabase(origin_identifier, database_name, base::DoNothing());
net::CompletionOnceCallback());
} }
} }
...@@ -677,25 +677,27 @@ void DatabaseTracker::ScheduleDatabasesForDeletion( ...@@ -677,25 +677,27 @@ void DatabaseTracker::ScheduleDatabasesForDeletion(
} }
} }
int DatabaseTracker::DeleteDatabase(const std::string& origin_identifier, void DatabaseTracker::DeleteDatabase(const std::string& origin_identifier,
const base::string16& database_name, const base::string16& database_name,
net::CompletionOnceCallback callback) { net::CompletionOnceCallback callback) {
DCHECK(task_runner_->RunsTasksInCurrentSequence()); DCHECK(task_runner_->RunsTasksInCurrentSequence());
if (!LazyInit()) DCHECK(!callback.is_null());
return net::ERR_FAILED; if (!LazyInit()) {
std::move(callback).Run(net::ERR_FAILED);
return;
}
if (database_connections_.IsDatabaseOpened(origin_identifier, if (database_connections_.IsDatabaseOpened(origin_identifier,
database_name)) { database_name)) {
if (!callback.is_null()) { DatabaseSet set;
DatabaseSet set; set[origin_identifier].insert(database_name);
set[origin_identifier].insert(database_name); deletion_callbacks_.emplace_back(std::move(callback), std::move(set));
deletion_callbacks_.emplace_back(std::move(callback), set);
}
ScheduleDatabaseForDeletion(origin_identifier, database_name); ScheduleDatabaseForDeletion(origin_identifier, database_name);
return net::ERR_IO_PENDING; return;
} }
DeleteClosedDatabase(origin_identifier, database_name); DeleteClosedDatabase(origin_identifier, database_name);
return net::OK; std::move(callback).Run(net::OK);
} }
int DatabaseTracker::DeleteDataModifiedSince( int DatabaseTracker::DeleteDataModifiedSince(
......
...@@ -138,12 +138,14 @@ class COMPONENT_EXPORT(STORAGE_BROWSER) DatabaseTracker ...@@ -138,12 +138,14 @@ class COMPONENT_EXPORT(STORAGE_BROWSER) DatabaseTracker
bool IsDatabaseScheduledForDeletion(const std::string& origin_identifier, bool IsDatabaseScheduledForDeletion(const std::string& origin_identifier,
const base::string16& database_name); const base::string16& database_name);
// Deletes a single database. Returns net::OK on success, net::FAILED on // Deletes a single database.
// failure, or net::ERR_IO_PENDING and |callback| is invoked upon completion, //
// if non-null. // `callback` must be non-null, and is invoked upon completion with a
int DeleteDatabase(const std::string& origin_identifier, // net::Error, which will most likely be net::OK or net::FAILED. `callback`
const base::string16& database_name, // may be called before this method returns.
net::CompletionOnceCallback callback); void DeleteDatabase(const std::string& origin_identifier,
const base::string16& database_name,
net::CompletionOnceCallback callback);
// Delete any databases that have been touched since the cutoff date that's // Delete any databases that have been touched since the cutoff date that's
// supplied, omitting any that match IDs within |protected_origins|. // supplied, omitting any that match IDs within |protected_origins|.
......
...@@ -248,17 +248,15 @@ class DatabaseTracker_TestHelper_Test { ...@@ -248,17 +248,15 @@ class DatabaseTracker_TestHelper_Test {
// Delete db1. Should also delete origin1. // Delete db1. Should also delete origin1.
TestObserver observer; TestObserver observer;
tracker->AddObserver(&observer); tracker->AddObserver(&observer);
net::TestCompletionCallback callback1; net::TestCompletionCallback delete_database_callback;
int result = tracker->DeleteDatabase(kOrigin1, kDB1,
tracker->DeleteDatabase(kOrigin1, kDB1, callback1.callback()); delete_database_callback.callback());
EXPECT_EQ(net::ERR_IO_PENDING, result); EXPECT_FALSE(delete_database_callback.have_result());
ASSERT_FALSE(callback1.have_result());
EXPECT_TRUE(observer.DidReceiveNewNotification()); EXPECT_TRUE(observer.DidReceiveNewNotification());
EXPECT_EQ(kOrigin1, observer.GetNotificationOriginIdentifier()); EXPECT_EQ(kOrigin1, observer.GetNotificationOriginIdentifier());
EXPECT_EQ(kDB1, observer.GetNotificationDatabaseName()); EXPECT_EQ(kDB1, observer.GetNotificationDatabaseName());
tracker->DatabaseClosed(kOrigin1, kDB1); tracker->DatabaseClosed(kOrigin1, kDB1);
result = callback1.GetResult(result); EXPECT_EQ(net::OK, delete_database_callback.WaitForResult());
EXPECT_EQ(net::OK, result);
EXPECT_FALSE(base::PathExists(tracker->GetOriginDirectory(kOrigin1))); EXPECT_FALSE(base::PathExists(tracker->GetOriginDirectory(kOrigin1)));
// Recreate db1. // Recreate db1.
...@@ -287,7 +285,7 @@ class DatabaseTracker_TestHelper_Test { ...@@ -287,7 +285,7 @@ class DatabaseTracker_TestHelper_Test {
yesterday -= base::TimeDelta::FromDays(1); yesterday -= base::TimeDelta::FromDays(1);
net::TestCompletionCallback callback2; net::TestCompletionCallback callback2;
result = int result =
tracker->DeleteDataModifiedSince(yesterday, callback2.callback()); tracker->DeleteDataModifiedSince(yesterday, callback2.callback());
EXPECT_EQ(net::ERR_IO_PENDING, result); EXPECT_EQ(net::ERR_IO_PENDING, result);
ASSERT_FALSE(callback2.have_result()); ASSERT_FALSE(callback2.have_result());
...@@ -514,9 +512,11 @@ class DatabaseTracker_TestHelper_Test { ...@@ -514,9 +512,11 @@ class DatabaseTracker_TestHelper_Test {
tracker->DatabaseClosed(kOriginId, kName); tracker->DatabaseClosed(kOriginId, kName);
EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin)); EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin));
EXPECT_EQ(net::OK, net::TestCompletionCallback delete_database_callback;
tracker->DeleteDatabase(kOriginId, kName, tracker->DeleteDatabase(kOriginId, kName,
net::CompletionOnceCallback())); delete_database_callback.callback());
EXPECT_TRUE(delete_database_callback.have_result());
EXPECT_EQ(net::OK, delete_database_callback.WaitForResult());
EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, -100)); EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, -100));
test_quota_proxy->reset(); test_quota_proxy->reset();
...@@ -542,9 +542,10 @@ class DatabaseTracker_TestHelper_Test { ...@@ -542,9 +542,10 @@ class DatabaseTracker_TestHelper_Test {
EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 100)); EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 100));
test_quota_proxy->reset(); test_quota_proxy->reset();
EXPECT_EQ(net::ERR_IO_PENDING, net::TestCompletionCallback delete_database_callback2;
tracker->DeleteDatabase(kOriginId, kName, tracker->DeleteDatabase(kOriginId, kName,
net::CompletionOnceCallback())); delete_database_callback2.callback());
EXPECT_FALSE(delete_database_callback2.have_result());
EXPECT_FALSE( EXPECT_FALSE(
test_quota_proxy->WasModificationNotified(kOrigin, -100)); test_quota_proxy->WasModificationNotified(kOrigin, -100));
EXPECT_TRUE(base::PathExists(tracker->GetOriginDirectory(kOriginId))); EXPECT_TRUE(base::PathExists(tracker->GetOriginDirectory(kOriginId)));
...@@ -554,6 +555,8 @@ class DatabaseTracker_TestHelper_Test { ...@@ -554,6 +555,8 @@ class DatabaseTracker_TestHelper_Test {
EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, -100)); EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, -100));
EXPECT_FALSE( EXPECT_FALSE(
base::PathExists(tracker->GetOriginDirectory(kOriginId))); base::PathExists(tracker->GetOriginDirectory(kOriginId)));
EXPECT_TRUE(delete_database_callback2.have_result());
EXPECT_EQ(net::OK, delete_database_callback2.WaitForResult());
test_quota_proxy->reset(); test_quota_proxy->reset();
// Create a database and up the file size without telling // Create a database and up the file size without telling
...@@ -818,9 +821,11 @@ class DatabaseTracker_TestHelper_Test { ...@@ -818,9 +821,11 @@ class DatabaseTracker_TestHelper_Test {
tracker->DatabaseClosed(kOriginId, kEmptyName); tracker->DatabaseClosed(kOriginId, kEmptyName);
// Deleting it should return to the initial state. // Deleting it should return to the initial state.
EXPECT_EQ(net::OK, net::TestCompletionCallback delete_database_callback;
tracker->DeleteDatabase(kOriginId, kEmptyName, tracker->DeleteDatabase(kOriginId, kEmptyName,
net::CompletionOnceCallback())); delete_database_callback.callback());
EXPECT_TRUE(delete_database_callback.have_result());
EXPECT_EQ(net::OK, delete_database_callback.WaitForResult());
infos.clear(); infos.clear();
EXPECT_TRUE(tracker->GetAllOriginsInfo(&infos)); EXPECT_TRUE(tracker->GetAllOriginsInfo(&infos));
EXPECT_TRUE(infos.empty()); EXPECT_TRUE(infos.empty());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment