// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef EXTENSIONS_BROWSER_EXTENSION_REGISTRY_OBSERVER_H_
#define EXTENSIONS_BROWSER_EXTENSION_REGISTRY_OBSERVER_H_

#include "extensions/browser/uninstall_reason.h"

namespace content {
class BrowserContext;
}

namespace extensions {
class Extension;
class ExtensionRegistry;
enum class UnloadedExtensionReason;

// Observer for ExtensionRegistry. Exists in a separate header file to reduce
// the include file burden for typical clients of ExtensionRegistry.
//
// There are separate event categories for loading (the OnExtensionLoaded,
// OnExtensionReady and OnExtensionUnloaded events) and installing (the
// OnExtensionWillBeInstalled, OnExtensionInstalled and OnExtensionUninstalled)
// extensions.
//
// For example, comparing OnExtensionLoaded and OnExtensionInstalled,
// OnExtensionLoaded is called whenever an extension is added to the "enabled"
// set of the extension registry. This includes:
//
//  - Extensions being loaded at Chrome startup.
//  - Extensions being reloaded:
//    * as part of an update.
//    * from a crash.
//    * from a disabled state (if the user toggled disabled -> enabled).
//    * as part of internal bookkeeping (we reload extensions on file access
//      being granted, for instance).
//    * if the extension requested it (chrome.runtime.reload()).
//    * probably others.
//  - New extensions being loaded for the first time (as part of installation).
//
// OnExtensionInstalled is called when a *new* extension is added, *or* when an
// extension is updated to a *new* version. It is not called for existing
// extensions being loaded at startup, etc. In a common run of Chrome, you
// probably won't get many "OnInstalled" events.
//
// As a general rule, most sites should observe OnExtensionLoaded, because they
// want to see "what are the enabled extensions".
class ExtensionRegistryObserver {
 public:
  virtual ~ExtensionRegistryObserver() = default;

  // Called after an extension is loaded. The extension will exclusively exist
  // in the enabled_extensions set of ExtensionRegistry.
  virtual void OnExtensionLoaded(
      content::BrowserContext* browser_context,
      const Extension* extension) {}

  // Called after an extension is loaded and all necessary browser state is
  // initialized to support the start of the extension's child process.
  virtual void OnExtensionReady(content::BrowserContext* browser_context,
                                const Extension* extension) {}

  // Called after an extension is unloaded. The extension no longer exists in
  // the set |ExtensionRegistry::enabled_extensions()|, but it can still be a
  // member of one of the other sets, like disabled, blocklisted or terminated.
  virtual void OnExtensionUnloaded(content::BrowserContext* browser_context,
                                   const Extension* extension,
                                   UnloadedExtensionReason reason) {}

  // Called when `extension` is about to be installed. `is_update` is true if
  // the installation is the result of it updating, in which case `old_name` is
  // the name of the extension's previous version.
  // The ExtensionRegistry will not be tracking `extension` at the time this
  // event is fired, but will be immediately afterwards (note: not necessarily
  // enabled; it might be installed in the disabled or even blocklisted sets,
  // for example).
  // Note that it's much more common to care about extensions being loaded
  // (OnExtensionLoaded).
  //
  // TODO(tmdiep): We should stash the state of the previous extension version
  // somewhere and have observers retrieve it. `is_update`, and `old_name` can
  // be removed when this is done.
  virtual void OnExtensionWillBeInstalled(
      content::BrowserContext* browser_context,
      const Extension* extension,
      bool is_update,
      const std::string& old_name) {}

  // Called when the installation of `extension` is complete. At this point the
  // extension is tracked in one of the ExtensionRegistry sets, but is not
  // necessarily enabled.
  virtual void OnExtensionInstalled(content::BrowserContext* browser_context,
                                    const Extension* extension,
                                    bool is_update) {}

  // Called after an extension is uninstalled. The extension no longer exists in
  // any of the ExtensionRegistry sets (enabled, disabled, etc.).
  virtual void OnExtensionUninstalled(content::BrowserContext* browser_context,
                                      const Extension* extension,
                                      UninstallReason reason) {}

  // Called after the uninstallation of an extension is denied.
  virtual void OnExtensionUninstallationDenied(
      content::BrowserContext* browser_context,
      const Extension* extension) {}

  // Notifies observers that the observed object is going away.
  virtual void OnShutdown(ExtensionRegistry* registry) {}
};

}  // namespace extensions

#endif  // EXTENSIONS_BROWSER_EXTENSION_REGISTRY_OBSERVER_H_
