[Extensions] Increase download priority for external component extensions

External component extensions are loaded through the external provider
mechanism. These external extensions, by default, have a lower fetch
priority. For external policy extensions, we increase the priority. Do
the same for external component extensions, and add a test.

Bug: 965686

Change-Id: Ied58e08f403d574c4b6e8f7bdc484db90f926018
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1627783
Commit-Queue: Devlin <[email protected]>
Reviewed-by: Istiaque Ahmed <[email protected]>
Cr-Commit-Position: refs/heads/master@{#664844}
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index d9b9567..b92f113 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -7420,12 +7420,16 @@
   service()->BlockAllExtensions();
 }
 
+class ExternalExtensionPriorityTest
+    : public ExtensionServiceTest,
+      public testing::WithParamInterface<Manifest::Location> {};
+
 // Policy-forced extensions should be fetched with FOREGROUND priority,
 // otherwise they may be throttled (web store sends “noupdate” response to
 // reduce load), which is OK for updates, but not for a new install. This is
 // a regression test for problems described in https://crbug.com/904600 and
 // https://crbug.com/917700.
-TEST_F(ExtensionServiceTest, PolicyForegroundFetch) {
+TEST_P(ExternalExtensionPriorityTest, PolicyForegroundFetch) {
   ExtensionUpdater::ScopedSkipScheduledCheckForTest skip_scheduled_checks;
   ExtensionServiceInitParams params = CreateDefaultInitParams();
   params.autoupdate_enabled = true;
@@ -7440,11 +7444,11 @@
 
   GURL update_url(extension_urls::kChromeWebstoreUpdateURL);
   service()->OnExternalExtensionUpdateUrlFound(
-      ExternalInstallInfoUpdateUrl(
-          all_zero /* extension_id */, "" /* install_parameter */, update_url,
-          Manifest::EXTERNAL_POLICY_DOWNLOAD /* download_location */,
-          Extension::NO_FLAGS /* creation_flag */,
-          true /* mark_acknowledged */),
+      ExternalInstallInfoUpdateUrl(all_zero /* extension_id */,
+                                   "" /* install_parameter */, update_url,
+                                   GetParam() /* download_location */,
+                                   Extension::NO_FLAGS /* creation_flag */,
+                                   true /* mark_acknowledged */),
       true /* is_initial_load */);
 
   MockExternalProvider provider(nullptr, Manifest::EXTERNAL_POLICY_DOWNLOAD);
@@ -7458,10 +7462,19 @@
   std::string header;
   EXPECT_TRUE(pending_request->request.headers.GetHeader(
       "X-Goog-Update-Interactivity", &header));
-  EXPECT_EQ(header, "fg");
+  bool is_high_priority = GetParam() == Manifest::EXTERNAL_POLICY_DOWNLOAD ||
+                          GetParam() == Manifest::EXTERNAL_COMPONENT;
+  const char* expected_header = is_high_priority ? "fg" : "bg";
+  EXPECT_EQ(expected_header, header);
 
   // Destroy updater's downloader as it uses |helper|.
   service()->updater()->SetExtensionDownloaderForTesting(nullptr);
 }
 
+INSTANTIATE_TEST_SUITE_P(,
+                         ExternalExtensionPriorityTest,
+                         testing::Values(Manifest::EXTERNAL_POLICY_DOWNLOAD,
+                                         Manifest::EXTERNAL_COMPONENT,
+                                         Manifest::EXTERNAL_PREF_DOWNLOAD));
+
 }  // namespace extensions