Increase fetch priority for policy-forced extensions

When fetch extensions from chrome web store, there is a header which
indicated pritority (or “interactivity”) of extension fetch. Usually it
is high (FOREGROUND) when user manually clicked “Add to Chrome” in the
store, and low (BACKGROUND) otherwise. Background fetches could be
throttled on a store server-side (eg. due to bandwidth limit), which is
perfectly OK for background updates, but is harmful for new installs
(which can occur not only because of user click, but also because of
extension forcelist policy). Therefore we have to set priority to
foreground for policy-based extension downloads.

Bug: 904600, 917700
Change-Id: I25ac15e71398f833261cd0cb1116785fcf7a241d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1569019
Commit-Queue: Oleg Davydov <[email protected]>
Reviewed-by: Sergey Poromov <[email protected]>
Reviewed-by: Devlin <[email protected]>
Cr-Commit-Position: refs/heads/master@{#651691}
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index 306d95c..6d8ac09 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -92,6 +92,7 @@
 #include "extensions/browser/update_observer.h"
 #include "extensions/browser/updater/extension_cache.h"
 #include "extensions/browser/updater/extension_downloader.h"
+#include "extensions/browser/updater/manifest_fetch_data.h"
 #include "extensions/common/extension_messages.h"
 #include "extensions/common/extension_urls.h"
 #include "extensions/common/feature_switch.h"
@@ -1119,6 +1120,12 @@
             : base::BindOnce(
                   [](base::RepeatingClosure callback) { callback.Run(); },
                   external_updates_finished_callback_);
+    // We have to mark policy-forced extensions with foreground fetch priority,
+    // otherwise their installation may be throttled by bandwidth limits.
+    // See https://crbug.com/904600.
+    if (pending_extension_manager_.HasPendingExtensionFromPolicy()) {
+      params.fetch_priority = ManifestFetchData::FOREGROUND;
+    }
     updater()->CheckNow(std::move(params));
   }