Update some host_resolver()->AddRules in chrome/browser.

Part 1/2.

BUG=713847

Review-Url: https://codereview.chromium.org/2847313002
Cr-Commit-Position: refs/heads/master@{#468343}
diff --git a/chrome/browser/autofill/autofill_interactive_uitest.cc b/chrome/browser/autofill/autofill_interactive_uitest.cc
index cd67195e..a2a0189 100644
--- a/chrome/browser/autofill/autofill_interactive_uitest.cc
+++ b/chrome/browser/autofill/autofill_interactive_uitest.cc
@@ -254,8 +254,9 @@
     reset_mouse = gfx::Point(reset_mouse.x() + 5, reset_mouse.y() + 5);
     ASSERT_TRUE(ui_test_utils::SendMouseMoveSync(reset_mouse));
 
+    // Ensure that |embedded_test_server()| serves both domains used below.
+    host_resolver()->AddRule("*", "127.0.0.1");
     ASSERT_TRUE(embedded_test_server()->Start());
-    InProcessBrowserTest::SetUpOnMainThread();
   }
 
   void TearDownOnMainThread() override {
@@ -1786,8 +1787,6 @@
 #endif
 IN_PROC_BROWSER_TEST_F(AutofillInteractiveIsolationTest,
                        MAYBE_SimpleCrossSiteFill) {
-  // Ensure that |embedded_test_server()| serves both domains used below.
-  host_resolver()->AddRule("*", "127.0.0.1");
 
   CreateTestProfile();
 
@@ -1833,8 +1832,6 @@
 // This test verifies that credit card (payment card list) popup works when the
 // form is inside an OOPIF.
 IN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, CrossSitePaymentForms) {
-  // Ensure that |embedded_test_server()| serves both domains used below.
-  host_resolver()->AddRule("*", "127.0.0.1");
 
   // Main frame is on a.com, iframe is on b.com.
   GURL url = embedded_test_server()->GetURL(
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_manager_browsertest.cc b/chrome/browser/chromeos/app_mode/kiosk_app_manager_browsertest.cc
index 8cb8d09..a6b51ce 100644
--- a/chrome/browser/chromeos/app_mode/kiosk_app_manager_browsertest.cc
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_manager_browsertest.cc
@@ -252,6 +252,8 @@
   void SetUpOnMainThread() override {
     InProcessBrowserTest::SetUpOnMainThread();
 
+    host_resolver()->AddRule("*", "127.0.0.1");
+
     // Start the accept thread as the sandbox host process has already been
     // spawned.
     embedded_test_server()->StartAcceptingConnections();
@@ -263,12 +265,6 @@
 
   void TearDownOnMainThread() override { settings_helper_.RestoreProvider(); }
 
-  void SetUpInProcessBrowserTestFixture() override {
-    InProcessBrowserTest::SetUpInProcessBrowserTestFixture();
-
-    host_resolver()->AddRule("*", "127.0.0.1");
-  }
-
   std::string GetAppIds() const {
     KioskAppManager::Apps apps;
     manager()->GetApps(&apps);
diff --git a/chrome/browser/chromeos/app_mode/kiosk_crash_restore_browsertest.cc b/chrome/browser/chromeos/app_mode/kiosk_crash_restore_browsertest.cc
index c6f9a59c..391cbc1 100644
--- a/chrome/browser/chromeos/app_mode/kiosk_crash_restore_browsertest.cc
+++ b/chrome/browser/chromeos/app_mode/kiosk_crash_restore_browsertest.cc
@@ -89,8 +89,6 @@
   }
 
   void SetUpInProcessBrowserTestFixture() override {
-    host_resolver()->AddRule("*", "127.0.0.1");
-
     OverrideDevicePolicy();
   }
 
@@ -115,6 +113,7 @@
   void SetUpOnMainThread() override {
     extensions::browsertest_util::CreateAndInitializeLocalCache();
 
+    host_resolver()->AddRule("*", "127.0.0.1");
     embedded_test_server()->StartAcceptingConnections();
   }
 
diff --git a/chrome/browser/chromeos/extensions/wallpaper_apitest.cc b/chrome/browser/chromeos/extensions/wallpaper_apitest.cc
index 10a6f33..3f0b0cd99 100644
--- a/chrome/browser/chromeos/extensions/wallpaper_apitest.cc
+++ b/chrome/browser/chromeos/extensions/wallpaper_apitest.cc
@@ -6,10 +6,19 @@
 #include "chromeos/cryptohome/system_salt_getter.h"
 #include "net/dns/mock_host_resolver.h"
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, Wallpaper) {
+class WallPaperApiTest : public ExtensionApiTest {
+ public:
+  ~WallPaperApiTest() override = default;
+
+  void SetUpOnMainThread() override {
+    ExtensionApiTest::SetUpOnMainThread();
+    host_resolver()->AddRule("a.com", "127.0.0.1");
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(WallPaperApiTest, Wallpaper) {
   chromeos::SystemSaltGetter::Get()->SetRawSaltForTesting(
       chromeos::SystemSaltGetter::RawSalt({1, 2, 3, 4, 5, 6, 7, 8}));
-  host_resolver()->AddRule("a.com", "127.0.0.1");
   ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionTest("wallpaper")) << message_;
 }
diff --git a/chrome/browser/chromeos/extensions/wallpaper_private_apitest.cc b/chrome/browser/chromeos/extensions/wallpaper_private_apitest.cc
index 0ea850f..8e73a51 100644
--- a/chrome/browser/chromeos/extensions/wallpaper_private_apitest.cc
+++ b/chrome/browser/chromeos/extensions/wallpaper_private_apitest.cc
@@ -6,10 +6,19 @@
 #include "chromeos/cryptohome/system_salt_getter.h"
 #include "net/dns/mock_host_resolver.h"
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, WallpaperPrivateApiTest) {
+class WallPaperPrivateApiTest : public ExtensionApiTest {
+ public:
+  ~WallPaperPrivateApiTest() override = default;
+
+  void SetUpOnMainThread() override {
+    ExtensionApiTest::SetUpOnMainThread();
+    host_resolver()->AddRule("a.com", "127.0.0.1");
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(WallPaperPrivateApiTest, WallpaperPrivateApiTest) {
   chromeos::SystemSaltGetter::Get()->SetRawSaltForTesting(
       chromeos::SystemSaltGetter::RawSalt({1, 2, 3, 4, 5, 6, 7, 8}));
-  host_resolver()->AddRule("a.com", "127.0.0.1");
   ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunComponentExtensionTest("wallpaper_manager")) << message_;
 }
diff --git a/chrome/browser/chromeos/login/login_manager_test.cc b/chrome/browser/chromeos/login/login_manager_test.cc
index ac0b973..636e0e9 100644
--- a/chrome/browser/chromeos/login/login_manager_test.cc
+++ b/chrome/browser/chromeos/login/login_manager_test.cc
@@ -116,16 +116,12 @@
   MixinBasedBrowserTest::SetUpCommandLine(command_line);
 }
 
-void LoginManagerTest::SetUpInProcessBrowserTestFixture() {
-  host_resolver()->AddRule("*", "127.0.0.1");
-  MixinBasedBrowserTest::SetUpInProcessBrowserTestFixture();
-}
-
 void LoginManagerTest::SetUpOnMainThread() {
   LoginDisplayHostImpl::DisableRestrictiveProxyCheckForTest();
 
   // Start the accept thread as the sandbox host process has already been
   // spawned.
+  host_resolver()->AddRule("*", "127.0.0.1");
   embedded_test_server()->StartAcceptingConnections();
 
   FakeGaia::AccessTokenInfo token_info;
diff --git a/chrome/browser/chromeos/login/login_manager_test.h b/chrome/browser/chromeos/login/login_manager_test.h
index 686f8fdf..027e3c0 100644
--- a/chrome/browser/chromeos/login/login_manager_test.h
+++ b/chrome/browser/chromeos/login/login_manager_test.h
@@ -35,7 +35,6 @@
   // Overridden from InProcessBrowserTest.
   void TearDownOnMainThread() override;
   void SetUpCommandLine(base::CommandLine* command_line) override;
-  void SetUpInProcessBrowserTestFixture() override;
   void SetUpOnMainThread() override;
   void SetUp() override;
 
diff --git a/chrome/browser/chromeos/login/test/oobe_base_test.cc b/chrome/browser/chromeos/login/test/oobe_base_test.cc
index 7212020..c7eed6d5 100644
--- a/chrome/browser/chromeos/login/test/oobe_base_test.cc
+++ b/chrome/browser/chromeos/login/test/oobe_base_test.cc
@@ -82,7 +82,6 @@
 }
 
 void OobeBaseTest::SetUpInProcessBrowserTestFixture() {
-  host_resolver()->AddRule("*", "127.0.0.1");
   network_portal_detector_ = new NetworkPortalDetectorTestImpl();
   network_portal_detector::InitializeForTesting(network_portal_detector_);
   network_portal_detector_->SetDefaultNetworkForTesting(
@@ -99,6 +98,7 @@
 
   // Start the accept thread as the sandbox host process has already been
   // spawned.
+  host_resolver()->AddRule("*", "127.0.0.1");
   embedded_test_server()->StartAcceptingConnections();
 
   login_screen_load_observer_.reset(new content::WindowedNotificationObserver(
diff --git a/chrome/browser/content_settings/content_settings_browsertest.cc b/chrome/browser/content_settings/content_settings_browsertest.cc
index 5c9e797..85770aee 100644
--- a/chrome/browser/content_settings/content_settings_browsertest.cc
+++ b/chrome/browser/content_settings/content_settings_browsertest.cc
@@ -278,13 +278,16 @@
   void SetUpCommandLine(base::CommandLine* cmd) override {
     cmd->AppendSwitch(switches::kEnableExperimentalWebPlatformFeatures);
   }
+  void SetUpOnMainThread() override {
+    ContentSettingsTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*", "127.0.0.1");
+  }
 };
 
 // This test verifies that if strict secure cookies is enabled, the site
 // settings accurately reflect that an attempt to create a secure cookie by an
 // insecure origin fails.
 IN_PROC_BROWSER_TEST_F(ContentSettingsStrictSecureCookiesBrowserTest, Cookies) {
-  host_resolver()->AddRule("*", "127.0.0.1");
   ASSERT_TRUE(embedded_test_server()->Start());
 
   net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
diff --git a/chrome/browser/download/download_browsertest.cc b/chrome/browser/download/download_browsertest.cc
index d5168de2..1bf11fd9 100644
--- a/chrome/browser/download/download_browsertest.cc
+++ b/chrome/browser/download/download_browsertest.cc
@@ -431,6 +431,7 @@
         BrowserThread::IO, FROM_HERE,
         base::BindOnce(&chrome_browser_net::SetUrlRequestMocksEnabled, true));
     ASSERT_TRUE(InitialSetup());
+    host_resolver()->AddRule("www.a.com", "127.0.0.1");
   }
 
   void TearDownOnMainThread() override {
@@ -2811,7 +2812,6 @@
 // This test ensures that a cross-domain download correctly sets the referrer
 // according to the referrer policy.
 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadCrossDomainReferrerPolicy) {
-  host_resolver()->AddRule("www.a.com", "127.0.0.1");
   embedded_test_server()->RegisterRequestHandler(
       base::Bind(&ServerRedirectRequestHandler));
   embedded_test_server()->RegisterRequestHandler(
diff --git a/chrome/browser/extensions/app_background_page_apitest.cc b/chrome/browser/extensions/app_background_page_apitest.cc
index b6a70ee..91ea277e 100644
--- a/chrome/browser/extensions/app_background_page_apitest.cc
+++ b/chrome/browser/extensions/app_background_page_apitest.cc
@@ -53,6 +53,12 @@
     command_line->AppendSwitch(extensions::switches::kAllowHTTPBackgroundPage);
   }
 
+  void SetUpOnMainThread() override {
+    ExtensionApiTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*", "127.0.0.1");
+    ASSERT_TRUE(StartEmbeddedTestServer());
+  }
+
   bool CreateApp(const std::string& app_manifest,
                  base::FilePath* app_dir) {
     base::ThreadRestrictions::ScopedAllowIO allow_io;
@@ -154,9 +160,6 @@
 #endif
 
 IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, MAYBE_Basic) {
-  host_resolver()->AddRule("a.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
-
   std::string app_manifest = base::StringPrintf(
       "{"
       "  \"name\": \"App\","
@@ -187,9 +190,6 @@
 
 // Crashy, http://crbug.com/69215.
 IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, DISABLED_LacksPermission) {
-  host_resolver()->AddRule("a.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
-
   std::string app_manifest = base::StringPrintf(
       "{"
       "  \"name\": \"App\","
@@ -215,9 +215,6 @@
 }
 
 IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, ManifestBackgroundPage) {
-  host_resolver()->AddRule("a.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
-
   std::string app_manifest = base::StringPrintf(
       "{"
       "  \"name\": \"App\","
@@ -267,10 +264,6 @@
   background_deleted_tracker.ListenFor(
       chrome::NOTIFICATION_BACKGROUND_CONTENTS_DELETED,
       content::Source<Profile>(browser()->profile()));
-
-  host_resolver()->AddRule("a.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
-
   std::string app_manifest = base::StringPrintf(
       "{"
       "  \"name\": \"App\","
@@ -312,9 +305,6 @@
 }
 
 IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, NoJsManifestBackgroundPage) {
-  host_resolver()->AddRule("a.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
-
   std::string app_manifest = base::StringPrintf(
       "{"
       "  \"name\": \"App\","
@@ -352,9 +342,6 @@
 }
 
 IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, OpenTwoBackgroundPages) {
-  host_resolver()->AddRule("a.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
-
   std::string app_manifest = base::StringPrintf(
       "{"
       "  \"name\": \"App\","
@@ -381,9 +368,6 @@
 }
 
 IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, OpenTwoPagesWithManifest) {
-  host_resolver()->AddRule("a.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
-
   std::string app_manifest = base::StringPrintf(
       "{"
       "  \"name\": \"App\","
@@ -416,9 +400,6 @@
 
 // Times out occasionally -- see crbug.com/108493
 IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, DISABLED_OpenPopupFromBGPage) {
-  host_resolver()->AddRule("a.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
-
   std::string app_manifest = base::StringPrintf(
       "{"
       "  \"name\": \"App\","
@@ -446,9 +427,6 @@
 }
 
 IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, DISABLED_OpenThenClose) {
-  host_resolver()->AddRule("a.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
-
   std::string app_manifest = base::StringPrintf(
       "{"
       "  \"name\": \"App\","
@@ -492,9 +470,6 @@
 }
 
 IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, UnloadExtensionWhileHidden) {
-  host_resolver()->AddRule("a.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
-
   std::string app_manifest = base::StringPrintf(
       "{"
       "  \"name\": \"App\","
diff --git a/chrome/browser/extensions/app_process_apitest.cc b/chrome/browser/extensions/app_process_apitest.cc
index a08f254..a5fab6b 100644
--- a/chrome/browser/extensions/app_process_apitest.cc
+++ b/chrome/browser/extensions/app_process_apitest.cc
@@ -64,6 +64,12 @@
         extensions::switches::kAllowHTTPBackgroundPage);
   }
 
+  void SetUpOnMainThread() override {
+    ExtensionApiTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*", "127.0.0.1");
+    ASSERT_TRUE(StartEmbeddedTestServer());
+  }
+
   // Helper function to test that independent tabs of the named app are loaded
   // into separate processes.
   void TestAppInstancesHelper(const std::string& app_name) {
@@ -72,9 +78,6 @@
     extensions::ProcessMap* process_map =
         extensions::ProcessMap::Get(browser()->profile());
 
-    host_resolver()->AddRule("*", "127.0.0.1");
-    ASSERT_TRUE(embedded_test_server()->Start());
-
     ASSERT_TRUE(LoadExtension(
         test_data_dir_.AppendASCII(app_name)));
     const Extension* extension = GetSingleLoadedExtension();
@@ -149,9 +152,6 @@
   extensions::ProcessMap* process_map =
       extensions::ProcessMap::Get(browser()->profile());
 
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(embedded_test_server()->Start());
-
   ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app_process")));
 
   LOG(INFO) << "Loaded extension.";
@@ -298,8 +298,6 @@
   extensions::ProcessMap* process_map =
       extensions::ProcessMap::Get(browser()->profile());
 
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(embedded_test_server()->Start());
   GURL base_url = GetTestBaseURL("app_process");
 
   // Load an app as a bookmark app.
@@ -380,9 +378,6 @@
 // See http://crbug.com/61757
 // Flaky.  http://crbug.com/341898
 IN_PROC_BROWSER_TEST_F(AppApiTest, DISABLED_AppProcessRedirectBack) {
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(embedded_test_server()->Start());
-
   ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app_process")));
 
   // Open two tabs in the app.
@@ -425,9 +420,6 @@
   extensions::ProcessMap* process_map =
       extensions::ProcessMap::Get(browser()->profile());
 
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(embedded_test_server()->Start());
-
   // The app under test acts on URLs whose host is "localhost",
   // so the URLs we navigate to must have host "localhost".
   GURL base_url = GetTestBaseURL("app_process");
@@ -472,9 +464,6 @@
   extensions::ProcessMap* process_map =
       extensions::ProcessMap::Get(browser()->profile());
 
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(embedded_test_server()->Start());
-
   // The app under test acts on URLs whose host is "localhost",
   // so the URLs we navigate to must have host "localhost".
   GURL base_url = GetTestBaseURL("app_process");
@@ -537,9 +526,6 @@
   extensions::ProcessMap* process_map =
       extensions::ProcessMap::Get(browser()->profile());
 
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(embedded_test_server()->Start());
-
   // The app under test acts on URLs whose host is "localhost",
   // so the URLs we navigate to must have host "localhost".
   GURL base_url = GetTestBaseURL("app_process");
@@ -602,9 +588,6 @@
   extensions::ProcessMap* process_map =
       extensions::ProcessMap::Get(browser()->profile());
 
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(embedded_test_server()->Start());
-
   GURL base_url = GetTestBaseURL("app_process");
 
   // Load app and start URL (not in the app).
@@ -638,9 +621,6 @@
 #define MAYBE_OpenAppFromIframe OpenAppFromIframe
 #endif
 IN_PROC_BROWSER_TEST_F(BlockedAppApiTest, MAYBE_OpenAppFromIframe) {
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(embedded_test_server()->Start());
-
   // Load app and start URL (not in the app).
   const Extension* app =
       LoadExtension(test_data_dir_.AppendASCII("app_process"));
@@ -666,9 +646,6 @@
 // that's not in the app's extent but that server redirects to it, we still end
 // up with an app process. See http://crbug.com/99349 for more details.
 IN_PROC_BROWSER_TEST_F(AppApiTest, ServerRedirectToAppFromExtension) {
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
-
   LoadExtension(test_data_dir_.AppendASCII("app_process"));
   const Extension* launcher =
       LoadExtension(test_data_dir_.AppendASCII("app_launcher"));
@@ -702,9 +679,6 @@
 // that's not in the app's extent but that client redirects to it, we still end
 // up with an app process.
 IN_PROC_BROWSER_TEST_F(AppApiTest, ClientRedirectToAppFromExtension) {
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
-
   LoadExtension(test_data_dir_.AppendASCII("app_process"));
   const Extension* launcher =
       LoadExtension(test_data_dir_.AppendASCII("app_launcher"));
@@ -745,9 +719,6 @@
   extensions::ProcessMap* process_map =
       extensions::ProcessMap::Get(browser()->profile());
 
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(embedded_test_server()->Start());
-
   GURL base_url = GetTestBaseURL("app_process");
 
   // Load app and start URL (in the app).
@@ -787,9 +758,6 @@
   extensions::ProcessMap* process_map =
       extensions::ProcessMap::Get(browser()->profile());
 
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(embedded_test_server()->Start());
-
   ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app_process")));
 
   GURL base_url = GetTestBaseURL("app_process");
@@ -829,9 +797,6 @@
   extensions::ProcessMap* process_map =
       extensions::ProcessMap::Get(browser()->profile());
 
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(embedded_test_server()->Start());
-
   GURL base_url = GetTestBaseURL("app_process");
 
   // Load app and start URL (in the app).
diff --git a/chrome/browser/extensions/chrome_app_api_browsertest.cc b/chrome/browser/extensions/chrome_app_api_browsertest.cc
index 8bbc52e..2c23404 100644
--- a/chrome/browser/extensions/chrome_app_api_browsertest.cc
+++ b/chrome/browser/extensions/chrome_app_api_browsertest.cc
@@ -26,6 +26,12 @@
 using extensions::Extension;
 
 class ChromeAppAPITest : public ExtensionBrowserTest {
+  void SetUpOnMainThread() override {
+    ExtensionBrowserTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*", "127.0.0.1");
+    ASSERT_TRUE(embedded_test_server()->Start());
+  }
+
  protected:
   bool IsAppInstalledInMainFrame() {
     return IsAppInstalledInFrame(
@@ -89,8 +95,6 @@
 };
 
 IN_PROC_BROWSER_TEST_F(ChromeAppAPITest, IsInstalled) {
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(embedded_test_server()->Start());
   GURL app_url =
       embedded_test_server()->GetURL("app.com", "/extensions/test_file.html");
   GURL non_app_url = embedded_test_server()->GetURL(
@@ -168,8 +172,6 @@
 }
 
 IN_PROC_BROWSER_TEST_F(ChromeAppAPITest, InstallAndRunningState) {
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(embedded_test_server()->Start());
   GURL app_url = embedded_test_server()->GetURL(
       "app.com", "/extensions/get_app_details_for_frame.html");
   GURL non_app_url = embedded_test_server()->GetURL(
@@ -225,8 +227,6 @@
 }
 
 IN_PROC_BROWSER_TEST_F(ChromeAppAPITest, InstallAndRunningStateFrame) {
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(embedded_test_server()->Start());
   GURL app_url = embedded_test_server()->GetURL(
       "app.com", "/extensions/get_app_details_for_frame_reversed.html");
 
diff --git a/chrome/browser/extensions/content_capabilities_browsertest.cc b/chrome/browser/extensions/content_capabilities_browsertest.cc
index c0149e2..9ec40f4 100644
--- a/chrome/browser/extensions/content_capabilities_browsertest.cc
+++ b/chrome/browser/extensions/content_capabilities_browsertest.cc
@@ -43,6 +43,16 @@
             base::MakeAbsoluteFilePath(test_extension_dir_.UnpackedPath())));
   }
 
+  void SetUpOnMainThread() override {
+    ExtensionApiTest::SetUpOnMainThread();
+    base::FilePath test_data;
+    EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data));
+    embedded_test_server()->ServeFilesFromDirectory(
+        test_data.AppendASCII("extensions/content_capabilities"));
+    ASSERT_TRUE(embedded_test_server()->Start());
+    host_resolver()->AddRule("*", embedded_test_server()->base_url().host());
+  }
+
   // Builds an extension manifest with the given content_capabilities matches
   // and permissions. The extension always has the same (whitelisted) ID.
   scoped_refptr<const Extension> LoadExtensionWithCapabilities(
@@ -95,15 +105,6 @@
         .ReplaceComponents(replacements);
   }
 
-  void InitializeTestServer() {
-    base::FilePath test_data;
-    EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data));
-    embedded_test_server()->ServeFilesFromDirectory(
-        test_data.AppendASCII("extensions/content_capabilities"));
-    ASSERT_TRUE(embedded_test_server()->Start());
-    host_resolver()->AddRule("*", embedded_test_server()->base_url().host());
-  }
-
   // Run some script in the context of the given origin and in the presence of
   // the given extension. This is used to wrap calls into the JS test functions
   // defined by
@@ -156,7 +157,6 @@
 };
 
 IN_PROC_BROWSER_TEST_F(ContentCapabilitiesTest, NoCapabilities) {
-  InitializeTestServer();
   scoped_refptr<const Extension> extension = LoadExtensionWithCapabilities(
       MakeJSONList("http://foo.example.com/*"), MakeJSONList());
   EXPECT_FALSE(
@@ -170,7 +170,6 @@
 }
 
 IN_PROC_BROWSER_TEST_F(ContentCapabilitiesTest, ClipboardRead) {
-  InitializeTestServer();
   scoped_refptr<const Extension> extension = LoadExtensionWithCapabilities(
       MakeJSONList("http://foo.example.com/*"), MakeJSONList("clipboardRead"));
   EXPECT_TRUE(
@@ -190,7 +189,6 @@
 }
 
 IN_PROC_BROWSER_TEST_F(ContentCapabilitiesTest, ClipboardWrite) {
-  InitializeTestServer();
   scoped_refptr<const Extension> extension = LoadExtensionWithCapabilities(
       MakeJSONList("http://foo.example.com/*"), MakeJSONList("clipboardWrite"));
   EXPECT_TRUE(
@@ -211,7 +209,6 @@
 }
 
 IN_PROC_BROWSER_TEST_F(ContentCapabilitiesTest, ClipboardReadWrite) {
-  InitializeTestServer();
   scoped_refptr<const Extension> extension = LoadExtensionWithCapabilities(
       MakeJSONList("http://foo.example.com/*"),
       MakeJSONList("clipboardRead", "clipboardWrite"));
@@ -228,7 +225,6 @@
 }
 
 IN_PROC_BROWSER_TEST_F(ContentCapabilitiesTest, UnlimitedStorage) {
-  InitializeTestServer();
   scoped_refptr<const Extension> extension =
       LoadExtensionWithCapabilities(MakeJSONList("http://foo.example.com/*"),
                                     MakeJSONList("unlimitedStorage"));
@@ -239,7 +235,6 @@
 }
 
 IN_PROC_BROWSER_TEST_F(ContentCapabilitiesTest, WebUnlimitedStorageIsIsolated) {
-  InitializeTestServer();
   // This extension grants unlimited storage to bar.example.com but does not
   // have unlimitedStorage itself.
   scoped_refptr<const Extension> extension = LoadExtensionWithCapabilities(
@@ -253,7 +248,6 @@
 
 IN_PROC_BROWSER_TEST_F(ContentCapabilitiesTest,
                        ExtensionUnlimitedStorageIsIsolated) {
-  InitializeTestServer();
   // This extension has unlimitedStorage but doesn't grant it to foo.example.com
   scoped_refptr<const Extension> extension = LoadExtensionWithCapabilities(
       MakeJSONList("http://foo.example.com/*"), MakeJSONList("clipboardRead"),
diff --git a/chrome/browser/extensions/content_script_apitest.cc b/chrome/browser/extensions/content_script_apitest.cc
index 839c2f97..6976b62a 100644
--- a/chrome/browser/extensions/content_script_apitest.cc
+++ b/chrome/browser/extensions/content_script_apitest.cc
@@ -251,6 +251,11 @@
             ? "1"
             : "0");
   }
+
+  void SetUpOnMainThread() override {
+    ExtensionApiTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*", "127.0.0.1");
+  }
 };
 
 IN_PROC_BROWSER_TEST_P(ContentScriptApiTest, ContentScriptAllFrames) {
@@ -319,8 +324,6 @@
 
 IN_PROC_BROWSER_TEST_P(ContentScriptApiTest,
                        ContentScriptIgnoreHostPermissions) {
-  host_resolver()->AddRule("a.com", "127.0.0.1");
-  host_resolver()->AddRule("b.com", "127.0.0.1");
   ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionTest(
       "content_scripts/dont_match_host_permissions")) << message_;
@@ -335,7 +338,6 @@
 // crbug.com/126257 -- content scripts should not get injected into other
 // extensions.
 IN_PROC_BROWSER_TEST_P(ContentScriptApiTest, ContentScriptOtherExtensions) {
-  host_resolver()->AddRule("a.com", "127.0.0.1");
   ASSERT_TRUE(StartEmbeddedTestServer());
   // First, load extension that sets up content script.
   ASSERT_TRUE(RunExtensionTest("content_scripts/other_extensions/injector"))
@@ -361,11 +363,15 @@
         ::switches::kAppsGalleryURL,
         base::StringPrintf("http://%s", kWebstoreDomain));
   }
+
+  void SetUpOnMainThread() override {
+    ExtensionApiTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*", "127.0.0.1");
+  }
 };
 
 IN_PROC_BROWSER_TEST_P(ContentScriptApiTest,
                        ContentScriptDuplicateScriptInjection) {
-  host_resolver()->AddRule("maps.google.com", "127.0.0.1");
   ASSERT_TRUE(StartEmbeddedTestServer());
 
   GURL url(
@@ -403,7 +409,6 @@
 IN_PROC_BROWSER_TEST_F(ContentScriptCssInjectionTest,
                        ContentScriptInjectsStyles) {
   ASSERT_TRUE(StartEmbeddedTestServer());
-  host_resolver()->AddRule(kWebstoreDomain, "127.0.0.1");
 
   ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("content_scripts")
                                           .AppendASCII("css_injection")));
@@ -500,7 +505,6 @@
                        MAYBE_ContentScriptPermissionsApi) {
   extensions::PermissionsRequestFunction::SetIgnoreUserGestureForTests(true);
   extensions::PermissionsRequestFunction::SetAutoConfirmForTests(true);
-  host_resolver()->AddRule("*.com", "127.0.0.1");
   ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionTest("content_scripts/permissions")) << message_;
 }
@@ -512,7 +516,6 @@
     ExtensionManagementPolicyUpdater pref(&policy_provider_);
     pref.AddRuntimeBlockedHost("*", "*://example.com/*");
   }
-  host_resolver()->AddRule("*.com", "127.0.0.1");
   ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionTest("content_scripts/policy")) << message_;
 }
@@ -692,7 +695,6 @@
 
 IN_PROC_BROWSER_TEST_P(ContentScriptApiTest,
                        DontInjectContentScriptsInBackgroundPages) {
-  host_resolver()->AddRule("a.com", "127.0.0.1");
   ASSERT_TRUE(StartEmbeddedTestServer());
   // Load two extensions, one with an iframe to a.com in its background page,
   // the other, a content script for a.com. The latter should never be able to
diff --git a/chrome/browser/extensions/cross_origin_xhr_apitest.cc b/chrome/browser/extensions/cross_origin_xhr_apitest.cc
index 2514c7be..5a65e96 100644
--- a/chrome/browser/extensions/cross_origin_xhr_apitest.cc
+++ b/chrome/browser/extensions/cross_origin_xhr_apitest.cc
@@ -8,31 +8,34 @@
 const base::FilePath::CharType kFtpDocRoot[] =
     FILE_PATH_LITERAL("chrome/test/data");
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, CrossOriginXHRBackgroundPage) {
-  host_resolver()->AddRule("*.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
+class CrossOriginXHR : public ExtensionApiTest {
+ public:
+  void SetUpOnMainThread() override {
+    ExtensionApiTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*.com", "127.0.0.1");
+    ASSERT_TRUE(StartEmbeddedTestServer());
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(CrossOriginXHR, BackgroundPage) {
   ASSERT_TRUE(StartFTPServer(base::FilePath(kFtpDocRoot)));
   ASSERT_TRUE(RunExtensionTest("cross_origin_xhr/background_page")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, CrossOriginXHRAllURLs) {
-  host_resolver()->AddRule("*.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
+IN_PROC_BROWSER_TEST_F(CrossOriginXHR, AllURLs) {
   ASSERT_TRUE(RunExtensionTest("cross_origin_xhr/all_urls")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, CrossOriginXHRContentScript) {
-  host_resolver()->AddRule("*.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
+IN_PROC_BROWSER_TEST_F(CrossOriginXHR, ContentScript) {
   ASSERT_TRUE(StartFTPServer(base::FilePath(kFtpDocRoot)));
   ASSERT_TRUE(RunExtensionTest("cross_origin_xhr/content_script")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, CrossOriginXHRFileAccess) {
+IN_PROC_BROWSER_TEST_F(CrossOriginXHR, FileAccess) {
   ASSERT_TRUE(RunExtensionTest("cross_origin_xhr/file_access")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, CrossOriginXHRNoFileAccess) {
+IN_PROC_BROWSER_TEST_F(CrossOriginXHR, NoFileAccess) {
   ASSERT_TRUE(RunExtensionTestNoFileAccess(
       "cross_origin_xhr/no_file_access")) << message_;
 }
diff --git a/chrome/browser/extensions/execute_script_apitest.cc b/chrome/browser/extensions/execute_script_apitest.cc
index 91d19df..ca31131 100644
--- a/chrome/browser/extensions/execute_script_apitest.cc
+++ b/chrome/browser/extensions/execute_script_apitest.cc
@@ -9,38 +9,31 @@
 
 class ExecuteScriptApiTest : public ExtensionApiTest {
  protected:
-  void SetupDelayedHostResolver() {
+  void SetUpOnMainThread() override {
+    ExtensionApiTest::SetUpOnMainThread();
     // We need a.com to be a little bit slow to trigger a race condition.
     host_resolver()->AddRuleWithLatency("a.com", "127.0.0.1", 500);
-    host_resolver()->AddRule("b.com", "127.0.0.1");
-    host_resolver()->AddRule("c.com", "127.0.0.1");
+    host_resolver()->AddRule("*", "127.0.0.1");
+    ASSERT_TRUE(StartEmbeddedTestServer());
   }
 };
 
 // If failing, mark disabled and update http://crbug.com/92105.
 IN_PROC_BROWSER_TEST_F(ExecuteScriptApiTest, ExecuteScriptBasic) {
-  SetupDelayedHostResolver();
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionTest("executescript/basic")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(ExecuteScriptApiTest, ExecuteScriptBadEncoding) {
-  SetupDelayedHostResolver();
-  ASSERT_TRUE(StartEmbeddedTestServer());
   // data/extensions/api_test/../bad = data/extensions/bad
   ASSERT_TRUE(RunExtensionTest("../bad")) << message_;
 }
 
 // If failing, mark disabled and update http://crbug.com/92105.
 IN_PROC_BROWSER_TEST_F(ExecuteScriptApiTest, ExecuteScriptInFrame) {
-  SetupDelayedHostResolver();
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionTest("executescript/in_frame")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(ExecuteScriptApiTest, ExecuteScriptByFrameId) {
-  SetupDelayedHostResolver();
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionTest("executescript/frame_id")) << message_;
 }
 
@@ -53,21 +46,16 @@
 #endif  // defined(OS_WIN)
 
 IN_PROC_BROWSER_TEST_F(ExecuteScriptApiTest, MAYBE_ExecuteScriptPermissions) {
-  SetupDelayedHostResolver();
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionTest("executescript/permissions")) << message_;
 }
 
 // If failing, mark disabled and update http://crbug.com/84760.
 IN_PROC_BROWSER_TEST_F(ExecuteScriptApiTest, ExecuteScriptFileAfterClose) {
-  host_resolver()->AddRule("b.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionTest("executescript/file_after_close")) << message_;
 }
 
 // If crashing, mark disabled and update http://crbug.com/67774.
 IN_PROC_BROWSER_TEST_F(ExecuteScriptApiTest, ExecuteScriptFragmentNavigation) {
-  ASSERT_TRUE(StartEmbeddedTestServer());
   const char extension_name[] = "executescript/fragment";
   ASSERT_TRUE(RunExtensionTest(extension_name)) << message_;
 }
@@ -80,62 +68,41 @@
 #endif  // defined(OS_WIN)
 IN_PROC_BROWSER_TEST_F(ExecuteScriptApiTest,
                        MAYBE_NavigationRaceExecuteScript) {
-  host_resolver()->AddRule("a.com", "127.0.0.1");
-  host_resolver()->AddRule("b.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionSubtest("executescript/navigation_race",
                                   "execute_script.html")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(ExecuteScriptApiTest, NavigationRaceJavaScriptURL) {
-  host_resolver()->AddRule("a.com", "127.0.0.1");
-  host_resolver()->AddRule("b.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionSubtest("executescript/navigation_race",
                                   "javascript_url.html")) << message_;
 }
 
 // If failing, mark disabled and update http://crbug.com/92105.
 IN_PROC_BROWSER_TEST_F(ExecuteScriptApiTest, ExecuteScriptFrameAfterLoad) {
-  SetupDelayedHostResolver();
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionTest("executescript/frame_after_load")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(ExecuteScriptApiTest, FrameWithHttp204) {
-  host_resolver()->AddRule("b.com", "127.0.0.1");
-  host_resolver()->AddRule("c.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionTest("executescript/http204")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(ExecuteScriptApiTest, ExecuteScriptRunAt) {
-  SetupDelayedHostResolver();
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionTest("executescript/run_at")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(ExecuteScriptApiTest, ExecuteScriptCallback) {
-  SetupDelayedHostResolver();
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionTest("executescript/callback")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(ExecuteScriptApiTest, UserGesture) {
-  SetupDelayedHostResolver();
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionTest("executescript/user_gesture")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(ExecuteScriptApiTest, InjectIntoSubframesOnLoad) {
-  SetupDelayedHostResolver();
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionTest("executescript/subframes_on_load")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(ExecuteScriptApiTest, RemovedFrames) {
-  SetupDelayedHostResolver();
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionTest("executescript/removed_frames")) << message_;
 }
 
@@ -149,7 +116,6 @@
  protected:
   // The test extension selects the sub test based on the host name.
   bool RunSubtest(const std::string& test_host) {
-    host_resolver()->AddRule(test_host, "127.0.0.1");
     return RunExtensionSubtest(
         "executescript/destructive",
         "test.html?" + test_host +
@@ -160,55 +126,46 @@
 
 // Removes the frame as soon as the content script is executed.
 IN_PROC_BROWSER_TEST_P(DestructiveScriptTest, SynchronousRemoval) {
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunSubtest("synchronous")) << message_;
 }
 
 // Removes the frame at the frame's first scheduled microtask.
 IN_PROC_BROWSER_TEST_P(DestructiveScriptTest, MicrotaskRemoval) {
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunSubtest("microtask")) << message_;
 }
 
 // Removes the frame at the frame's first scheduled macrotask.
 IN_PROC_BROWSER_TEST_P(DestructiveScriptTest, MacrotaskRemoval) {
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunSubtest("macrotask")) << message_;
 }
 
 // Removes the frame at the first DOMNodeInserted event.
 IN_PROC_BROWSER_TEST_P(DestructiveScriptTest, DOMNodeInserted1) {
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunSubtest("domnodeinserted1")) << message_;
 }
 
 // Removes the frame at the second DOMNodeInserted event.
 IN_PROC_BROWSER_TEST_P(DestructiveScriptTest, DOMNodeInserted2) {
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunSubtest("domnodeinserted2")) << message_;
 }
 
 // Removes the frame at the third DOMNodeInserted event.
 IN_PROC_BROWSER_TEST_P(DestructiveScriptTest, DOMNodeInserted3) {
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunSubtest("domnodeinserted3")) << message_;
 }
 
 // Removes the frame at the first DOMSubtreeModified event.
 IN_PROC_BROWSER_TEST_P(DestructiveScriptTest, DOMSubtreeModified1) {
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunSubtest("domsubtreemodified1")) << message_;
 }
 
 // Removes the frame at the second DOMSubtreeModified event.
 IN_PROC_BROWSER_TEST_P(DestructiveScriptTest, DOMSubtreeModified2) {
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunSubtest("domsubtreemodified2")) << message_;
 }
 
 // Removes the frame at the third DOMSubtreeModified event.
 IN_PROC_BROWSER_TEST_P(DestructiveScriptTest, DOMSubtreeModified3) {
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunSubtest("domsubtreemodified3")) << message_;
 }
 
diff --git a/chrome/browser/extensions/extension_dom_clipboard_apitest.cc b/chrome/browser/extensions/extension_dom_clipboard_apitest.cc
index f48ce69..02706bd 100644
--- a/chrome/browser/extensions/extension_dom_clipboard_apitest.cc
+++ b/chrome/browser/extensions/extension_dom_clipboard_apitest.cc
@@ -17,6 +17,11 @@
 
 class ClipboardApiTest : public ExtensionApiTest {
  public:
+  void SetUpOnMainThread() override {
+    ExtensionApiTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*", "127.0.0.1");
+  }
+
   bool LoadHostedApp(const std::string& app_name,
                      const std::string& launch_page);
   bool ExecuteCopyInSelectedTab();
@@ -29,8 +34,6 @@
 
 bool ClipboardApiTest::LoadHostedApp(const std::string& app_name,
                                      const std::string& launch_page) {
-  host_resolver()->AddRule("*", "127.0.0.1");
-
   if (!StartEmbeddedTestServer()) {
     message_ = "Failed to start test server.";
     return false;
diff --git a/chrome/browser/extensions/extension_incognito_apitest.cc b/chrome/browser/extensions/extension_incognito_apitest.cc
index 8721f78..225a2251 100644
--- a/chrome/browser/extensions/extension_incognito_apitest.cc
+++ b/chrome/browser/extensions/extension_incognito_apitest.cc
@@ -22,9 +22,16 @@
 using content::WebContents;
 using extensions::ResultCatcher;
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, IncognitoNoScript) {
-  ASSERT_TRUE(StartEmbeddedTestServer());
+class IncognitoApiTest : public ExtensionApiTest {
+ public:
+  void SetUpOnMainThread() override {
+    ExtensionApiTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*", "127.0.0.1");
+    ASSERT_TRUE(StartEmbeddedTestServer());
+  }
+};
 
+IN_PROC_BROWSER_TEST_F(IncognitoApiTest, IncognitoNoScript) {
   // Loads a simple extension which attempts to change the title of every page
   // that loads to "modified".
   ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("incognito")
@@ -53,10 +60,7 @@
 #define MAYBE_IncognitoYesScript IncognitoYesScript
 #endif
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_IncognitoYesScript) {
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
-
+IN_PROC_BROWSER_TEST_F(IncognitoApiTest, MAYBE_IncognitoYesScript) {
   // Load a dummy extension. This just tests that we don't regress a
   // crash fix when multiple incognito- and non-incognito-enabled extensions
   // are mixed.
@@ -91,7 +95,7 @@
 // Tests that an extension which is enabled for incognito mode doesn't
 // accidentially create and incognito profile.
 // Test disabled due to http://crbug.com/89054.
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_DontCreateIncognitoProfile) {
+IN_PROC_BROWSER_TEST_F(IncognitoApiTest, DISABLED_DontCreateIncognitoProfile) {
   ASSERT_FALSE(browser()->profile()->HasOffTheRecordProfile());
   ASSERT_TRUE(RunExtensionTestIncognito(
       "incognito/dont_create_profile")) << message_;
@@ -100,13 +104,10 @@
 
 #if defined(OS_WIN) || defined(OS_MACOSX)
 // http://crbug.com/120484
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_Incognito) {
+IN_PROC_BROWSER_TEST_F(IncognitoApiTest, DISABLED_Incognito) {
 #else
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, Incognito) {
+IN_PROC_BROWSER_TEST_F(IncognitoApiTest, Incognito) {
 #endif
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
-
   ResultCatcher catcher;
 
   // Open incognito window and navigate to test page.
@@ -123,10 +124,7 @@
 // Tests that the APIs in an incognito-enabled split-mode extension work
 // properly.
 // http://crbug.com/120484
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_IncognitoSplitMode) {
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
-
+IN_PROC_BROWSER_TEST_F(IncognitoApiTest, DISABLED_IncognitoSplitMode) {
   // We need 2 ResultCatchers because we'll be running the same test in both
   // regular and incognito mode.
   ResultCatcher catcher;
@@ -159,13 +157,10 @@
 // events or callbacks.
 #if defined(OS_WIN)
 // http://crbug.com/120484
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_IncognitoDisabled) {
+IN_PROC_BROWSER_TEST_F(IncognitoApiTest, DISABLED_IncognitoDisabled) {
 #else
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, IncognitoDisabled) {
+IN_PROC_BROWSER_TEST_F(IncognitoApiTest, IncognitoDisabled) {
 #endif
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
-
   ResultCatcher catcher;
   ExtensionTestMessageListener listener("createIncognitoTab", true);
 
@@ -185,10 +180,7 @@
 
 // Test that opening a popup from an incognito browser window works properly.
 // http://crbug.com/180759.
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_IncognitoPopup) {
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
-
+IN_PROC_BROWSER_TEST_F(IncognitoApiTest, DISABLED_IncognitoPopup) {
   ResultCatcher catcher;
 
   ASSERT_TRUE(LoadExtensionIncognito(test_data_dir_
diff --git a/chrome/browser/extensions/extension_javascript_url_apitest.cc b/chrome/browser/extensions/extension_javascript_url_apitest.cc
index 358f550a..bac248f 100644
--- a/chrome/browser/extensions/extension_javascript_url_apitest.cc
+++ b/chrome/browser/extensions/extension_javascript_url_apitest.cc
@@ -5,18 +5,20 @@
 #include "chrome/browser/extensions/extension_apitest.h"
 #include "net/dns/mock_host_resolver.h"
 
-// If crashing, mark disabled and update http://crbug.com/63589.
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, JavaScriptURLPermissions) {
-  host_resolver()->AddRule("a.com", "127.0.0.1");
-  host_resolver()->AddRule("b.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
+class JavscriptApiTest : public ExtensionApiTest {
+ public:
+  void SetUpOnMainThread() override {
+    ExtensionApiTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*", "127.0.0.1");
+    ASSERT_TRUE(StartEmbeddedTestServer());
+  }
+};
 
+// If crashing, mark disabled and update http://crbug.com/63589.
+IN_PROC_BROWSER_TEST_F(JavscriptApiTest, JavaScriptURLPermissions) {
   ASSERT_TRUE(RunExtensionTest("tabs/javascript_url_permissions")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, JavasScriptEncodedURL) {
-  host_resolver()->AddRule("a.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
-
+IN_PROC_BROWSER_TEST_F(JavscriptApiTest, JavasScriptEncodedURL) {
   ASSERT_TRUE(RunExtensionTest("tabs/javascript_url_encoded")) << message_;
 }
diff --git a/chrome/browser/extensions/extension_messages_apitest.cc b/chrome/browser/extensions/extension_messages_apitest.cc
index 0842f9d..0978509e 100644
--- a/chrome/browser/extensions/extension_messages_apitest.cc
+++ b/chrome/browser/extensions/extension_messages_apitest.cc
@@ -124,6 +124,15 @@
   content::NotificationRegistrar registrar_;
 };
 
+class MessagingApiTest : public ExtensionApiTest {
+ public:
+  void SetUpOnMainThread() override {
+    ExtensionApiTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*", "127.0.0.1");
+    ASSERT_TRUE(StartEmbeddedTestServer());
+  }
+};
+
 // Tests that message passing between extensions and content scripts works.
 #if defined(MEMORY_SANITIZER) || defined(OS_MACOSX)
 // https://crbug.com/582185 - flakily times out on Linux/CrOS MSAN
@@ -132,13 +141,11 @@
 #else
 #define MAYBE_Messaging Messaging
 #endif
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_Messaging) {
-  ASSERT_TRUE(StartEmbeddedTestServer());
+IN_PROC_BROWSER_TEST_F(MessagingApiTest, MAYBE_Messaging) {
   ASSERT_TRUE(RunExtensionTest("messaging/connect")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MessagingCrash) {
-  ASSERT_TRUE(StartEmbeddedTestServer());
+IN_PROC_BROWSER_TEST_F(MessagingApiTest, MessagingCrash) {
   ExtensionTestMessageListener ready_to_crash("ready_to_crash", false);
   ASSERT_TRUE(LoadExtension(
           test_data_dir_.AppendASCII("messaging/connect_crash")));
@@ -154,7 +161,7 @@
 }
 
 // Tests that message passing from one extension to another works.
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MessagingExternal) {
+IN_PROC_BROWSER_TEST_F(MessagingApiTest, MessagingExternal) {
   ASSERT_TRUE(LoadExtension(
       test_data_dir_.AppendASCII("..").AppendASCII("good")
                     .AppendASCII("Extensions")
@@ -166,27 +173,26 @@
 
 // Tests that a content script can exchange messages with a tab even if there is
 // no background page.
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MessagingNoBackground) {
-  ASSERT_TRUE(StartEmbeddedTestServer());
+IN_PROC_BROWSER_TEST_F(MessagingApiTest, MessagingNoBackground) {
   ASSERT_TRUE(RunExtensionSubtest("messaging/connect_nobackground",
                                   "page_in_main_frame.html")) << message_;
 }
 
 // Tests that messages with event_urls are only passed to extensions with
 // appropriate permissions.
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MessagingEventURL) {
+IN_PROC_BROWSER_TEST_F(MessagingApiTest, MessagingEventURL) {
   MessageSender sender;
   ASSERT_TRUE(RunExtensionTest("messaging/event_url")) << message_;
 }
 
 // Tests that messages cannot be received from the same frame.
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MessagingBackgroundOnly) {
+IN_PROC_BROWSER_TEST_F(MessagingApiTest, MessagingBackgroundOnly) {
   ASSERT_TRUE(RunExtensionTest("messaging/background_only")) << message_;
 }
 
 // Tests whether an extension in an interstitial page can send messages to the
 // background page.
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MessagingInterstitial) {
+IN_PROC_BROWSER_TEST_F(MessagingApiTest, MessagingInterstitial) {
   net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
   https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
   ASSERT_TRUE(https_server.Start());
@@ -206,7 +212,7 @@
 // but not with externally_connectable set in the manifest.
 //
 // TODO(kalman): Test with host permissions.
-class ExternallyConnectableMessagingTest : public ExtensionApiTest {
+class ExternallyConnectableMessagingTest : public MessagingApiTest {
  protected:
   // Result codes from the test. These must match up with |results| in
   // c/t/d/extensions/api_test/externally_connectable/assertions.json.
@@ -428,13 +434,12 @@
     return hosted_app;
   }
 
-  void InitializeTestServer() {
+  void SetUpOnMainThread() override {
     base::FilePath test_data;
     EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data));
     embedded_test_server()->ServeFilesFromDirectory(test_data.AppendASCII(
         "extensions/api_test/messaging/externally_connectable/sites"));
-    ASSERT_TRUE(embedded_test_server()->Start());
-    host_resolver()->AddRule("*", embedded_test_server()->base_url().host());
+    MessagingApiTest::SetUpOnMainThread();
   }
 
   const char* close_background_message() {
@@ -520,8 +525,6 @@
 };
 
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest, NotInstalled) {
-  InitializeTestServer();
-
   scoped_refptr<const Extension> extension =
       ExtensionBuilder()
           .SetID("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
@@ -546,8 +549,6 @@
 // Tests two extensions on the same sites: one web connectable, one not.
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
                        WebConnectableAndNotConnectable) {
-  InitializeTestServer();
-
   // Install the web connectable extension. chromium.org can connect to it,
   // google.com can't.
   scoped_refptr<const Extension> chromium_connectable =
@@ -583,8 +584,6 @@
 // See http://crbug.com/297866
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
                        DISABLED_BackgroundPageClosesOnMessageReceipt) {
-  InitializeTestServer();
-
   // Install the web connectable extension.
   scoped_refptr<const Extension> chromium_connectable =
       LoadChromiumConnectableExtension();
@@ -603,8 +602,6 @@
 // Tests a web connectable extension that doesn't receive TLS channel id.
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
                        WebConnectableWithoutTlsChannelId) {
-  InitializeTestServer();
-
   // Install the web connectable extension. chromium.org can connect to it,
   // google.com can't.
   scoped_refptr<const Extension> chromium_connectable =
@@ -628,8 +625,6 @@
 // that can't connect to it.
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
                        WebConnectableWithTlsChannelIdWithNonMatchingSite) {
-  InitializeTestServer();
-
   scoped_refptr<const Extension> chromium_connectable =
       LoadChromiumConnectableExtensionWithTlsChannelId();
   ASSERT_TRUE(chromium_connectable.get());
@@ -651,8 +646,6 @@
 // that can connect to it, but with no TLS channel ID having been generated.
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
                        WebConnectableWithTlsChannelIdWithEmptyTlsChannelId) {
-  InitializeTestServer();
-
   scoped_refptr<const Extension> chromium_connectable =
       LoadChromiumConnectableExtensionWithTlsChannelId();
   ASSERT_TRUE(chromium_connectable.get());
@@ -678,8 +671,6 @@
 // immediately closes its background page upon receipt of a message.
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
     DISABLED_WebConnectableWithEmptyTlsChannelIdAndClosedBackgroundPage) {
-  InitializeTestServer();
-
   scoped_refptr<const Extension> chromium_connectable =
       LoadChromiumConnectableExtensionWithTlsChannelId();
 
@@ -706,8 +697,6 @@
 // host.
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
                        EnablingAndDisabling) {
-  InitializeTestServer();
-
   scoped_refptr<const Extension> chromium_connectable =
       LoadChromiumConnectableExtension();
   scoped_refptr<const Extension> not_connectable =
@@ -740,8 +729,6 @@
 // TODO(kalman): test messages from incognito extensions too.
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
                        FromIncognitoDenyApp) {
-  InitializeTestServer();
-
   scoped_refptr<const Extension> app = LoadChromiumConnectableApp();
   ASSERT_TRUE(app->is_platform_app());
 
@@ -776,8 +763,6 @@
 
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
                        FromIncognitoDenyExtensionAndApp) {
-  InitializeTestServer();
-
   scoped_refptr<const Extension> extension = LoadChromiumConnectableExtension();
   EXPECT_FALSE(util::IsIncognitoEnabled(extension->id(), profile()));
 
@@ -827,8 +812,6 @@
 // handler for the connection event.
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
                        FromIncognitoNoEventHandlerInApp) {
-  InitializeTestServer();
-
   scoped_refptr<const Extension> app = LoadChromiumConnectableApp(false);
   ASSERT_TRUE(app->is_platform_app());
 
@@ -859,8 +842,6 @@
 // TODO(kalman): see comment above about split mode.
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
                        FromIncognitoAllowApp) {
-  InitializeTestServer();
-
   scoped_refptr<const Extension> app = LoadChromiumConnectableApp();
   ASSERT_TRUE(app->is_platform_app());
 
@@ -896,8 +877,6 @@
 // same origin. The user should only need to accept the connection request once.
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
                        FromIncognitoPromptApp) {
-  InitializeTestServer();
-
   scoped_refptr<const Extension> app = LoadChromiumConnectableApp();
   ASSERT_TRUE(app->is_platform_app());
 
@@ -957,7 +936,6 @@
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest, IllegalArguments) {
   // Tests that malformed arguments to connect() don't crash.
   // Regression test for crbug.com/472700.
-  InitializeTestServer();
   LoadChromiumConnectableExtension();
   ui_test_utils::NavigateToURL(browser(), chromium_org_url());
   bool result;
@@ -969,8 +947,6 @@
 
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
                        FromIncognitoAllowExtension) {
-  InitializeTestServer();
-
   scoped_refptr<const Extension> extension = LoadChromiumConnectableExtension();
   EXPECT_FALSE(util::IsIncognitoEnabled(extension->id(), profile()));
 
@@ -1013,8 +989,6 @@
 // permission. Iframe should work.
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
                        FromIframeWithPermission) {
-  InitializeTestServer();
-
   scoped_refptr<const Extension> extension = LoadChromiumConnectableExtension();
 
   ui_test_utils::NavigateToURL(browser(), google_com_url());
@@ -1032,8 +1006,6 @@
 // Iframe shouldn't work.
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
                        FromIframeWithoutPermission) {
-  InitializeTestServer();
-
   scoped_refptr<const Extension> extension = LoadChromiumConnectableExtension();
 
   ui_test_utils::NavigateToURL(browser(), chromium_org_url());
@@ -1051,7 +1023,6 @@
   base::CommandLine::ForCurrentProcess()->AppendSwitch(
       switches::kDisablePopupBlocking);
 
-  InitializeTestServer();
   scoped_refptr<const Extension> extension = LoadChromiumConnectableExtension();
 
   // This will let us wait for the chromium.org.html page to load in a popup.
@@ -1152,7 +1123,6 @@
 // that can connect to it, with a TLS channel ID having been generated.
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingWithTlsChannelIdTest,
                        WebConnectableWithNonEmptyTlsChannelId) {
-  InitializeTestServer();
   std::string expected_tls_channel_id_value = CreateTlsChannelId();
 
   scoped_refptr<const Extension> chromium_connectable =
@@ -1209,7 +1179,6 @@
 // Same flakiness seen in http://crbug.com/297866
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingWithTlsChannelIdTest,
     DISABLED_WebConnectableWithNonEmptyTlsChannelIdAndClosedBackgroundPage) {
-  InitializeTestServer();
   std::string expected_tls_channel_id_value = CreateTlsChannelId();
 
   scoped_refptr<const Extension> chromium_connectable =
@@ -1277,8 +1246,6 @@
 // Tests that a hosted app on a connectable site doesn't interfere with the
 // connectability of that site.
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest, HostedAppOnWebsite) {
-  InitializeTestServer();
-
   scoped_refptr<const Extension> app = LoadChromiumHostedApp();
 
   // The presence of the hosted app shouldn't give the ability to send messages.
@@ -1299,8 +1266,6 @@
 // This is a regression test for http://crbug.com/326250#c12.
 IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
                        InvalidExtensionIDFromHostedApp) {
-  InitializeTestServer();
-
   // The presence of the chromium hosted app triggers this bug. The chromium
   // connectable extension needs to be installed to set up the runtime bindings.
   LoadChromiumHostedApp();
@@ -1325,9 +1290,7 @@
 #endif  // !defined(OS_WIN) - http://crbug.com/350517.
 
 // Tests that messages sent in the unload handler of a window arrive.
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MessagingOnUnload) {
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
+IN_PROC_BROWSER_TEST_F(MessagingApiTest, MessagingOnUnload) {
   const Extension* extension =
       LoadExtension(test_data_dir_.AppendASCII("messaging/on_unload"));
   ExtensionTestMessageListener listener("listening", false);
diff --git a/chrome/browser/extensions/extension_nacl_browsertest.cc b/chrome/browser/extensions/extension_nacl_browsertest.cc
index 0671942..aee9b99 100644
--- a/chrome/browser/extensions/extension_nacl_browsertest.cc
+++ b/chrome/browser/extensions/extension_nacl_browsertest.cc
@@ -39,6 +39,12 @@
  public:
   NaClExtensionTest() {}
 
+  void SetUpOnMainThread() override {
+    ExtensionBrowserTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*", "127.0.0.1");
+    ASSERT_TRUE(embedded_test_server()->Start());
+  }
+
  protected:
   enum InstallType {
     INSTALL_TYPE_COMPONENT,
@@ -148,8 +154,6 @@
 // Test that the NaCl plugin isn't blocked for Webstore extensions.
 // Disabled: http://crbug.com/319892
 IN_PROC_BROWSER_TEST_F(NaClExtensionTest, DISABLED_WebStoreExtension) {
-  ASSERT_TRUE(embedded_test_server()->Start());
-
   const Extension* extension = InstallExtension(INSTALL_TYPE_FROM_WEBSTORE);
   ASSERT_TRUE(extension);
   CheckPluginsCreated(extension, PLUGIN_TYPE_ALL);
@@ -158,8 +162,6 @@
 // Test that the NaCl plugin is blocked for non-Webstore extensions.
 // Disabled: http://crbug.com/319892
 IN_PROC_BROWSER_TEST_F(NaClExtensionTest, DISABLED_NonWebStoreExtension) {
-  ASSERT_TRUE(embedded_test_server()->Start());
-
   const Extension* extension = InstallExtension(INSTALL_TYPE_NON_WEBSTORE);
   ASSERT_TRUE(extension);
   CheckPluginsCreated(extension, PLUGIN_TYPE_NONE);
@@ -168,8 +170,6 @@
 // Test that the NaCl plugin isn't blocked for component extensions.
 // Disabled: http://crbug.com/319892
 IN_PROC_BROWSER_TEST_F(NaClExtensionTest, DISABLED_ComponentExtension) {
-  ASSERT_TRUE(embedded_test_server()->Start());
-
   const Extension* extension = InstallExtension(INSTALL_TYPE_COMPONENT);
   ASSERT_TRUE(extension);
   ASSERT_EQ(extension->location(), Manifest::COMPONENT);
@@ -179,8 +179,6 @@
 // Test that the NaCl plugin isn't blocked for unpacked extensions.
 // Disabled: http://crbug.com/319892
 IN_PROC_BROWSER_TEST_F(NaClExtensionTest, DISABLED_UnpackedExtension) {
-  ASSERT_TRUE(embedded_test_server()->Start());
-
   const Extension* extension = InstallExtension(INSTALL_TYPE_UNPACKED);
   ASSERT_TRUE(extension);
   ASSERT_EQ(extension->location(), Manifest::UNPACKED);
@@ -191,8 +189,6 @@
 // if it's a content (MIME type) handler.
 // Disabled: http://crbug.com/319892
 IN_PROC_BROWSER_TEST_F(NaClExtensionTest, DISABLED_NonExtensionScheme) {
-  ASSERT_TRUE(embedded_test_server()->Start());
-
   const Extension* extension = InstallExtension(INSTALL_TYPE_FROM_WEBSTORE);
   ASSERT_TRUE(extension);
   CheckPluginsCreated(
@@ -202,9 +198,6 @@
 
 // Test that NaCl plugin isn't blocked for hosted app URLs.
 IN_PROC_BROWSER_TEST_F(NaClExtensionTest, HostedApp) {
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(embedded_test_server()->Start());
-
   GURL url =
       embedded_test_server()->GetURL("/extensions/native_client/test.html");
   GURL::Replacements replace_host;
diff --git a/chrome/browser/extensions/extension_override_apitest.cc b/chrome/browser/extensions/extension_override_apitest.cc
index 1f9d817a..c30e5ff 100644
--- a/chrome/browser/extensions/extension_override_apitest.cc
+++ b/chrome/browser/extensions/extension_override_apitest.cc
@@ -36,6 +36,12 @@
 
 class ExtensionOverrideTest : public ExtensionApiTest {
  protected:
+  void SetUpOnMainThread() override {
+    ExtensionApiTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*", "127.0.0.1");
+    ASSERT_TRUE(embedded_test_server()->Start());
+  }
+
   bool CheckHistoryOverridesContainsNoDupes() {
     // There should be no duplicate entries in the preferences.
     const base::DictionaryValue* overrides =
@@ -204,9 +210,6 @@
 // See https://crbug.com/700124.
 IN_PROC_BROWSER_TEST_F(ExtensionOverrideTest,
                        SubframeNavigationInOverridenNTPDoesNotAffectFocus) {
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(embedded_test_server()->Start());
-
   // Load an extension that overrides the new tab page.
   const Extension* extension = LoadExtension(data_dir().AppendASCII("newtab"));
 
diff --git a/chrome/browser/extensions/extension_resource_request_policy_apitest.cc b/chrome/browser/extensions/extension_resource_request_policy_apitest.cc
index 9049e91..db5398f 100644
--- a/chrome/browser/extensions/extension_resource_request_policy_apitest.cc
+++ b/chrome/browser/extensions/extension_resource_request_policy_apitest.cc
@@ -29,14 +29,18 @@
     command_line->AppendSwitch(
         extensions::switches::kAllowLegacyExtensionManifests);
   }
+
+  void SetUpOnMainThread() override {
+    ExtensionApiTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*", "127.0.0.1");
+    ASSERT_TRUE(embedded_test_server()->Start());
+  }
 };
 
 // Note, this mostly tests the logic of chrome/renderer/extensions/
 // extension_resource_request_policy.*, but we have it as a browser test so that
 // can make sure it works end-to-end.
 IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest, OriginPrivileges) {
-  host_resolver()->AddRule("*", "127.0.0.1");
-  ASSERT_TRUE(embedded_test_server()->Start());
   ASSERT_TRUE(LoadExtensionWithFlags(test_data_dir_
       .AppendASCII("extension_resource_request_policy")
       .AppendASCII("extension"),
@@ -156,7 +160,6 @@
 IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest,
                        MAYBE_WebAccessibleResources) {
   std::string result;
-  ASSERT_TRUE(embedded_test_server()->Start());
   ASSERT_TRUE(LoadExtension(test_data_dir_
       .AppendASCII("extension_resource_request_policy")
       .AppendASCII("web_accessible")));
@@ -230,7 +233,6 @@
 IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest,
                        LinkToWebAccessibleResources) {
   std::string result;
-  ASSERT_TRUE(embedded_test_server()->Start());
   const extensions::Extension* extension = LoadExtension(
       test_data_dir_.AppendASCII("extension_resource_request_policy")
           .AppendASCII("web_accessible"));
@@ -294,7 +296,6 @@
 IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest,
                        WebAccessibleResourcesWithCSP) {
   std::string result;
-  ASSERT_TRUE(embedded_test_server()->Start());
   ASSERT_TRUE(LoadExtension(test_data_dir_
       .AppendASCII("extension_resource_request_policy")
       .AppendASCII("web_accessible")));
@@ -323,7 +324,6 @@
 
 IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest,
                        IframeNavigateToInaccessible) {
-  ASSERT_TRUE(embedded_test_server()->Start());
   ASSERT_TRUE(LoadExtension(
       test_data_dir_.AppendASCII("extension_resource_request_policy")
           .AppendASCII("some_accessible")));
diff --git a/chrome/browser/extensions/extension_tabs_apitest.cc b/chrome/browser/extensions/extension_tabs_apitest.cc
index f3491b8..e279efe 100644
--- a/chrome/browser/extensions/extension_tabs_apitest.cc
+++ b/chrome/browser/extensions/extension_tabs_apitest.cc
@@ -20,6 +20,15 @@
 #include "ui/aura/window_tree_host.h"
 #endif
 
+class ExtensionApiTabTest : public ExtensionApiTest {
+ public:
+  void SetUpOnMainThread() override {
+    ExtensionApiTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*", "127.0.0.1");
+    ASSERT_TRUE(StartEmbeddedTestServer());
+  }
+};
+
 #if defined(USE_AURA) || defined(OS_MACOSX)
 // Maximizing/fullscreen popup window doesn't work on aura's managed mode.
 // See bug crbug.com/116305.
@@ -29,11 +38,11 @@
 #define MAYBE_UpdateWindowShowState UpdateWindowShowState
 #endif  // defined(USE_AURA) || defined(OS_MACOSX)
 
-class ExtensionApiNewTabTest : public ExtensionApiTest {
+class ExtensionApiNewTabTest : public ExtensionApiTabTest {
  public:
   ExtensionApiNewTabTest() {}
   void SetUpCommandLine(base::CommandLine* command_line) override {
-    ExtensionApiTest::SetUpCommandLine(command_line);
+    ExtensionApiTabTest::SetUpCommandLine(command_line);
     // Override the default which InProcessBrowserTest adds if it doesn't see a
     // homepage.
     command_line->AppendSwitchASCII(
@@ -51,12 +60,12 @@
   ASSERT_TRUE(RunExtensionSubtest("tabs/basics", "crud.html")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, TabAudible) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, TabAudible) {
   ASSERT_TRUE(RunExtensionSubtest("tabs/basics", "audible.html")) << message_;
 }
 
 // http://crbug.com/521410
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_TabMuted) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, DISABLED_TabMuted) {
   ASSERT_TRUE(RunExtensionSubtest("tabs/basics", "muted.html")) << message_;
 }
 
@@ -66,24 +75,24 @@
 #else
 #define MAYBE_Tabs2 Tabs2
 #endif
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_Tabs2) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, MAYBE_Tabs2) {
   ASSERT_TRUE(RunExtensionSubtest("tabs/basics", "crud2.html")) << message_;
 }
 
 // crbug.com/149924
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_TabDuplicate) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, DISABLED_TabDuplicate) {
   ASSERT_TRUE(RunExtensionSubtest("tabs/basics", "duplicate.html")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, TabSize) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, TabSize) {
   ASSERT_TRUE(RunExtensionSubtest("tabs/basics", "tab_size.html")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, TabUpdate) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, TabUpdate) {
   ASSERT_TRUE(RunExtensionSubtest("tabs/basics", "update.html")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, TabPinned) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, TabPinned) {
   ASSERT_TRUE(RunExtensionSubtest("tabs/basics", "pinned.html")) << message_;
 }
 
@@ -93,20 +102,20 @@
 #else
 #define MAYBE_TabMove TabMove
 #endif
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_TabMove) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, MAYBE_TabMove) {
   ASSERT_TRUE(RunExtensionSubtest("tabs/basics", "move.html")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, TabEvents) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, TabEvents) {
   ASSERT_TRUE(RunExtensionSubtest("tabs/basics", "events.html")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_TabRelativeURLs) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, DISABLED_TabRelativeURLs) {
   ASSERT_TRUE(RunExtensionSubtest("tabs/basics", "relative_urls.html"))
       << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, TabQuery) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, TabQuery) {
   ASSERT_TRUE(RunExtensionSubtest("tabs/basics", "query.html")) << message_;
 }
 
@@ -116,11 +125,11 @@
 #else
 #define MAYBE_TabHighlight TabHighlight
 #endif
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_TabHighlight) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, MAYBE_TabHighlight) {
   ASSERT_TRUE(RunExtensionSubtest("tabs/basics", "highlight.html")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, TabCrashBrowser) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, TabCrashBrowser) {
   ASSERT_TRUE(RunExtensionSubtest("tabs/basics", "crash.html")) << message_;
 }
 
@@ -130,55 +139,44 @@
 #else
 #define MAYBE_TabOpener TabOpener
 #endif
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_TabOpener) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, MAYBE_TabOpener) {
   ASSERT_TRUE(RunExtensionSubtest("tabs/basics", "opener.html")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_TabGetCurrent) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, DISABLED_TabGetCurrent) {
   ASSERT_TRUE(RunExtensionTest("tabs/get_current")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, TabConnect) {
-  ASSERT_TRUE(StartEmbeddedTestServer());
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, TabConnect) {
   ASSERT_TRUE(RunExtensionTest("tabs/connect")) << message_;
 }
 
 // Possible race in ChromeURLDataManager. http://crbug.com/59198
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_TabOnRemoved) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, DISABLED_TabOnRemoved) {
   ASSERT_TRUE(RunExtensionTest("tabs/on_removed")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_TabReload) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, DISABLED_TabReload) {
   ASSERT_TRUE(RunExtensionTest("tabs/reload")) << message_;
 }
 
-class ExtensionApiCaptureTest : public ExtensionApiTest {
+class ExtensionApiCaptureTest : public ExtensionApiTabTest {
  public:
   ExtensionApiCaptureTest() {}
 
   void SetUp() override {
     EnablePixelOutput();
-    ExtensionApiTest::SetUp();
-  }
-
-  void SetUpCommandLine(base::CommandLine* command_line) override {
-    ExtensionApiTest::SetUpCommandLine(command_line);
+    ExtensionApiTabTest::SetUp();
   }
 };
 
 IN_PROC_BROWSER_TEST_F(ExtensionApiCaptureTest,
                        DISABLED_CaptureVisibleTabJpeg) {
-  host_resolver()->AddRule("a.com", "127.0.0.1");
-  host_resolver()->AddRule("b.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionSubtest("tabs/capture_visible_tab",
                                   "test_jpeg.html")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(ExtensionApiCaptureTest, DISABLED_CaptureVisibleTabPng) {
-  host_resolver()->AddRule("a.com", "127.0.0.1");
-  host_resolver()->AddRule("b.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionSubtest("tabs/capture_visible_tab",
                                   "test_png.html")) << message_;
 }
@@ -206,11 +204,11 @@
                                   "test_disabled.html")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, TabsOnCreated) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, TabsOnCreated) {
   ASSERT_TRUE(RunExtensionTest("tabs/on_created")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, TabsOnUpdated) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, TabsOnUpdated) {
   ASSERT_TRUE(RunExtensionTest("tabs/on_updated")) << message_;
 }
 
@@ -220,25 +218,20 @@
 #else
 #define MAYBE_TabsNoPermissions TabsNoPermissions
 #endif
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_TabsNoPermissions) {
-  host_resolver()->AddRule("a.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, MAYBE_TabsNoPermissions) {
   ASSERT_TRUE(RunExtensionTest("tabs/no_permissions")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, HostPermission) {
-  host_resolver()->AddRule("a.com", "127.0.0.1");
-  ASSERT_TRUE(StartEmbeddedTestServer());
-
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, HostPermission) {
   ASSERT_TRUE(RunExtensionTest("tabs/host_permission")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, UpdateWindowResize) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, UpdateWindowResize) {
   ASSERT_TRUE(RunExtensionTest("window_update/resize")) << message_;
 }
 
 #if defined(OS_WIN)
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, FocusWindowDoesNotUnmaximize) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, FocusWindowDoesNotUnmaximize) {
   HWND window =
       browser()->window()->GetNativeWindow()->GetHost()->GetAcceleratedWidget();
   ::SendMessage(window, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
@@ -247,11 +240,11 @@
 }
 #endif  // OS_WIN
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_UpdateWindowShowState) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, MAYBE_UpdateWindowShowState) {
   ASSERT_TRUE(RunExtensionTest("window_update/show_state")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, IncognitoDisabledByPref) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, IncognitoDisabledByPref) {
   IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(),
                                       IncognitoModePrefs::DISABLED);
 
@@ -260,21 +253,20 @@
   ASSERT_TRUE(RunExtensionTest("tabs/incognito_disabled")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_GetViewsOfCreatedPopup) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, DISABLED_GetViewsOfCreatedPopup) {
   ASSERT_TRUE(RunExtensionSubtest("tabs/basics", "get_views_popup.html"))
       << message_;
 }
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_GetViewsOfCreatedWindow) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, DISABLED_GetViewsOfCreatedWindow) {
   ASSERT_TRUE(RunExtensionSubtest("tabs/basics", "get_views_window.html"))
       << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, OnUpdatedDiscardedState) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, OnUpdatedDiscardedState) {
   ASSERT_TRUE(RunExtensionSubtest("tabs/basics", "discarded.html")) << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, TabOpenerCraziness) {
-  ASSERT_TRUE(StartEmbeddedTestServer());
+IN_PROC_BROWSER_TEST_F(ExtensionApiTabTest, TabOpenerCraziness) {
   ASSERT_TRUE(RunExtensionTest("tabs/tab_opener_id"));
 }
 
diff --git a/chrome/browser/extensions/extension_unload_browsertest.cc b/chrome/browser/extensions/extension_unload_browsertest.cc
index f11a576..97e2420 100644
--- a/chrome/browser/extensions/extension_unload_browsertest.cc
+++ b/chrome/browser/extensions/extension_unload_browsertest.cc
@@ -14,7 +14,13 @@
 
 namespace extensions {
 
-using ExtensionUnloadBrowserTest = ExtensionBrowserTest;
+class ExtensionUnloadBrowserTest : public ExtensionBrowserTest {
+ public:
+  void SetUpOnMainThread() override {
+    ExtensionBrowserTest::SetUpOnMainThread();
+    host_resolver()->AddRule("maps.google.com", "127.0.0.1");
+  }
+};
 
 IN_PROC_BROWSER_TEST_F(ExtensionUnloadBrowserTest, TestUnload) {
   // Load an extension that installs unload and beforeunload listeners.
@@ -41,7 +47,6 @@
 // After an extension is uninstalled, network requests from its content scripts
 // should fail but not kill the renderer process.
 IN_PROC_BROWSER_TEST_F(ExtensionUnloadBrowserTest, UnloadWithContentScripts) {
-  host_resolver()->AddRule("maps.google.com", "127.0.0.1");
   ASSERT_TRUE(embedded_test_server()->Start());
 
   // Load an extension with a content script that has a button to send XHRs.
diff --git a/chrome/browser/extensions/extension_with_management_policy_apitest.cc b/chrome/browser/extensions/extension_with_management_policy_apitest.cc
index 8ffaef6..3cce777 100644
--- a/chrome/browser/extensions/extension_with_management_policy_apitest.cc
+++ b/chrome/browser/extensions/extension_with_management_policy_apitest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/extensions/extension_with_management_policy_apitest.h"
 #include "components/policy/core/browser/browser_policy_connector.h"
+#include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/http_request.h"
 
 ExtensionApiTestWithManagementPolicy::ExtensionApiTestWithManagementPolicy()
@@ -19,3 +20,8 @@
   policy::BrowserPolicyConnector::SetPolicyProviderForTesting(
       &policy_provider_);
 }
+
+void ExtensionApiTestWithManagementPolicy::SetUpOnMainThread() {
+  ExtensionApiTest::SetUpOnMainThread();
+  host_resolver()->AddRule("*", "127.0.0.1");
+}
diff --git a/chrome/browser/extensions/extension_with_management_policy_apitest.h b/chrome/browser/extensions/extension_with_management_policy_apitest.h
index f0787f6..ef11374d 100644
--- a/chrome/browser/extensions/extension_with_management_policy_apitest.h
+++ b/chrome/browser/extensions/extension_with_management_policy_apitest.h
@@ -19,6 +19,7 @@
   ExtensionApiTestWithManagementPolicy();
   ~ExtensionApiTestWithManagementPolicy() override;
   void SetUpInProcessBrowserTestFixture() override;
+  void SetUpOnMainThread() override;
 
  protected:
   policy::MockConfigurationPolicyProvider policy_provider_;
diff --git a/chrome/browser/extensions/isolated_app_browsertest.cc b/chrome/browser/extensions/isolated_app_browsertest.cc
index 6dfe9e5d..3c3733c 100644
--- a/chrome/browser/extensions/isolated_app_browsertest.cc
+++ b/chrome/browser/extensions/isolated_app_browsertest.cc
@@ -104,6 +104,11 @@
 
 class IsolatedAppTest : public ExtensionBrowserTest {
  public:
+  void SetUpOnMainThread() override {
+    ExtensionBrowserTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*", "127.0.0.1");
+  }
+
   // Returns whether the given tab's current URL has the given cookie.
   bool WARN_UNUSED_RESULT HasCookie(WebContents* contents,
                                     const std::string& cookie) {
@@ -139,7 +144,6 @@
 };
 
 IN_PROC_BROWSER_TEST_F(IsolatedAppTest, CrossProcessClientRedirect) {
-  host_resolver()->AddRule("*", "127.0.0.1");
   ASSERT_TRUE(embedded_test_server()->Start());
 
   ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("isolated_apps/app1")));
@@ -202,7 +206,6 @@
 // extent.  These origins should also be isolated, but still have origin-based
 // separation as you would expect.
 IN_PROC_BROWSER_TEST_F(IsolatedAppTest, CookieIsolation) {
-  host_resolver()->AddRule("*", "127.0.0.1");
   ASSERT_TRUE(embedded_test_server()->Start());
 
   ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("isolated_apps/app1")));
@@ -299,7 +302,6 @@
 // This test is disabled due to being flaky. http://crbug.com/145588
 // Ensure that cookies are not isolated if the isolated apps are not installed.
 IN_PROC_BROWSER_TEST_F(IsolatedAppTest, DISABLED_NoCookieIsolationWithoutApp) {
-  host_resolver()->AddRule("*", "127.0.0.1");
   ASSERT_TRUE(embedded_test_server()->Start());
 
   // The app under test acts on URLs whose host is "localhost",
@@ -380,7 +382,6 @@
   embedded_test_server()->RegisterRequestHandler(
       base::Bind(&HandleExpectAndSetCookieRequest, embedded_test_server()));
 
-  host_resolver()->AddRule("*", "127.0.0.1");
   ASSERT_TRUE(embedded_test_server()->Start());
 
   ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("isolated_apps/app1")));
@@ -453,7 +454,6 @@
 // This is true even in the case of the OAuth workaround for hosted apps,
 // where non-app popups may be kept in the hosted app process.
 IN_PROC_BROWSER_TEST_F(IsolatedAppTest, MAYBE_IsolatedAppProcessModel) {
-  host_resolver()->AddRule("*", "127.0.0.1");
   ASSERT_TRUE(embedded_test_server()->Start());
 
   ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("isolated_apps/app1")));
@@ -511,7 +511,6 @@
 // TODO(nasko): If isolated apps is no longer developed, this test should be
 // removed. http://crbug.com/159932
 IN_PROC_BROWSER_TEST_F(IsolatedAppTest, DISABLED_SessionStorage) {
-  host_resolver()->AddRule("*", "127.0.0.1");
   ASSERT_TRUE(embedded_test_server()->Start());
 
   ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("isolated_apps/app1")));
diff --git a/chrome/browser/extensions/lazy_background_page_apitest.cc b/chrome/browser/extensions/lazy_background_page_apitest.cc
index ead2b67..13d54730 100644
--- a/chrome/browser/extensions/lazy_background_page_apitest.cc
+++ b/chrome/browser/extensions/lazy_background_page_apitest.cc
@@ -110,6 +110,11 @@
     command_line->AppendSwitch(::switches::kNoProxyServer);
   }
 
+  void SetUpOnMainThread() override {
+    ExtensionApiTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*", "127.0.0.1");
+  }
+
   // Loads the extension, which temporarily starts the lazy background page
   // to dispatch the onInstalled event. We wait until it shuts down again.
   const Extension* LoadExtensionAndWait(const std::string& test_name) {
@@ -284,7 +289,6 @@
 // Tests that the lazy background page stays alive until all network requests
 // are complete.
 IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, WaitForRequest) {
-  host_resolver()->AddRule("*", "127.0.0.1");
   ASSERT_TRUE(StartEmbeddedTestServer());
 
   LazyBackgroundObserver page_complete;
@@ -636,8 +640,8 @@
   LazyBackgroundPageIsolatedExtensionsApiTest() {}
   ~LazyBackgroundPageIsolatedExtensionsApiTest() override {}
 
-  void SetUpInProcessBrowserTestFixture() override {
-    LazyBackgroundPageApiTest::SetUpInProcessBrowserTestFixture();
+  void SetUpOnMainThread() override {
+    LazyBackgroundPageApiTest::SetUpOnMainThread();
 
     // This is needed to allow example.com to actually resolve and load in
     // tests.
diff --git a/chrome/browser/extensions/native_bindings_apitest.cc b/chrome/browser/extensions/native_bindings_apitest.cc
index c19ec63..c3b9aa3 100644
--- a/chrome/browser/extensions/native_bindings_apitest.cc
+++ b/chrome/browser/extensions/native_bindings_apitest.cc
@@ -46,12 +46,16 @@
     command_line->AppendSwitchASCII(switches::kNativeCrxBindings, "1");
   }
 
+  void SetUpOnMainThread() override {
+    ExtensionApiTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*", "127.0.0.1");
+  }
+
  private:
   DISALLOW_COPY_AND_ASSIGN(NativeBindingsApiTest);
 };
 
 IN_PROC_BROWSER_TEST_F(NativeBindingsApiTest, SimpleEndToEndTest) {
-  host_resolver()->AddRule("*", "127.0.0.1");
   embedded_test_server()->ServeFilesFromDirectory(test_data_dir_);
   ASSERT_TRUE(StartEmbeddedTestServer());
   ASSERT_TRUE(RunExtensionTest("native_bindings/extension")) << message_;
@@ -73,7 +77,6 @@
 
 // Tests the declarativeContent API and declarative events.
 IN_PROC_BROWSER_TEST_F(NativeBindingsApiTest, DeclarativeEvents) {
-  host_resolver()->AddRule("*", "127.0.0.1");
   embedded_test_server()->ServeFilesFromDirectory(test_data_dir_);
   ASSERT_TRUE(StartEmbeddedTestServer());
   // Load an extension and wait for it to be ready.
@@ -136,7 +139,6 @@
 // Tests the webRequest API, which requires IO thread requests and custom
 // events.
 IN_PROC_BROWSER_TEST_F(NativeBindingsApiTest, WebRequest) {
-  host_resolver()->AddRule("*", "127.0.0.1");
   embedded_test_server()->ServeFilesFromDirectory(test_data_dir_);
   ASSERT_TRUE(StartEmbeddedTestServer());
   // Load an extension and wait for it to be ready.
@@ -204,7 +206,6 @@
 
 // Tests that unchecked errors don't impede future calls.
 IN_PROC_BROWSER_TEST_F(NativeBindingsApiTest, ErrorsInCallbackTest) {
-  host_resolver()->AddRule("*", "127.0.0.1");
   embedded_test_server()->ServeFilesFromDirectory(test_data_dir_);
   ASSERT_TRUE(StartEmbeddedTestServer());
 
diff --git a/chrome/browser/extensions/process_management_browsertest.cc b/chrome/browser/extensions/process_management_browsertest.cc
index c446d02a..42892e4 100644
--- a/chrome/browser/extensions/process_management_browsertest.cc
+++ b/chrome/browser/extensions/process_management_browsertest.cc
@@ -46,6 +46,11 @@
     command_line->AppendSwitch(
         extensions::switches::kEnableExperimentalExtensionApis);
   }
+
+  void SetUpOnMainThread() override {
+    ExtensionBrowserTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*", "127.0.0.1");
+  }
 };
 
 class ChromeWebStoreProcessTest : public ExtensionBrowserTest {
@@ -88,7 +93,6 @@
   // Set max renderers to 1 to force running out of processes.
   content::RenderProcessHost::SetMaxRendererProcessCount(1);
 
-  host_resolver()->AddRule("*", "127.0.0.1");
   ASSERT_TRUE(embedded_test_server()->Start());
 
   ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("isolated_apps/app1")));
@@ -234,7 +238,6 @@
   // allocated.
   content::RenderProcessHost::SetMaxRendererProcessCount(6);
 
-  host_resolver()->AddRule("*", "127.0.0.1");
   ASSERT_TRUE(embedded_test_server()->Start());
 
   // The app under test acts on URLs whose host is "localhost",
@@ -283,7 +286,6 @@
 
 IN_PROC_BROWSER_TEST_F(ProcessManagementTest,
                        NavigateExtensionTabToWebViaPost) {
-  host_resolver()->AddRule("*", "127.0.0.1");
   ASSERT_TRUE(embedded_test_server()->Start());
 
   // Load an extension.
@@ -396,9 +398,8 @@
 
 // This test verifies that blocked navigations to extensions pages do not
 // overwrite process-per-site map inside content/.
-IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest,
+IN_PROC_BROWSER_TEST_F(ProcessManagementTest,
                        NavigateToBlockedExtensionPageInNewTab) {
-  host_resolver()->AddRule("*", "127.0.0.1");
   ASSERT_TRUE(embedded_test_server()->Start());
 
   // Load an extension, which will block a request for a specific page in it.
diff --git a/chrome/test/data/extensions/api_test/executescript/navigation_race/test.js b/chrome/test/data/extensions/api_test/executescript/navigation_race/test.js
index fb4f7e0..b0c83725 100644
--- a/chrome/test/data/extensions/api_test/executescript/navigation_race/test.js
+++ b/chrome/test/data/extensions/api_test/executescript/navigation_race/test.js
@@ -4,7 +4,7 @@
 
 chrome.test.getConfig(function(config) {
   var path = "/extensions/test_file.txt";
-  var urlA = "http://a.com:" + config.testServer.port + path;
+  var urlC = "http://c.com:" + config.testServer.port + path;
   var urlB = "http://b.com:" + config.testServer.port + path;
   var testTabId;
 
@@ -18,7 +18,7 @@
         // permission to run it.
         if (chrome.runtime.lastError) {
           chrome.test.assertLastError(
-              'Cannot access contents of url "' + urlA +
+              'Cannot access contents of url "' + urlC +
               '". Extension manifest must request permission to access this ' +
               'host.');
           chrome.test.notifyPass();
@@ -36,7 +36,7 @@
   }
 
   chrome.tabs.onUpdated.addListener(onTabUpdated);
-  chrome.tabs.create({url: urlA}, function(tab) {
+  chrome.tabs.create({url: urlC}, function(tab) {
     testTabId = tab.id;
   });
 });