Blocked external extension will be alerted after being unblocked.

When a external extension loaded, don't show alert to user if it's
blocked. Wait until it's unblocked and moved to disabled list.

Bug: 797369
Change-Id: I6239348a491c95ad148c1155d525a3845a8c59a0
Reviewed-on: https://chromium-review.googlesource.com/860912
Commit-Queue: Owen Min <[email protected]>
Reviewed-by: Devlin <[email protected]>
Cr-Commit-Position: refs/heads/master@{#528529}
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index 7ca58ab..e42397b 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -924,6 +924,9 @@
     registry_->RemoveBlocked(extension->id());
     AddExtension(extension.get());
   }
+  // While extensions are blocked, we won't display any external install
+  // warnings. Now that they are unblocked, we should update the error.
+  external_install_manager_->UpdateExternalExtensionAlert();
 }
 
 void ExtensionService::GrantPermissionsAndEnableExtension(
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index 9dbb7864..7de6ea1 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -6451,6 +6451,31 @@
   ASSERT_FALSE(AddPendingSyncInstall());
 }
 
+// Test that the blocked pending external extension should be ignored until
+// it's unblocked. (crbug.com/797369)
+TEST_F(ExtensionServiceTest, BlockedExternalExtension) {
+  FeatureSwitch::ScopedOverride prompt(
+      FeatureSwitch::prompt_for_external_extensions(), true);
+
+  InitializeEmptyExtensionService();
+  MockExternalProvider* provider =
+      AddMockExternalProvider(Manifest::EXTERNAL_PREF);
+
+  service()->external_install_manager()->UpdateExternalExtensionAlert();
+  EXPECT_FALSE(HasExternalInstallErrors(service()));
+
+  service()->BlockAllExtensions();
+
+  provider->UpdateOrAddExtension(page_action, "1.0.0.0",
+                                 data_dir().AppendASCII("page_action.crx"));
+
+  WaitForExternalExtensionInstalled();
+  EXPECT_FALSE(HasExternalInstallErrors(service()));
+
+  service()->UnblockAllExtensions();
+  EXPECT_TRUE(HasExternalInstallErrors(service()));
+}
+
 // Test that installing an external extension displays a GlobalError.
 TEST_F(ExtensionServiceTest, ExternalInstallGlobalError) {
   FeatureSwitch::ScopedOverride prompt(
diff --git a/chrome/browser/extensions/external_install_manager.cc b/chrome/browser/extensions/external_install_manager.cc
index 6f89f09..76052ee 100644
--- a/chrome/browser/extensions/external_install_manager.cc
+++ b/chrome/browser/extensions/external_install_manager.cc
@@ -136,10 +136,17 @@
   // external extensions.
   const ExtensionSet& disabled_extensions =
       ExtensionRegistry::Get(browser_context_)->disabled_extensions();
+  const ExtensionSet& blocked_extensions =
+      ExtensionRegistry::Get(browser_context_)->blocked_extensions();
   for (const auto& id : unacknowledged_ids_) {
     if (base::ContainsKey(errors_, id) || shown_ids_.count(id) > 0)
       continue;
 
+    // Ignore the blocked and disabled extensions. They will be put into
+    // disabled list once unblocked.
+    if (blocked_extensions.GetByID(id))
+      continue;
+
     const Extension* extension = disabled_extensions.GetByID(id);
     CHECK(extension);