Allow terminated extension to be uninstalled from chrome://extensions page.
BUG=73210
TEST=Added CrashAndUninstall browser test.
Review URL: http://codereview.chromium.org/6576003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@75808 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index efceb54a..5a19f48 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -395,7 +395,8 @@
// We can't call UninstallExtension with an invalid extension ID, so check it
// first.
- if (extensions_service->GetExtensionById(extension_id, true)) {
+ if (extensions_service->GetExtensionById(extension_id, true) ||
+ extensions_service->GetTerminatedExtension(extension_id)) {
extensions_service->UninstallExtension(extension_id, false);
} else {
LOG(WARNING) << "Attempted uninstallation of non-existent extension with "
@@ -747,6 +748,8 @@
const Extension* extension =
GetExtensionByIdInternal(extension_id, true, true);
+ if (!extension)
+ extension = GetTerminatedExtension(extension_id);
// Callers should not send us nonexistent extensions.
CHECK(extension);
@@ -785,6 +788,7 @@
}
ClearExtensionData(extension_url);
+ UntrackTerminatedExtension(extension_id);
// Notify interested parties that we've uninstalled this extension.
NotificationService::current()->Notify(
@@ -1786,6 +1790,17 @@
}
}
+const Extension* ExtensionService::GetTerminatedExtension(
+ const std::string& id) {
+ std::string lowercase_id = StringToLowerASCII(id);
+ for (ExtensionList::const_iterator iter = terminated_extensions_.begin();
+ iter != terminated_extensions_.end(); ++iter) {
+ if ((*iter)->id() == lowercase_id)
+ return *iter;
+ }
+ return NULL;
+}
+
const Extension* ExtensionService::GetWebStoreApp() {
return GetExtensionById(extension_misc::kWebStoreAppId, false);
}