Use ScopedTaskEnvironment instead of MessageLoopForUI in components tests.

ScopedTaskEnvironment allows usage of ThreadTaskRunnerHandle and
base/task_scheduler/post_task.h within its scope. It should be
instantiated in everytest that uses either of these APIs
(i.e. no test should instantiate a MessageLoop directly).

Motivation for ScopedTaskEnvironment can be found in:
https://docs.google.com/document/d/1QabRo8c7D9LsYY3cEcaPQbOCLo8Tu-6VLykYXyl3Pkk/edit

BUG=708584
R=gab@chromium.org
TBR=sdefresne@chromium.org

Review-Url: https://codereview.chromium.org/2846723005
Cr-Commit-Position: refs/heads/master@{#468361}
diff --git a/components/arc/arc_session_runner_unittest.cc b/components/arc/arc_session_runner_unittest.cc
index 7c8e41de..c407a09 100644
--- a/components/arc/arc_session_runner_unittest.cc
+++ b/components/arc/arc_session_runner_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
+#include "base/test/scoped_task_environment.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "components/arc/arc_session_runner.h"
 #include "components/arc/test/fake_arc_session.h"
@@ -34,7 +35,9 @@
 class ArcSessionRunnerTest : public testing::Test,
                              public ArcSessionRunner::Observer {
  public:
-  ArcSessionRunnerTest() = default;
+  ArcSessionRunnerTest()
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI) {}
 
   void SetUp() override {
     chromeos::DBusThreadManager::Initialize();
@@ -97,7 +100,7 @@
   ArcStopReason stop_reason_;
   bool restarting_;
   std::unique_ptr<ArcSessionRunner> arc_session_runner_;
-  base::MessageLoopForUI message_loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
 
   DISALLOW_COPY_AND_ASSIGN(ArcSessionRunnerTest);
 };
diff --git a/components/autofill/core/browser/webdata/web_data_service_unittest.cc b/components/autofill/core/browser/webdata/web_data_service_unittest.cc
index 349e5a1..68e8dd0 100644
--- a/components/autofill/core/browser/webdata/web_data_service_unittest.cc
+++ b/components/autofill/core/browser/webdata/web_data_service_unittest.cc
@@ -18,6 +18,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/waitable_event.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
@@ -92,7 +93,10 @@
 
 class WebDataServiceTest : public testing::Test {
  public:
-  WebDataServiceTest() : db_thread_("DBThread") {}
+  WebDataServiceTest()
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI),
+        db_thread_("DBThread") {}
 
  protected:
   void SetUp() override {
@@ -134,7 +138,7 @@
     done.Wait();
   }
 
-  base::MessageLoopForUI message_loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
   base::Thread db_thread_;
   base::FilePath profile_dir_;
   scoped_refptr<AutofillWebDataService> wds_;
diff --git a/components/bookmarks/browser/BUILD.gn b/components/bookmarks/browser/BUILD.gn
index b606dc4..8f388340 100644
--- a/components/bookmarks/browser/BUILD.gn
+++ b/components/bookmarks/browser/BUILD.gn
@@ -112,6 +112,7 @@
   deps = [
     ":browser",
     ":unit_tests_bundle_data",
+    "//base/test:test_support",
     "//components/bookmarks/common",
     "//components/bookmarks/test",
     "//components/favicon_base",
diff --git a/components/bookmarks/browser/bookmark_node_data_unittest.cc b/components/bookmarks/browser/bookmark_node_data_unittest.cc
index 881fa7b..127d963 100644
--- a/components/bookmarks/browser/bookmark_node_data_unittest.cc
+++ b/components/bookmarks/browser/bookmark_node_data_unittest.cc
@@ -8,9 +8,9 @@
 
 #include "base/files/scoped_temp_dir.h"
 #include "base/macros.h"
-#include "base/message_loop/message_loop.h"
 #include "base/strings/string16.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_task_environment.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/test/bookmark_test_helpers.h"
 #include "components/bookmarks/test/test_bookmark_client.h"
@@ -25,7 +25,9 @@
 
 class BookmarkNodeDataTest : public testing::Test {
  public:
-  BookmarkNodeDataTest() {}
+  BookmarkNodeDataTest()
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI) {}
 
   void SetUp() override {
     model_ = TestBookmarkClient::CreateModel();
@@ -53,7 +55,7 @@
  private:
   base::ScopedTempDir profile_dir_;
   std::unique_ptr<BookmarkModel> model_;
-  base::MessageLoopForUI loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
 
   DISALLOW_COPY_AND_ASSIGN(BookmarkNodeDataTest);
 };
diff --git a/components/bookmarks/browser/bookmark_utils_unittest.cc b/components/bookmarks/browser/bookmark_utils_unittest.cc
index d78e9fce..6f19f5bf 100644
--- a/components/bookmarks/browser/bookmark_utils_unittest.cc
+++ b/components/bookmarks/browser/bookmark_utils_unittest.cc
@@ -10,8 +10,8 @@
 
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_task_environment.h"
 #include "build/build_config.h"
 #include "components/bookmarks/browser/base_bookmark_model_observer.h"
 #include "components/bookmarks/browser/bookmark_model.h"
@@ -31,7 +31,10 @@
                           public BaseBookmarkModelObserver {
  public:
   BookmarkUtilsTest()
-      : grouped_changes_beginning_count_(0), grouped_changes_ended_count_(0) {}
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI),
+        grouped_changes_beginning_count_(0),
+        grouped_changes_ended_count_(0) {}
 
   ~BookmarkUtilsTest() override {}
 
@@ -69,12 +72,12 @@
     ++grouped_changes_ended_count_;
   }
 
+  // Clipboard requires a message loop.
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
+
   int grouped_changes_beginning_count_;
   int grouped_changes_ended_count_;
 
-  // Clipboard requires a message loop.
-  base::MessageLoopForUI loop_;
-
   DISALLOW_COPY_AND_ASSIGN(BookmarkUtilsTest);
 };
 
diff --git a/components/component_updater/timer_unittest.cc b/components/component_updater/timer_unittest.cc
index 2c80e84..c90ae025 100644
--- a/components/component_updater/timer_unittest.cc
+++ b/components/component_updater/timer_unittest.cc
@@ -4,8 +4,8 @@
 
 #include <string>
 
-#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/time/time.h"
 #include "components/component_updater/timer.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -16,11 +16,13 @@
 
 class ComponentUpdaterTimerTest : public testing::Test {
  public:
-  ComponentUpdaterTimerTest() {}
+  ComponentUpdaterTimerTest()
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI) {}
   ~ComponentUpdaterTimerTest() override {}
 
  private:
-  base::MessageLoopForUI message_loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
 };
 
 TEST_F(ComponentUpdaterTimerTest, Start) {
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats_unittest.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats_unittest.cc
index da671d34..d05f679 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats_unittest.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats_unittest.cc
@@ -15,6 +15,7 @@
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/test/histogram_tester.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/time/time.h"
 #include "base/values.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.h"
@@ -112,7 +113,9 @@
 
 class DataReductionProxyCompressionStatsTest : public testing::Test {
  protected:
-  DataReductionProxyCompressionStatsTest() {
+  DataReductionProxyCompressionStatsTest()
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI) {
     EXPECT_TRUE(base::Time::FromString(kLastUpdateTime, &now_));
   }
 
@@ -473,7 +476,7 @@
   }
 
  private:
-  base::MessageLoopForUI loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
   std::unique_ptr<DataReductionProxyTestContext> drp_test_context_;
   std::unique_ptr<DataReductionProxyCompressionStats> compression_stats_;
   base::Time now_;
diff --git a/components/favicon/core/favicon_handler_unittest.cc b/components/favicon/core/favicon_handler_unittest.cc
index 4a997f3..9f7190f 100644
--- a/components/favicon/core/favicon_handler_unittest.cc
+++ b/components/favicon/core/favicon_handler_unittest.cc
@@ -13,10 +13,10 @@
 
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
 #include "base/test/histogram_tester.h"
+#include "base/test/scoped_task_environment.h"
 #include "components/favicon/core/favicon_driver.h"
 #include "components/favicon/core/test/mock_favicon_service.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -325,7 +325,9 @@
   const GURL kIconURL16x16 = GURL("http://www.google.com/favicon16x16");
   const GURL kIconURL64x64 = GURL("http://www.google.com/favicon64x64");
 
-  FaviconHandlerTest() {
+  FaviconHandlerTest()
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI) {
     // Register various known icon URLs.
     delegate_.fake_downloader().Add(kIconURL10x10, IntVector{10});
     delegate_.fake_downloader().Add(kIconURL12x12, IntVector{12});
@@ -377,7 +379,7 @@
                                     candidates);
   }
 
-  base::MessageLoopForUI message_loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
   std::unique_ptr<ui::test::ScopedSetSupportedScaleFactors>
       scoped_set_supported_scale_factors_;
   testing::NiceMock<MockFaviconServiceWithFake> favicon_service_;
diff --git a/components/gcm_driver/instance_id/instance_id_driver_unittest.cc b/components/gcm_driver/instance_id/instance_id_driver_unittest.cc
index 7b4e722..b8c663f 100644
--- a/components/gcm_driver/instance_id/instance_id_driver_unittest.cc
+++ b/components/gcm_driver/instance_id/instance_id_driver_unittest.cc
@@ -10,9 +10,9 @@
 
 #include "base/bind.h"
 #include "base/macros.h"
-#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/strings/string_util.h"
+#include "base/test/scoped_task_environment.h"
 #include "components/gcm_driver/instance_id/fake_gcm_driver_for_instance_id.h"
 #include "components/gcm_driver/instance_id/instance_id.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -87,7 +87,7 @@
   void GetTokenCompleted(const std::string& token, InstanceID::Result result);
   void DeleteTokenCompleted(InstanceID::Result result);
 
-  base::MessageLoopForUI message_loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
   std::unique_ptr<FakeGCMDriverForInstanceID> gcm_driver_;
   std::unique_ptr<InstanceIDDriver> driver_;
 
@@ -108,9 +108,10 @@
 };
 
 InstanceIDDriverTest::InstanceIDDriverTest()
-    : result_(InstanceID::UNKNOWN_ERROR),
-      async_operation_completed_(false) {
-}
+    : scoped_task_environment_(
+          base::test::ScopedTaskEnvironment::MainThreadType::UI),
+      result_(InstanceID::UNKNOWN_ERROR),
+      async_operation_completed_(false) {}
 
 InstanceIDDriverTest::~InstanceIDDriverTest() {
 }
diff --git a/components/history/core/browser/history_service_unittest.cc b/components/history/core/browser/history_service_unittest.cc
index b26d83adb..29ac63f 100644
--- a/components/history/core/browser/history_service_unittest.cc
+++ b/components/history/core/browser/history_service_unittest.cc
@@ -29,6 +29,7 @@
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/history/core/browser/history_database_params.h"
 #include "components/history/core/browser/history_db_task.h"
@@ -51,7 +52,10 @@
 
 class HistoryServiceTest : public testing::Test {
  public:
-  HistoryServiceTest() : query_url_success_(false) {}
+  HistoryServiceTest()
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI),
+        query_url_success_(false) {}
 
   ~HistoryServiceTest() override {}
 
@@ -154,7 +158,7 @@
 
   base::ScopedTempDir temp_dir_;
 
-  base::MessageLoopForUI message_loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
 
   MostVisitedURLList most_visited_urls_;
 
diff --git a/components/history/core/test/BUILD.gn b/components/history/core/test/BUILD.gn
index 70c02fe..2fd38cf 100644
--- a/components/history/core/test/BUILD.gn
+++ b/components/history/core/test/BUILD.gn
@@ -29,6 +29,7 @@
 
   deps = [
     "//base",
+    "//base/test:test_support",
     "//components/history/core/browser",
     "//components/sync/protocol:protocol",
     "//net",
diff --git a/components/history/core/test/history_backend_db_base_test.cc b/components/history/core/test/history_backend_db_base_test.cc
index 8a04b25..f9598584 100644
--- a/components/history/core/test/history_backend_db_base_test.cc
+++ b/components/history/core/test/history_backend_db_base_test.cc
@@ -62,9 +62,10 @@
 };
 
 HistoryBackendDBBaseTest::HistoryBackendDBBaseTest()
-    : db_(nullptr),
-      last_profile_error_ (sql::INIT_OK) {
-}
+    : scoped_task_environment_(
+          base::test::ScopedTaskEnvironment::MainThreadType::UI),
+      db_(nullptr),
+      last_profile_error_(sql::INIT_OK) {}
 
 HistoryBackendDBBaseTest::~HistoryBackendDBBaseTest() {
 }
diff --git a/components/history/core/test/history_backend_db_base_test.h b/components/history/core/test/history_backend_db_base_test.h
index 31798fd..1c5cfd5 100644
--- a/components/history/core/test/history_backend_db_base_test.h
+++ b/components/history/core/test/history_backend_db_base_test.h
@@ -13,7 +13,7 @@
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
+#include "base/test/scoped_task_environment.h"
 #include "components/history/core/test/history_unittest_base.h"
 #include "sql/init_status.h"
 
@@ -59,7 +59,7 @@
 
   base::ScopedTempDir temp_dir_;
 
-  base::MessageLoopForUI message_loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
 
   // names of the database files
   base::FilePath history_dir_;
diff --git a/components/password_manager/core/browser/password_store_default_unittest.cc b/components/password_manager/core/browser/password_store_default_unittest.cc
index f8239e5c..93e1793 100644
--- a/components/password_manager/core/browser/password_store_default_unittest.cc
+++ b/components/password_manager/core/browser/password_store_default_unittest.cc
@@ -15,6 +15,7 @@
 #include "base/run_loop.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "components/password_manager/core/browser/login_database.h"
@@ -97,21 +98,25 @@
 
   base::FilePath test_login_db_file_path() const;
 
-  base::MessageLoopForUI message_loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
   base::ScopedTempDir temp_dir_;
   scoped_refptr<PasswordStoreDefault> store_;
 
   DISALLOW_COPY_AND_ASSIGN(PasswordStoreDefaultTestDelegate);
 };
 
-PasswordStoreDefaultTestDelegate::PasswordStoreDefaultTestDelegate() {
+PasswordStoreDefaultTestDelegate::PasswordStoreDefaultTestDelegate()
+    : scoped_task_environment_(
+          base::test::ScopedTaskEnvironment::MainThreadType::UI) {
   SetupTempDir();
   store_ = CreateInitializedStore(
       base::MakeUnique<LoginDatabase>(test_login_db_file_path()));
 }
 
 PasswordStoreDefaultTestDelegate::PasswordStoreDefaultTestDelegate(
-    std::unique_ptr<LoginDatabase> database) {
+    std::unique_ptr<LoginDatabase> database)
+    : scoped_task_environment_(
+          base::test::ScopedTaskEnvironment::MainThreadType::UI) {
   SetupTempDir();
   store_ = CreateInitializedStore(std::move(database));
 }
diff --git a/components/password_manager/core/browser/password_store_unittest.cc b/components/password_manager/core/browser/password_store_unittest.cc
index 52777039..361f3017 100644
--- a/components/password_manager/core/browser/password_store_unittest.cc
+++ b/components/password_manager/core/browser/password_store_unittest.cc
@@ -19,6 +19,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/waitable_event.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -89,6 +90,10 @@
 
 class PasswordStoreTest : public testing::Test {
  protected:
+  PasswordStoreTest()
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI) {}
+
   void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); }
 
   void TearDown() override { ASSERT_TRUE(temp_dir_.Delete()); }
@@ -97,7 +102,7 @@
     return temp_dir_.GetPath().Append(FILE_PATH_LITERAL("login_test"));
   }
 
-  base::MessageLoopForUI message_loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
   base::ScopedTempDir temp_dir_;
 };
 
diff --git a/components/policy/core/common/cloud/cloud_policy_validator_unittest.cc b/components/policy/core/common/cloud/cloud_policy_validator_unittest.cc
index 1a773e8..6356d50 100644
--- a/components/policy/core/common/cloud/cloud_policy_validator_unittest.cc
+++ b/components/policy/core/common/cloud/cloud_policy_validator_unittest.cc
@@ -13,10 +13,10 @@
 #include "base/bind.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_util.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
@@ -43,7 +43,9 @@
 class CloudPolicyValidatorTest : public testing::Test {
  public:
   CloudPolicyValidatorTest()
-      : timestamp_(base::Time::FromJavaTime(PolicyBuilder::kFakeTimestamp)),
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI),
+        timestamp_(base::Time::FromJavaTime(PolicyBuilder::kFakeTimestamp)),
         timestamp_option_(CloudPolicyValidatorBase::TIMESTAMP_VALIDATED),
         dm_token_option_(CloudPolicyValidatorBase::DM_TOKEN_REQUIRED),
         device_id_option_(CloudPolicyValidatorBase::DEVICE_ID_REQUIRED),
@@ -117,7 +119,7 @@
               validator->payload()->SerializeAsString());
   }
 
-  base::MessageLoopForUI loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
   base::Time timestamp_;
   CloudPolicyValidatorBase::ValidateTimestampOption timestamp_option_;
   CloudPolicyValidatorBase::ValidateDMTokenOption dm_token_option_;
diff --git a/components/policy/core/common/cloud/user_cloud_policy_store_unittest.cc b/components/policy/core/common/cloud/user_cloud_policy_store_unittest.cc
index c1f7272..b07c5d5b1 100644
--- a/components/policy/core/common/cloud/user_cloud_policy_store_unittest.cc
+++ b/components/policy/core/common/cloud/user_cloud_policy_store_unittest.cc
@@ -8,6 +8,8 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
+#include "base/test/scoped_task_environment.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
 #include "components/policy/core/common/cloud/mock_cloud_external_data_manager.h"
 #include "components/policy/core/common/cloud/mock_cloud_policy_store.h"
@@ -52,12 +54,14 @@
 
 class UserCloudPolicyStoreTest : public testing::Test {
  public:
-  UserCloudPolicyStoreTest() {}
+  UserCloudPolicyStoreTest()
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI) {}
 
   void SetUp() override {
     ASSERT_TRUE(tmp_dir_.CreateUniqueTempDir());
     store_.reset(new UserCloudPolicyStore(policy_file(), key_file(),
-                                          loop_.task_runner()));
+                                          base::ThreadTaskRunnerHandle::Get()));
     external_data_manager_.reset(new MockCloudExternalDataManager);
     external_data_manager_->SetPolicyStore(store_.get());
     store_->SetSigninUsername(PolicyBuilder::kFakeUsername);
@@ -130,10 +134,7 @@
   std::unique_ptr<UserCloudPolicyStore> store_;
   std::unique_ptr<MockCloudExternalDataManager> external_data_manager_;
 
-  // CloudPolicyValidator() requires a FILE thread so declare one here. Both
-  // |ui_thread_| and |file_thread_| share the same MessageLoop |loop_| so
-  // callers can use RunLoop to manage both virtual threads.
-  base::MessageLoopForUI loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
 
   base::ScopedTempDir tmp_dir_;
 
@@ -353,8 +354,8 @@
   EXPECT_FALSE(store_->policy_signature_public_key().empty());
 
   // Now, make sure the policy can be read back in from a second store.
-  std::unique_ptr<UserCloudPolicyStore> store2(
-      new UserCloudPolicyStore(policy_file(), key_file(), loop_.task_runner()));
+  std::unique_ptr<UserCloudPolicyStore> store2(new UserCloudPolicyStore(
+      policy_file(), key_file(), base::ThreadTaskRunnerHandle::Get()));
   store2->SetSigninUsername(PolicyBuilder::kFakeUsername);
   store2->AddObserver(&observer_);
   EXPECT_CALL(observer_, OnStoreLoaded(store2.get()));
@@ -378,8 +379,8 @@
   StorePolicyAndEnsureLoaded(policy_.policy());
 
   // Now, make sure the policy can be read back in from a second store.
-  std::unique_ptr<UserCloudPolicyStore> store2(
-      new UserCloudPolicyStore(policy_file(), key_file(), loop_.task_runner()));
+  std::unique_ptr<UserCloudPolicyStore> store2(new UserCloudPolicyStore(
+      policy_file(), key_file(), base::ThreadTaskRunnerHandle::Get()));
   store2->SetSigninUsername(PolicyBuilder::kFakeUsername);
   store2->AddObserver(&observer_);
   EXPECT_CALL(observer_, OnStoreLoaded(store2.get()));
@@ -422,8 +423,8 @@
 
   // Sign out, and sign back in as a different user, and try to load the profile
   // data (should fail due to mismatched username).
-  std::unique_ptr<UserCloudPolicyStore> store2(
-      new UserCloudPolicyStore(policy_file(), key_file(), loop_.task_runner()));
+  std::unique_ptr<UserCloudPolicyStore> store2(new UserCloudPolicyStore(
+      policy_file(), key_file(), base::ThreadTaskRunnerHandle::Get()));
   store2->SetSigninUsername("foobar@foobar.com");
   store2->AddObserver(&observer_);
   ExpectError(store2.get(), CloudPolicyStore::STATUS_VALIDATION_ERROR);
@@ -435,8 +436,8 @@
 
   // Sign out - we should be able to load the policy (don't check usernames
   // when signed out).
-  std::unique_ptr<UserCloudPolicyStore> store3(
-      new UserCloudPolicyStore(policy_file(), key_file(), loop_.task_runner()));
+  std::unique_ptr<UserCloudPolicyStore> store3(new UserCloudPolicyStore(
+      policy_file(), key_file(), base::ThreadTaskRunnerHandle::Get()));
   store3->AddObserver(&observer_);
   EXPECT_CALL(observer_, OnStoreLoaded(store3.get()));
   store3->Load();
@@ -446,8 +447,8 @@
   store3->RemoveObserver(&observer_);
 
   // Now start a signin as a different user - this should fail validation.
-  std::unique_ptr<UserCloudPolicyStore> store4(
-      new UserCloudPolicyStore(policy_file(), key_file(), loop_.task_runner()));
+  std::unique_ptr<UserCloudPolicyStore> store4(new UserCloudPolicyStore(
+      policy_file(), key_file(), base::ThreadTaskRunnerHandle::Get()));
   store4->SetSigninUsername("foobar@foobar.com");
   store4->AddObserver(&observer_);
   ExpectError(store4.get(), CloudPolicyStore::STATUS_VALIDATION_ERROR);
@@ -474,8 +475,8 @@
 
   // Now load this in a new store - this should trigger key rotation. The keys
   // will still verify using the existing verification key.
-  std::unique_ptr<UserCloudPolicyStore> store2(
-      new UserCloudPolicyStore(policy_file(), key_file(), loop_.task_runner()));
+  std::unique_ptr<UserCloudPolicyStore> store2(new UserCloudPolicyStore(
+      policy_file(), key_file(), base::ThreadTaskRunnerHandle::Get()));
   store2->SetSigninUsername(PolicyBuilder::kFakeUsername);
   store2->AddObserver(&observer_);
   EXPECT_CALL(observer_, OnStoreLoaded(store2.get()));
@@ -500,8 +501,8 @@
 
   // Now load this in a new store - this should cause a validation error because
   // the key won't verify.
-  std::unique_ptr<UserCloudPolicyStore> store2(
-      new UserCloudPolicyStore(policy_file(), key_file(), loop_.task_runner()));
+  std::unique_ptr<UserCloudPolicyStore> store2(new UserCloudPolicyStore(
+      policy_file(), key_file(), base::ThreadTaskRunnerHandle::Get()));
   store2->SetSigninUsername(PolicyBuilder::kFakeUsername);
   store2->AddObserver(&observer_);
   ExpectError(store2.get(), CloudPolicyStore::STATUS_VALIDATION_ERROR);
diff --git a/components/precache/core/precache_database_unittest.cc b/components/precache/core/precache_database_unittest.cc
index 233c2d0..4fca60e 100644
--- a/components/precache/core/precache_database_unittest.cc
+++ b/components/precache/core/precache_database_unittest.cc
@@ -17,6 +17,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/metrics/histogram_base.h"
 #include "base/test/histogram_tester.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/time/time.h"
 #include "components/history/core/browser/history_constants.h"
 #include "net/http/http_response_headers.h"
@@ -89,7 +90,9 @@
 
 class PrecacheDatabaseTest : public testing::Test {
  public:
-  PrecacheDatabaseTest() {}
+  PrecacheDatabaseTest()
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI) {}
   ~PrecacheDatabaseTest() override {}
 
  protected:
@@ -147,9 +150,7 @@
   // Must be declared first so that it is destroyed last.
   base::ScopedTempDir scoped_temp_dir_;
 
-  // Having this MessageLoop member variable causes base::MessageLoop::current()
-  // to be set properly.
-  base::MessageLoopForUI loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
 
   std::unique_ptr<PrecacheDatabase> precache_database_;
   base::HistogramTester histograms_;
diff --git a/components/precache/core/precache_fetcher_unittest.cc b/components/precache/core/precache_fetcher_unittest.cc
index 82cb802..ff32a9e 100644
--- a/components/precache/core/precache_fetcher_unittest.cc
+++ b/components/precache/core/precache_fetcher_unittest.cc
@@ -26,6 +26,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/strings/stringprintf.h"
 #include "base/test/histogram_tester.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/precache/core/precache_database.h"
 #include "components/precache/core/precache_switches.h"
@@ -210,7 +211,9 @@
 class PrecacheFetcherFetcherTest : public testing::Test {
  public:
   PrecacheFetcherFetcherTest()
-      : request_context_(new net::TestURLRequestContextGetter(
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI),
+        request_context_(new net::TestURLRequestContextGetter(
             base::ThreadTaskRunnerHandle::Get())),
         scoped_url_fetcher_factory_(&factory_),
         callback_(base::Bind(&PrecacheFetcherFetcherTest::Callback,
@@ -219,7 +222,7 @@
   MOCK_METHOD1(Callback, void(const PrecacheFetcher::Fetcher&));
 
  protected:
-  base::MessageLoopForUI loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
   scoped_refptr<net::TestURLRequestContextGetter> request_context_;
   MockURLFetcherFactory factory_;
   net::ScopedURLFetcherFactory scoped_url_fetcher_factory_;
@@ -425,7 +428,9 @@
 class PrecacheFetcherTest : public testing::Test {
  public:
   PrecacheFetcherTest()
-      : task_runner_(base::ThreadTaskRunnerHandle::Get()),
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI),
+        task_runner_(base::ThreadTaskRunnerHandle::Get()),
         request_context_(new net::TestURLRequestContextGetter(
             base::ThreadTaskRunnerHandle::Get())),
         factory_(NULL,
@@ -482,7 +487,7 @@
     }
 
     // Check again after allowing the message loop to process some messages.
-    loop_.task_runner()->PostTask(
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
         base::Bind(
             &PrecacheFetcherTest::CheckUntilParallelFetchesBeyondCapacity,
@@ -497,7 +502,7 @@
   void Flush() { precache_database_.Flush(); }
 
   // Must be declared first so that it is destroyed last.
-  base::MessageLoopForUI loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
   scoped_refptr<net::TestURLRequestContextGetter> request_context_;
   TestURLFetcherCallback url_callback_;
@@ -1740,7 +1745,8 @@
             precache_fetcher.resources_to_fetch_.empty())) {
       LOG(INFO) << "remaining_tries: " << remaining_tries;
       base::RunLoop run_loop;
-      loop_.task_runner()->PostTask(FROM_HERE, run_loop.QuitClosure());
+      base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                                    run_loop.QuitClosure());
       run_loop.Run();
     }
 
@@ -1977,7 +1983,8 @@
             precache_fetcher.resources_to_fetch_.empty())) {
       LOG(INFO) << "remaining_tries: " << remaining_tries;
       base::RunLoop run_loop;
-      loop_.task_runner()->PostTask(FROM_HERE, run_loop.QuitClosure());
+      base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                                    run_loop.QuitClosure());
       run_loop.Run();
     }
 
diff --git a/components/rappor/log_uploader_unittest.cc b/components/rappor/log_uploader_unittest.cc
index 8858203..346e6bca 100644
--- a/components/rappor/log_uploader_unittest.cc
+++ b/components/rappor/log_uploader_unittest.cc
@@ -7,6 +7,7 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "net/url_request/test_url_fetcher_factory.h"
 #include "net/url_request/url_request_test_util.h"
@@ -60,13 +61,15 @@
 class LogUploaderTest : public testing::Test {
  public:
   LogUploaderTest()
-      : request_context_(new net::TestURLRequestContextGetter(
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI),
+        request_context_(new net::TestURLRequestContextGetter(
             base::ThreadTaskRunnerHandle::Get())),
         factory_(NULL) {}
 
  protected:
   // Required for base::ThreadTaskRunnerHandle::Get().
-  base::MessageLoopForUI loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
   scoped_refptr<net::TestURLRequestContextGetter> request_context_;
   net::FakeURLFetcherFactory factory_;
 
diff --git a/components/sync/device_info/device_info_data_type_controller_unittest.cc b/components/sync/device_info/device_info_data_type_controller_unittest.cc
index 27c572f..b519f5c 100644
--- a/components/sync/device_info/device_info_data_type_controller_unittest.cc
+++ b/components/sync/device_info/device_info_data_type_controller_unittest.cc
@@ -9,6 +9,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/weak_ptr.h"
 #include "base/run_loop.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/sync/base/model_type.h"
 #include "components/sync/device_info/local_device_info_provider_mock.h"
@@ -23,7 +24,9 @@
 class DeviceInfoDataTypeControllerTest : public testing::Test {
  public:
   DeviceInfoDataTypeControllerTest()
-      : load_finished_(false),
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI),
+        load_finished_(false),
         last_type_(UNSPECIFIED),
         weak_ptr_factory_(this) {}
   ~DeviceInfoDataTypeControllerTest() override {}
@@ -78,13 +81,15 @@
     return testing::AssertionSuccess();
   }
 
+ private:
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
+
  protected:
   std::unique_ptr<DeviceInfoDataTypeController> controller_;
   std::unique_ptr<LocalDeviceInfoProviderMock> local_device_;
   bool load_finished_;
 
  private:
-  base::MessageLoopForUI message_loop_;
   ModelType last_type_;
   SyncError last_error_;
   FakeSyncClient sync_client_;
diff --git a/components/sync/driver/async_directory_type_controller_unittest.cc b/components/sync/driver/async_directory_type_controller_unittest.cc
index c28c2bb..fe61189 100644
--- a/components/sync/driver/async_directory_type_controller_unittest.cc
+++ b/components/sync/driver/async_directory_type_controller_unittest.cc
@@ -16,6 +16,7 @@
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/synchronization/waitable_event.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/test/test_timeouts.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -177,7 +178,10 @@
 class SyncAsyncDirectoryTypeControllerTest : public testing::Test,
                                              public FakeSyncClient {
  public:
-  SyncAsyncDirectoryTypeControllerTest() : backend_thread_("dbthread") {}
+  SyncAsyncDirectoryTypeControllerTest()
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI),
+        backend_thread_("dbthread") {}
 
   void SetUp() override {
     backend_thread_.Start();
@@ -253,7 +257,7 @@
 
   static void SignalDone(WaitableEvent* done) { done->Signal(); }
 
-  base::MessageLoopForUI message_loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
   base::Thread backend_thread_;
 
   StartCallbackMock start_callback_;
diff --git a/components/sync/driver/generic_change_processor_unittest.cc b/components/sync/driver/generic_change_processor_unittest.cc
index 1bc4628e..41d53b1 100644
--- a/components/sync/driver/generic_change_processor_unittest.cc
+++ b/components/sync/driver/generic_change_processor_unittest.cc
@@ -9,9 +9,9 @@
 #include <utility>
 
 #include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
+#include "base/test/scoped_task_environment.h"
 #include "components/sync/base/model_type.h"
 #include "components/sync/device_info/local_device_info_provider.h"
 #include "components/sync/driver/fake_sync_client.h"
@@ -123,7 +123,9 @@
   static const ModelType kType = PREFERENCES;
 
   SyncGenericChangeProcessorTest()
-      : syncable_service_ptr_factory_(&fake_syncable_service_),
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI),
+        syncable_service_ptr_factory_(&fake_syncable_service_),
         mock_attachment_service_(nullptr),
         sync_client_(&sync_factory_) {}
 
@@ -193,7 +195,7 @@
   }
 
  private:
-  base::MessageLoopForUI loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
 
   std::unique_ptr<SyncMergeResult> sync_merge_result_;
   std::unique_ptr<base::WeakPtrFactory<SyncMergeResult>>
diff --git a/components/sync_sessions/favicon_cache_unittest.cc b/components/sync_sessions/favicon_cache_unittest.cc
index 3db330f..b39a8b3 100644
--- a/components/sync_sessions/favicon_cache_unittest.cc
+++ b/components/sync_sessions/favicon_cache_unittest.cc
@@ -5,11 +5,11 @@
 #include "components/sync_sessions/favicon_cache.h"
 
 #include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/time/time.h"
 #include "components/sync/model/attachments/attachment_id.h"
 #include "components/sync/model/attachments/attachment_service_proxy_for_test.h"
@@ -292,7 +292,7 @@
                                   int64_t last_visit_time_ms);
 
  private:
-  base::MessageLoopForUI message_loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
   FaviconCache cache_;
 
   // Our dummy ChangeProcessor used to inspect changes pushed to Sync.
@@ -302,7 +302,9 @@
 };
 
 SyncFaviconCacheTest::SyncFaviconCacheTest()
-    : cache_(nullptr, nullptr, kMaxSyncFavicons),
+    : scoped_task_environment_(
+          base::test::ScopedTaskEnvironment::MainThreadType::UI),
+      cache_(nullptr, nullptr, kMaxSyncFavicons),
       sync_processor_(new TestChangeProcessor),
       sync_processor_wrapper_(new syncer::SyncChangeProcessorWrapperForTest(
           sync_processor_.get())) {}