1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef EXTENSIONS_BROWSER_WARNING_SERVICE_H_ 6 #define EXTENSIONS_BROWSER_WARNING_SERVICE_H_ 7 8 #include <set> 9 #include <string> 10 #include <vector> 11 12 #include "base/observer_list.h" 13 #include "base/scoped_observer.h" 14 #include "base/threading/non_thread_safe.h" 15 #include "extensions/browser/extension_registry_observer.h" 16 #include "extensions/browser/warning_set.h" 17 18 // TODO(battre) Remove the Extension prefix. 19 20 namespace content { 21 class BrowserContext; 22 class NotificationDetails; 23 class NotificationSource; 24 } 25 26 namespace extensions { 27 28 class ExtensionRegistry; 29 30 // Manages a set of warnings caused by extensions. These warnings (e.g. 31 // conflicting modifications of network requests by extensions, slow extensions, 32 // etc.) trigger a warning badge in the UI and and provide means to resolve 33 // them. This class must be used on the UI thread only. 34 class WarningService : public ExtensionRegistryObserver, 35 public base::NonThreadSafe { 36 public: 37 class Observer { 38 public: 39 virtual void ExtensionWarningsChanged() = 0; 40 }; 41 42 // |browser_context| may be NULL for testing. In this case, be sure to not 43 // insert any warnings. 44 explicit WarningService(content::BrowserContext* browser_context); 45 virtual ~WarningService(); 46 47 // Clears all warnings of types contained in |types| and notifies observers 48 // of the changed warnings. 49 void ClearWarnings(const std::set<Warning::WarningType>& types); 50 51 // Returns all types of warnings effecting extension |extension_id|. 52 std::set<Warning::WarningType> GetWarningTypesAffectingExtension( 53 const std::string& extension_id) const; 54 55 // Returns all localized warnings for extension |extension_id| in |result|. 56 std::vector<std::string> GetWarningMessagesForExtension( 57 const std::string& extension_id) const; 58 59 const WarningSet& warnings() const { return warnings_; } 60 61 // Adds a set of warnings and notifies observers if any warning is new. 62 void AddWarnings(const WarningSet& warnings); 63 64 // Notifies the WarningService of browser_context |browser_context_id| that 65 // new |warnings| occurred and triggers a warning badge. 66 static void NotifyWarningsOnUI(void* profile_id, const WarningSet& warnings); 67 68 void AddObserver(Observer* observer); 69 void RemoveObserver(Observer* observer); 70 71 private: 72 void NotifyWarningsChanged(); 73 74 // ExtensionRegistryObserver implementation. 75 virtual void OnExtensionUnloaded(content::BrowserContext* browser_context, 76 const Extension* extension, 77 UnloadedExtensionInfo::Reason reason) 78 OVERRIDE; 79 80 // Currently existing warnings. 81 WarningSet warnings_; 82 83 content::BrowserContext* const browser_context_; 84 85 // Listen to extension unloaded notifications. 86 ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> 87 extension_registry_observer_; 88 89 ObserverList<Observer> observer_list_; 90 }; 91 92 } // namespace extensions 93 94 #endif // EXTENSIONS_BROWSER_WARNING_SERVICE_H_ 95