| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef EXTENSIONS_BROWSER_EXTENSION_PREFS_OBSERVER_H_ |
| #define EXTENSIONS_BROWSER_EXTENSION_PREFS_OBSERVER_H_ |
| |
| #include <string> |
| |
| #include "base/time/time.h" |
| |
| namespace extensions { |
| |
| class ExtensionPrefs; |
| |
| class ExtensionPrefsObserver { |
| public: |
| // Called when the reasons for an extension being disabled have changed. |
| // This is *not* called when the disable reasons change due to the extension |
| // being enabled/disabled. |
| virtual void OnExtensionDisableReasonsChanged(const std::string& extension_id, |
| int disabled_reasons) {} |
| |
| // Called when an extension is registered with ExtensionPrefs. |
| virtual void OnExtensionRegistered(const std::string& extension_id, |
| const base::Time& install_time, |
| bool is_enabled) {} |
| |
| // Called when an extension's prefs have been loaded. |
| virtual void OnExtensionPrefsLoaded(const std::string& extension_id, |
| const ExtensionPrefs* prefs) {} |
| |
| // Called when an extension's prefs are deleted. |
| virtual void OnExtensionPrefsDeleted(const std::string& extension_id) {} |
| |
| // Called when an extension's enabled state pref is changed. |
| // Note: This does not necessarily correspond to the extension being loaded/ |
| // unloaded. For that, observe the ExtensionRegistry, and reconcile that the |
| // events might not match up. |
| virtual void OnExtensionStateChanged(const std::string& extension_id, |
| bool state) {} |
| |
| // Called when the runtime permissions for an extension are changed. |
| // TODO(devlin): This is a bit out of place here, and may be better suited on |
| // a general "extension permissions" observer, if/when we have one. See |
| // discussion at |
| // https://chromium-review.googlesource.com/c/chromium/src/+/1196107/3/chrome/browser/extensions/runtime_permissions_observer.h#26. |
| virtual void OnExtensionRuntimePermissionsChanged( |
| const std::string& extension_id) {} |
| |
| // Called when an extension's last-launch-time has changed. |
| virtual void OnExtensionLastLaunchTimeChanged( |
| const std::string& extension_id, |
| const base::Time& last_launch_time) {} |
| |
| // Called when the ExtensionPrefs object (the thing that this observer |
| // observes) will be destroyed. In response, the observer, |this|, should |
| // call "prefs->RemoveObserver(this)", whether directly or indirectly (e.g. |
| // via ScopedObserver::Remove). |
| virtual void OnExtensionPrefsWillBeDestroyed(ExtensionPrefs* prefs) {} |
| }; |
| |
| // An ExtensionPrefsObserver that's part of the GetEarlyExtensionPrefsObservers |
| // mechanism, where the ExtensionPrefsObserver needs to connect to an |
| // ExtensionPrefs, but the ExtensionPrefs doesn't exist yet. This |
| // OnExtensionPrefsAvailable method lets the connection happen during or |
| // shortly after the ExtensionPrefs constructor. |
| class EarlyExtensionPrefsObserver { |
| public: |
| // Called when "prefs->AddObserver(observer)" should be called, during or |
| // shortly after |prefs|' constructor. OnExtensionPrefsAvailable |
| // implementations should make that AddObserver call, but are also |
| // responsible for making the matching RemoveObserver call at an appropriate |
| // time, no later than during the observer's destructor. Otherwise, the |
| // observee (the |prefs| object) will follow a dangling pointer whenever the |
| // next event occurs. |
| // |
| // Making that RemoveObserver call at the right time has to be the |
| // responsibility of the observer, not the observee, since the observee does |
| // not know when the observer is destroyed or is otherwise no longer |
| // interested in events. |
| // |
| // Given that the observer is responsible for calling RemoveObserver, it is |
| // cleaner for the observer, not the observee, to also be responsible for |
| // calling AddObserver. |
| // |
| // The recommended technique for ensuring matching AddObserver and |
| // RemoveObserver calls is to used a ScopedObserver. |
| // |
| // Unlike other ExtensionPrefsObserver methods, this method does not have an |
| // "const std::string& extension_id" argument. It is not about any one |
| // particular extension, it is about the extension preferences as a whole. |
| virtual void OnExtensionPrefsAvailable(ExtensionPrefs* prefs) = 0; |
| }; |
| |
| } // namespace extensions |
| |
| #endif // EXTENSIONS_BROWSER_EXTENSION_PREFS_OBSERVER_H_ |