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);