Move DatabaseTracker and DatabaseMessageFilter off of FILE thread
As part of the Great TaskScheduler Migration, move 'Database' (i.e.
WebSQL) operations in the browser off of the FILE thread to a
dedicated task runner.
Unit tests still override the task runner; that will be tackled in
a follow-up.
Bug: 739945
Change-Id: I7308c18fa6ff60686a3cffa62d35eb9719935477
Reviewed-on: https://chromium-review.googlesource.com/563649
Commit-Queue: Joshua Bell <[email protected]>
Reviewed-by: Michael Nordman <[email protected]>
Reviewed-by: Victor Costan <[email protected]>
Reviewed-by: John Abd-El-Malek <[email protected]>
Reviewed-by: Devlin <[email protected]>
Cr-Commit-Position: refs/heads/master@{#489043}
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index 5572d58..01143e4 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -4602,6 +4602,24 @@
base::WeakPtrFactory<base::MessageLoop> weak_factory_;
};
+namespace {
+// Helper to create (open, close, verify) a WebSQL database.
+// Must be run on the DatabaseTracker's task runner.
+void CreateDatabase(storage::DatabaseTracker* db_tracker,
+ const std::string& origin_id) {
+ DCHECK(db_tracker->task_runner()->RunsTasksInCurrentSequence());
+ base::string16 db_name = base::UTF8ToUTF16("db");
+ base::string16 description = base::UTF8ToUTF16("db_description");
+ int64_t size;
+ db_tracker->DatabaseOpened(origin_id, db_name, description, 1, &size);
+ db_tracker->DatabaseClosed(origin_id, db_name);
+ std::vector<storage::OriginInfo> origins;
+ db_tracker->GetAllOriginsInfo(&origins);
+ EXPECT_EQ(1U, origins.size());
+ EXPECT_EQ(origin_id, origins[0].GetOriginIdentifier());
+}
+} // namespace
+
// Verifies extension state is removed upon uninstall.
TEST_F(ExtensionServiceTest, ClearExtensionData) {
InitializeEmptyExtensionService();
@@ -4639,15 +4657,10 @@
storage::DatabaseTracker* db_tracker =
BrowserContext::GetDefaultStoragePartition(profile())
->GetDatabaseTracker();
- base::string16 db_name = base::UTF8ToUTF16("db");
- base::string16 description = base::UTF8ToUTF16("db_description");
- int64_t size;
- db_tracker->DatabaseOpened(origin_id, db_name, description, 1, &size);
- db_tracker->DatabaseClosed(origin_id, db_name);
- std::vector<storage::OriginInfo> origins;
- db_tracker->GetAllOriginsInfo(&origins);
- EXPECT_EQ(1U, origins.size());
- EXPECT_EQ(origin_id, origins[0].GetOriginIdentifier());
+ db_tracker->task_runner()->PostTask(
+ FROM_HERE,
+ base::BindOnce(&CreateDatabase, base::Unretained(db_tracker), origin_id));
+ content::RunAllBlockingPoolTasksUntilIdle();
// Create local storage. We only simulate this by creating the backing files.
// Note: This test depends on details of how the dom_storage library
@@ -4689,9 +4702,15 @@
EXPECT_EQ(0U, callback.list_.size());
// The database should have vanished as well.
- origins.clear();
- db_tracker->GetAllOriginsInfo(&origins);
- EXPECT_EQ(0U, origins.size());
+ db_tracker->task_runner()->PostTask(
+ FROM_HERE, base::BindOnce(
+ [](storage::DatabaseTracker* db_tracker) {
+ std::vector<storage::OriginInfo> origins;
+ db_tracker->GetAllOriginsInfo(&origins);
+ EXPECT_EQ(0U, origins.size());
+ },
+ base::Unretained(db_tracker)));
+ content::RunAllBlockingPoolTasksUntilIdle();
// Check that the LSO file has been removed.
EXPECT_FALSE(base::PathExists(lso_file_path));
@@ -4760,15 +4779,10 @@
storage::DatabaseTracker* db_tracker =
BrowserContext::GetDefaultStoragePartition(profile())
->GetDatabaseTracker();
- base::string16 db_name = base::UTF8ToUTF16("db");
- base::string16 description = base::UTF8ToUTF16("db_description");
- int64_t size;
- db_tracker->DatabaseOpened(origin_id, db_name, description, 1, &size);
- db_tracker->DatabaseClosed(origin_id, db_name);
- std::vector<storage::OriginInfo> origins;
- db_tracker->GetAllOriginsInfo(&origins);
- EXPECT_EQ(1U, origins.size());
- EXPECT_EQ(origin_id, origins[0].GetOriginIdentifier());
+ db_tracker->task_runner()->PostTask(
+ FROM_HERE,
+ base::BindOnce(&CreateDatabase, base::Unretained(db_tracker), origin_id));
+ content::RunAllBlockingPoolTasksUntilIdle();
// Create local storage. We only simulate this by creating the backing files.
// Note: This test depends on details of how the dom_storage library
@@ -4822,9 +4836,15 @@
EXPECT_EQ(0U, callback.list_.size());
// The database should have vanished as well.
- origins.clear();
- db_tracker->GetAllOriginsInfo(&origins);
- EXPECT_EQ(0U, origins.size());
+ db_tracker->task_runner()->PostTask(
+ FROM_HERE, base::BindOnce(
+ [](storage::DatabaseTracker* db_tracker) {
+ std::vector<storage::OriginInfo> origins;
+ db_tracker->GetAllOriginsInfo(&origins);
+ EXPECT_EQ(0U, origins.size());
+ },
+ base::Unretained(db_tracker)));
+ content::RunAllBlockingPoolTasksUntilIdle();
// Check that the LSO file has been removed.
EXPECT_FALSE(base::PathExists(lso_file_path));