Home | History | Annotate | Download | only in browser
      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