Enable Zip Unpacker extension when it were disabled.
Component extension cannot be disabled or uninstalled by any user
operations, but we got some cases where Zip Unpacker was disabled
in some user's profile.
Bug: 643060
Test: unit_tests --gtest_filter=ExtensionServiceTest.*
Change-Id: Id27ca4472270d37175dd21b54f070c37b2c6f282
Reviewed-on: https://chromium-review.googlesource.com/737892
Reviewed-by: Finnur Thorarinsson <[email protected]>
Commit-Queue: Tatsuhisa Yamaguchi <[email protected]>
Cr-Commit-Position: refs/heads/master@{#511780}
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index 29fc32f..d94e52d 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -464,6 +464,7 @@
LoadExtensionsFromCommandLineFlag(switches::kDisableExtensionsExcept);
if (load_command_line_extensions)
LoadExtensionsFromCommandLineFlag(extensions::switches::kLoadExtension);
+ EnableZipUnpackerExtension();
EnabledReloadableExtensions();
MaybeFinishShutdownDelayed();
SetReadyAndNotifyListeners();
@@ -477,6 +478,24 @@
LoadGreylistFromPrefs();
}
+void ExtensionService::EnableZipUnpackerExtensionForTest() {
+ EnableZipUnpackerExtension();
+}
+
+void ExtensionService::EnableZipUnpackerExtension() {
+ TRACE_EVENT0("browser,startup",
+ "ExtensionService::EnableZipUnpackerExtension");
+
+#if defined(OS_CHROMEOS)
+ // There were some cases where the Zip Unpacker was disabled in the profile,
+ // by some reason, and cannot re-enable it in any UI. crbug.com/643060
+ const std::string& id = extension_misc::kZIPUnpackerExtensionId;
+ const Extension* extension = registry_->disabled_extensions().GetByID(id);
+ if (extension && CanEnableExtension(extension))
+ EnableExtension(id);
+#endif
+}
+
void ExtensionService::EnabledReloadableExtensions() {
TRACE_EVENT0("browser,startup",
"ExtensionService::EnabledReloadableExtensions");
diff --git a/chrome/browser/extensions/extension_service.h b/chrome/browser/extensions/extension_service.h
index 2ff882a3a..afe623d 100644
--- a/chrome/browser/extensions/extension_service.h
+++ b/chrome/browser/extensions/extension_service.h
@@ -414,6 +414,9 @@
// Reloads all extensions. Does not notify that extensions are ready.
void ReloadExtensionsForTest();
+ // Enable Zip Unpacker Extension component extensions for unit test.
+ void EnableZipUnpackerExtensionForTest();
+
// Clear all ExternalProviders.
void ClearProvidersForTesting();
@@ -485,6 +488,12 @@
// externally managed extension. If so, uninstall it.
void CheckExternalUninstall(const std::string& id);
+ // Attempt to enable Zip Unpacker component extension if it is disabled.
+ // This function doesn't override MUST_REAMIN_DISABLED management policy.
+ // Component extensions are managed and cannot be disabled by user, however,
+ // there are some cases having a disabled component extension in profile.
+ void EnableZipUnpackerExtension();
+
// Attempt to enable all disabled extensions which the only disabled reason is
// reloading.
void EnabledReloadableExtensions();
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index f4804653..623ec722 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -201,6 +201,7 @@
const char permissions_blocklist[] = "noffkehfcaggllbcojjbopcmlhcnhcdn";
const char cast_stable[] = "boadgeojelhgndaghljhdicfkmllpafd";
const char cast_beta[] = "dliochdbjfkdbacpmhlcpmleaejidimm";
+const char zip_unpacker[] = "oedeeodfidgoollimchfdnbmhcpnklnd";
struct BubbleErrorsTestData {
BubbleErrorsTestData(const std::string& id,
@@ -7298,3 +7299,46 @@
service()->UninstallMigratedExtensionsForTest();
EXPECT_FALSE(service()->GetInstalledExtension(cast_stable));
}
+
+TEST_F(ExtensionServiceTest, EnableZipUnpackerExtension) {
+ InitializeEmptyExtensionService();
+
+ scoped_refptr<const Extension> zip_unpacker_extension =
+ ExtensionBuilder("stable")
+ .SetID(zip_unpacker)
+ .SetLocation(Manifest::EXTERNAL_COMPONENT)
+ .Build();
+ service()->AddExtension(zip_unpacker_extension.get());
+ service()->DisableExtension(zip_unpacker,
+ extensions::disable_reason::DISABLE_USER_ACTION);
+ ASSERT_TRUE(registry()->disabled_extensions().Contains(zip_unpacker));
+
+ service()->EnableZipUnpackerExtensionForTest();
+#if defined(OS_CHROMEOS)
+ ASSERT_TRUE(registry()->enabled_extensions().Contains(zip_unpacker));
+#else
+ ASSERT_TRUE(registry()->disabled_extensions().Contains(zip_unpacker));
+#endif
+}
+
+TEST_F(ExtensionServiceTest, ShouldNotEnableZipUnpackerExtensionAgainstPolicy) {
+ InitializeEmptyExtensionService();
+
+ GetManagementPolicy()->UnregisterAllProviders();
+ extensions::TestManagementPolicyProvider provider_(
+ extensions::TestManagementPolicyProvider::MUST_REMAIN_DISABLED);
+ GetManagementPolicy()->RegisterProvider(&provider_);
+
+ scoped_refptr<const Extension> zip_unpacker_extension =
+ ExtensionBuilder("stable")
+ .SetID(zip_unpacker)
+ .SetLocation(Manifest::EXTERNAL_COMPONENT)
+ .Build();
+ service()->AddExtension(zip_unpacker_extension.get());
+ service()->DisableExtension(zip_unpacker,
+ extensions::disable_reason::DISABLE_USER_ACTION);
+ ASSERT_TRUE(registry()->disabled_extensions().Contains(zip_unpacker));
+
+ service()->EnableZipUnpackerExtensionForTest();
+ ASSERT_FALSE(registry()->enabled_extensions().Contains(zip_unpacker));
+}