Pass Reason as a parameter with OnExtensionUnloaded.

BUG=354046

Review URL: https://codereview.chromium.org/222903002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@264837 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/extensions/active_tab_permission_granter.cc b/chrome/browser/extensions/active_tab_permission_granter.cc
index 87b3ce2..51ea1f2 100644
--- a/chrome/browser/extensions/active_tab_permission_granter.cc
+++ b/chrome/browser/extensions/active_tab_permission_granter.cc
@@ -94,7 +94,9 @@
 }
 
 void ActiveTabPermissionGranter::OnExtensionUnloaded(
-    content::BrowserContext* browser_context, const Extension* extension) {
+    content::BrowserContext* browser_context,
+    const Extension* extension,
+    UnloadedExtensionInfo::Reason reason) {
   // Note: don't need to clear the permissions (nor tell the renderer about it)
   // because it's being unloaded anyway.
   granted_extensions_.Remove(extension->id());
diff --git a/chrome/browser/extensions/active_tab_permission_granter.h b/chrome/browser/extensions/active_tab_permission_granter.h
index 24bb4ad..be02bd08 100644
--- a/chrome/browser/extensions/active_tab_permission_granter.h
+++ b/chrome/browser/extensions/active_tab_permission_granter.h
@@ -50,7 +50,9 @@
 
   // extensions::ExtensionRegistryObserver implementation.
   virtual void OnExtensionUnloaded(content::BrowserContext* browser_context,
-                                   const Extension* extension) OVERRIDE;
+                                   const Extension* extension,
+                                   UnloadedExtensionInfo::Reason reason)
+      OVERRIDE;
 
   // Clears any tab-specific permissions for all extensions on |tab_id_| and
   // notifies renderers.
diff --git a/chrome/browser/extensions/api/media_galleries_private/gallery_watch_state_tracker.cc b/chrome/browser/extensions/api/media_galleries_private/gallery_watch_state_tracker.cc
index 3629f38f..6b11c14 100644
--- a/chrome/browser/extensions/api/media_galleries_private/gallery_watch_state_tracker.cc
+++ b/chrome/browser/extensions/api/media_galleries_private/gallery_watch_state_tracker.cc
@@ -208,7 +208,8 @@
 
 void GalleryWatchStateTracker::OnExtensionUnloaded(
     content::BrowserContext* browser_context,
-    const Extension* extension) {
+    const Extension* extension,
+    UnloadedExtensionInfo::Reason reason) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   if (!ContainsKey(watched_extensions_map_, extension->id()))
     return;
diff --git a/chrome/browser/extensions/api/media_galleries_private/gallery_watch_state_tracker.h b/chrome/browser/extensions/api/media_galleries_private/gallery_watch_state_tracker.h
index 985f63c..53e082b7 100644
--- a/chrome/browser/extensions/api/media_galleries_private/gallery_watch_state_tracker.h
+++ b/chrome/browser/extensions/api/media_galleries_private/gallery_watch_state_tracker.h
@@ -93,7 +93,9 @@
   virtual void OnExtensionLoaded(content::BrowserContext* browser_context,
                                  const Extension* extension) OVERRIDE;
   virtual void OnExtensionUnloaded(content::BrowserContext* browser_context,
-                                   const Extension* extension) OVERRIDE;
+                                   const Extension* extension,
+                                   UnloadedExtensionInfo::Reason reason)
+      OVERRIDE;
 
   // Syncs media gallery watch data for the given extension to/from the state
   // storage.
diff --git a/chrome/browser/extensions/error_console/error_console.cc b/chrome/browser/extensions/error_console/error_console.cc
index c689ad4..bdfc201 100644
--- a/chrome/browser/extensions/error_console/error_console.cc
+++ b/chrome/browser/extensions/error_console/error_console.cc
@@ -226,7 +226,8 @@
 }
 
 void ErrorConsole::OnExtensionUnloaded(content::BrowserContext* browser_context,
-                                       const Extension* extension) {
+                                       const Extension* extension,
+                                       UnloadedExtensionInfo::Reason reason) {
   CheckEnabled();
 }
 
diff --git a/chrome/browser/extensions/error_console/error_console.h b/chrome/browser/extensions/error_console/error_console.h
index dacea855..3176ce9 100644
--- a/chrome/browser/extensions/error_console/error_console.h
+++ b/chrome/browser/extensions/error_console/error_console.h
@@ -131,7 +131,9 @@
   // ExtensionRegistry implementation. If the Apps Developer Tools app is
   // installed or uninstalled, we may need to turn the ErrorConsole on/off.
   virtual void OnExtensionUnloaded(content::BrowserContext* browser_context,
-                                   const Extension* extension) OVERRIDE;
+                                   const Extension* extension,
+                                   UnloadedExtensionInfo::Reason reason)
+      OVERRIDE;
   virtual void OnExtensionLoaded(content::BrowserContext* browser_context,
                                  const Extension* extension) OVERRIDE;
 
diff --git a/chrome/browser/extensions/error_console/error_console_unittest.cc b/chrome/browser/extensions/error_console/error_console_unittest.cc
index 2b4e43d9..dcfa60b 100644
--- a/chrome/browser/extensions/error_console/error_console_unittest.cc
+++ b/chrome/browser/extensions/error_console/error_console_unittest.cc
@@ -118,7 +118,7 @@
 
   // Unloading the Apps Developer Tools should disable error console.
   registry->RemoveEnabled(adt->id());
-  registry->TriggerOnUnloaded(adt);
+  registry->TriggerOnUnloaded(adt, UnloadedExtensionInfo::REASON_DISABLE);
   EXPECT_FALSE(error_console_->enabled());
   EXPECT_FALSE(error_console_->IsEnabledForChromeExtensionsPage());
   EXPECT_FALSE(error_console_->IsEnabledForAppsDeveloperTools());
diff --git a/chrome/browser/extensions/extension_action_manager.cc b/chrome/browser/extensions/extension_action_manager.cc
index 781fd03..98e2466 100644
--- a/chrome/browser/extensions/extension_action_manager.cc
+++ b/chrome/browser/extensions/extension_action_manager.cc
@@ -82,7 +82,9 @@
 }
 
 void ExtensionActionManager::OnExtensionUnloaded(
-    content::BrowserContext* browser_context, const Extension* extension) {
+    content::BrowserContext* browser_context,
+    const Extension* extension,
+    UnloadedExtensionInfo::Reason reason) {
   page_actions_.erase(extension->id());
   browser_actions_.erase(extension->id());
   system_indicators_.erase(extension->id());
diff --git a/chrome/browser/extensions/extension_action_manager.h b/chrome/browser/extensions/extension_action_manager.h
index d8f5b91..3315bdc9 100644
--- a/chrome/browser/extensions/extension_action_manager.h
+++ b/chrome/browser/extensions/extension_action_manager.h
@@ -45,7 +45,9 @@
  private:
   // Implement ExtensionRegistryObserver.
   virtual void OnExtensionUnloaded(content::BrowserContext* browser_context,
-                                   const Extension* extension) OVERRIDE;
+                                   const Extension* extension,
+                                   UnloadedExtensionInfo::Reason reason)
+      OVERRIDE;
 
   Profile* profile_;
 
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index 5ab5f6f..9a05d90 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -1067,9 +1067,10 @@
 void ExtensionService::NotifyExtensionUnloaded(
     const Extension* extension,
     UnloadedExtensionInfo::Reason reason) {
-  registry_->TriggerOnUnloaded(extension);
-
   UnloadedExtensionInfo details(extension, reason);
+
+  registry_->TriggerOnUnloaded(extension, reason);
+
   content::NotificationService::current()->Notify(
       chrome::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED,
       content::Source<Profile>(profile_),
diff --git a/chrome/browser/extensions/extension_storage_monitor.cc b/chrome/browser/extensions/extension_storage_monitor.cc
index a5ddf478..ae42ee69 100644
--- a/chrome/browser/extensions/extension_storage_monitor.cc
+++ b/chrome/browser/extensions/extension_storage_monitor.cc
@@ -223,7 +223,8 @@
 
 void ExtensionStorageMonitor::OnExtensionUnloaded(
     content::BrowserContext* browser_context,
-    const Extension* extension) {
+    const Extension* extension,
+    UnloadedExtensionInfo::Reason reason) {
   DCHECK(extension);
   StopMonitoringStorage(extension->id());
 }
diff --git a/chrome/browser/extensions/extension_storage_monitor.h b/chrome/browser/extensions/extension_storage_monitor.h
index 42cb8ed..245f6ed 100644
--- a/chrome/browser/extensions/extension_storage_monitor.h
+++ b/chrome/browser/extensions/extension_storage_monitor.h
@@ -54,7 +54,9 @@
   virtual void OnExtensionLoaded(content::BrowserContext* browser_context,
                                  const Extension* extension) OVERRIDE;
   virtual void OnExtensionUnloaded(content::BrowserContext* browser_context,
-                                   const Extension* extension) OVERRIDE;
+                                   const Extension* extension,
+                                   UnloadedExtensionInfo::Reason reason)
+      OVERRIDE;
 
   std::string GetNotificationId(const std::string& extension_id);
 
diff --git a/chrome/browser/extensions/extension_warning_service.cc b/chrome/browser/extensions/extension_warning_service.cc
index 17284e5..bfb99779 100644
--- a/chrome/browser/extensions/extension_warning_service.cc
+++ b/chrome/browser/extensions/extension_warning_service.cc
@@ -122,7 +122,9 @@
 }
 
 void ExtensionWarningService::OnExtensionUnloaded(
-    content::BrowserContext* browser_context, const Extension* extension) {
+    content::BrowserContext* browser_context,
+    const Extension* extension,
+    UnloadedExtensionInfo::Reason reason) {
   // Unloading one extension might have solved the problems of others.
   // Therefore, we clear warnings of this type for all extensions.
   std::set<ExtensionWarning::WarningType> warning_types =
diff --git a/chrome/browser/extensions/extension_warning_service.h b/chrome/browser/extensions/extension_warning_service.h
index 99755ef..5a6ecf71 100644
--- a/chrome/browser/extensions/extension_warning_service.h
+++ b/chrome/browser/extensions/extension_warning_service.h
@@ -75,7 +75,9 @@
 
   // ExtensionRegistryObserver implementation.
   virtual void OnExtensionUnloaded(content::BrowserContext* browser_context,
-                                   const Extension* extension) OVERRIDE;
+                                   const Extension* extension,
+                                   UnloadedExtensionInfo::Reason reason)
+      OVERRIDE;
 
   // Currently existing warnings.
   ExtensionWarningSet warnings_;
diff --git a/chrome/browser/media_galleries/media_scan_manager.cc b/chrome/browser/media_galleries/media_scan_manager.cc
index e880b98..b631a68 100644
--- a/chrome/browser/media_galleries/media_scan_manager.cc
+++ b/chrome/browser/media_galleries/media_scan_manager.cc
@@ -428,7 +428,8 @@
 
 void MediaScanManager::OnExtensionUnloaded(
     content::BrowserContext* browser_context,
-    const extensions::Extension* extension) {
+    const extensions::Extension* extension,
+    extensions::UnloadedExtensionInfo::Reason reason) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   CancelScan(Profile::FromBrowserContext(browser_context), extension);
 }
diff --git a/chrome/browser/media_galleries/media_scan_manager.h b/chrome/browser/media_galleries/media_scan_manager.h
index 24417584..707bd0e 100644
--- a/chrome/browser/media_galleries/media_scan_manager.h
+++ b/chrome/browser/media_galleries/media_scan_manager.h
@@ -72,7 +72,8 @@
   // extensions::ExtensionRegistryObserver implementation.
   virtual void OnExtensionUnloaded(
       content::BrowserContext* browser_context,
-      const extensions::Extension* extension) OVERRIDE;
+      const extensions::Extension* extension,
+      extensions::UnloadedExtensionInfo::Reason reason) OVERRIDE;
 
   bool ScanInProgress() const;
 
diff --git a/extensions/browser/extension_registry.cc b/extensions/browser/extension_registry.cc
index 9f6b71f09..ac6c274 100644
--- a/extensions/browser/extension_registry.cc
+++ b/extensions/browser/extension_registry.cc
@@ -44,11 +44,13 @@
                     OnExtensionLoaded(browser_context_, extension));
 }
 
-void ExtensionRegistry::TriggerOnUnloaded(const Extension* extension) {
+void ExtensionRegistry::TriggerOnUnloaded(
+    const Extension* extension,
+    UnloadedExtensionInfo::Reason reason) {
   DCHECK(!enabled_extensions_.Contains(extension->id()));
   FOR_EACH_OBSERVER(ExtensionRegistryObserver,
                     observers_,
-                    OnExtensionUnloaded(browser_context_, extension));
+                    OnExtensionUnloaded(browser_context_, extension, reason));
 }
 
 const Extension* ExtensionRegistry::GetExtensionById(const std::string& id,
diff --git a/extensions/browser/extension_registry.h b/extensions/browser/extension_registry.h
index 26e30159..d8df24b36 100644
--- a/extensions/browser/extension_registry.h
+++ b/extensions/browser/extension_registry.h
@@ -71,7 +71,8 @@
 
   // Invokes the observer method OnExtensionUnloaded(). The extension must not
   // be enabled at the time of the call.
-  void TriggerOnUnloaded(const Extension* extension);
+  void TriggerOnUnloaded(const Extension* extension,
+                         UnloadedExtensionInfo::Reason reason);
 
   // Find an extension by ID using |include_mask| to pick the sets to search:
   //  * enabled_extensions()     --> ExtensionRegistry::ENABLED
diff --git a/extensions/browser/extension_registry_observer.h b/extensions/browser/extension_registry_observer.h
index 3b7114b..5880add 100644
--- a/extensions/browser/extension_registry_observer.h
+++ b/extensions/browser/extension_registry_observer.h
@@ -5,6 +5,8 @@
 #ifndef EXTENSIONS_BROWSER_EXTENSION_REGISTRY_OBSERVER_H_
 #define EXTENSIONS_BROWSER_EXTENSION_REGISTRY_OBSERVER_H_
 
+#include "extensions/common/extension.h"
+
 namespace content {
 class BrowserContext;
 }
@@ -12,6 +14,7 @@
 namespace extensions {
 
 class Extension;
+struct UnloadedExtensionInfo;
 
 // Observer for ExtensionRegistry. Exists in a separate header file to reduce
 // the include file burden for typical clients of ExtensionRegistry.
@@ -27,9 +30,9 @@
 
   // Called after an extension is unloaded. The extension no longer exists in
   // any of the ExtensionRegistry sets (enabled, disabled, etc.).
-  virtual void OnExtensionUnloaded(
-      content::BrowserContext* browser_context,
-      const Extension* extension) {}
+  virtual void OnExtensionUnloaded(content::BrowserContext* browser_context,
+                                   const Extension* extension,
+                                   UnloadedExtensionInfo::Reason reason) {}
 };
 
 }  // namespace extensions
diff --git a/extensions/browser/extension_registry_unittest.cc b/extensions/browser/extension_registry_unittest.cc
index 11ca3fc..f212f6c8 100644
--- a/extensions/browser/extension_registry_unittest.cc
+++ b/extensions/browser/extension_registry_unittest.cc
@@ -49,7 +49,9 @@
   }
 
   virtual void OnExtensionUnloaded(content::BrowserContext* browser_context,
-                                   const Extension* extension) OVERRIDE {
+                                   const Extension* extension,
+                                   UnloadedExtensionInfo::Reason reason)
+      OVERRIDE {
     unloaded_.push_back(extension);
   }
 
@@ -225,7 +227,7 @@
   observer.Reset();
 
   registry.RemoveEnabled(extension->id());
-  registry.TriggerOnUnloaded(extension);
+  registry.TriggerOnUnloaded(extension, UnloadedExtensionInfo::REASON_DISABLE);
 
   EXPECT_TRUE(observer.loaded().empty());
   EXPECT_TRUE(HasSingleExtension(observer.unloaded(), extension.get()));
diff --git a/extensions/browser/runtime_data.cc b/extensions/browser/runtime_data.cc
index ea5568b..8f359bc 100644
--- a/extensions/browser/runtime_data.cc
+++ b/extensions/browser/runtime_data.cc
@@ -53,9 +53,9 @@
   extension_flags_.clear();
 }
 
-void RuntimeData::OnExtensionUnloaded(
-    content::BrowserContext* browser_context,
-    const Extension* extension) {
+void RuntimeData::OnExtensionUnloaded(content::BrowserContext* browser_context,
+                                      const Extension* extension,
+                                      UnloadedExtensionInfo::Reason reason) {
   extension_flags_.erase(extension->id());
 }
 
diff --git a/extensions/browser/runtime_data.h b/extensions/browser/runtime_data.h
index 77f475b..0dd2cb3 100644
--- a/extensions/browser/runtime_data.h
+++ b/extensions/browser/runtime_data.h
@@ -53,7 +53,9 @@
 
   // ExtensionRegistryObserver overrides. Public for testing.
   virtual void OnExtensionUnloaded(content::BrowserContext* browser_context,
-                                   const Extension* extension) OVERRIDE;
+                                   const Extension* extension,
+                                   UnloadedExtensionInfo::Reason reason)
+      OVERRIDE;
 
  private:
   // Bitmasks for runtime states.
diff --git a/extensions/browser/runtime_data_unittest.cc b/extensions/browser/runtime_data_unittest.cc
index 48c1bbc..f0cbf4e 100644
--- a/extensions/browser/runtime_data_unittest.cc
+++ b/extensions/browser/runtime_data_unittest.cc
@@ -100,7 +100,8 @@
   runtime_data_.SetBackgroundPageReady(extension, true);
   ASSERT_TRUE(runtime_data_.HasExtensionForTesting(extension));
 
-  runtime_data_.OnExtensionUnloaded(NULL, extension);
+  runtime_data_.OnExtensionUnloaded(
+      NULL, extension, UnloadedExtensionInfo::REASON_DISABLE);
   EXPECT_FALSE(runtime_data_.HasExtensionForTesting(extension));
 }
 
diff --git a/extensions/common/extension.h b/extensions/common/extension.h
index c7b84581..3354fa6 100644
--- a/extensions/common/extension.h
+++ b/extensions/common/extension.h
@@ -511,6 +511,7 @@
 };
 
 struct UnloadedExtensionInfo {
+  // TODO(DHNishi): Move this enum to ExtensionRegistryObserver.
   enum Reason {
     REASON_DISABLE,    // Extension is being disabled.
     REASON_UPDATE,     // Extension is being updated to a newer version.