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