// Copyright (c) 2012 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_WARNING_SERVICE_H_ #define EXTENSIONS_BROWSER_WARNING_SERVICE_H_ #include #include #include #include "base/observer_list.h" #include "base/scoped_observer.h" #include "base/threading/non_thread_safe.h" #include "components/keyed_service/core/keyed_service.h" #include "extensions/browser/extension_registry_observer.h" #include "extensions/browser/warning_set.h" // TODO(battre) Remove the Extension prefix. namespace content { class BrowserContext; class NotificationDetails; class NotificationSource; } namespace extensions { class ExtensionRegistry; // Manages a set of warnings caused by extensions. These warnings (e.g. // conflicting modifications of network requests by extensions, slow extensions, // etc.) trigger a warning badge in the UI and and provide means to resolve // them. This class must be used on the UI thread only. class WarningService : public KeyedService, public ExtensionRegistryObserver, public base::NonThreadSafe { public: class Observer { public: virtual void ExtensionWarningsChanged( const ExtensionIdSet& affected_extensions) = 0; }; // |browser_context| may be NULL for testing. In this case, be sure to not // insert any warnings. explicit WarningService(content::BrowserContext* browser_context); ~WarningService() override; // Get the instance of the WarningService for |browser_context|. // Redirected in incognito. static WarningService* Get(content::BrowserContext* browser_context); // Clears all warnings of types contained in |types| and notifies observers // of the changed warnings. void ClearWarnings(const std::set& types); // Returns all types of warnings effecting extension |extension_id|. std::set GetWarningTypesAffectingExtension( const std::string& extension_id) const; // Returns all localized warnings for extension |extension_id| in |result|. std::vector GetWarningMessagesForExtension( const std::string& extension_id) const; const WarningSet& warnings() const { return warnings_; } // Adds a set of warnings and notifies observers if any warning is new. void AddWarnings(const WarningSet& warnings); // Notifies the WarningService of browser_context |browser_context_id| that // new |warnings| occurred and triggers a warning badge. static void NotifyWarningsOnUI(void* profile_id, const WarningSet& warnings); void AddObserver(Observer* observer); void RemoveObserver(Observer* observer); private: void NotifyWarningsChanged(const ExtensionIdSet& affected_extensions); // ExtensionRegistryObserver implementation. void OnExtensionUnloaded(content::BrowserContext* browser_context, const Extension* extension, UnloadedExtensionInfo::Reason reason) override; // Currently existing warnings. WarningSet warnings_; content::BrowserContext* const browser_context_; // Listen to extension unloaded notifications. ScopedObserver extension_registry_observer_; base::ObserverList observer_list_; }; } // namespace extensions #endif // EXTENSIONS_BROWSER_WARNING_SERVICE_H_