Home | History | Annotate | Download | only in extensions
      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 CHROME_BROWSER_EXTENSIONS_EXTENSION_WARNING_SERVICE_H_
      6 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_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 "chrome/browser/extensions/extension_warning_set.h"
     16 #include "extensions/browser/extension_registry_observer.h"
     17 
     18 // TODO(battre) Remove the Extension prefix.
     19 
     20 class Profile;
     21 
     22 namespace content {
     23 class NotificationDetails;
     24 class NotificationSource;
     25 }
     26 
     27 namespace extensions {
     28 
     29 class ExtensionRegistry;
     30 
     31 // Manages a set of warnings caused by extensions. These warnings (e.g.
     32 // conflicting modifications of network requests by extensions, slow extensions,
     33 // etc.) trigger a warning badge in the UI and and provide means to resolve
     34 // them. This class must be used on the UI thread only.
     35 class ExtensionWarningService : public ExtensionRegistryObserver,
     36                                 public base::NonThreadSafe {
     37  public:
     38   class Observer {
     39    public:
     40     virtual void ExtensionWarningsChanged() = 0;
     41   };
     42 
     43   // |profile| may be NULL for testing. In this case, be sure to not insert
     44   // any warnings.
     45   explicit ExtensionWarningService(Profile* profile);
     46   virtual ~ExtensionWarningService();
     47 
     48   // Clears all warnings of types contained in |types| and notifies observers
     49   // of the changed warnings.
     50   void ClearWarnings(const std::set<ExtensionWarning::WarningType>& types);
     51 
     52   // Returns all types of warnings effecting extension |extension_id|.
     53   std::set<ExtensionWarning::WarningType> GetWarningTypesAffectingExtension(
     54       const std::string& extension_id) const;
     55 
     56   // Returns all localized warnings for extension |extension_id| in |result|.
     57   std::vector<std::string> GetWarningMessagesForExtension(
     58       const std::string& extension_id) const;
     59 
     60   const ExtensionWarningSet& warnings() const { return warnings_; }
     61 
     62   // Adds a set of warnings and notifies observers if any warning is new.
     63   void AddWarnings(const ExtensionWarningSet& warnings);
     64 
     65   // Notifies the ExtensionWarningService of profile |profile_id| that new
     66   // |warnings| occurred and triggers a warning badge.
     67   static void NotifyWarningsOnUI(void* profile_id,
     68                                  const ExtensionWarningSet& warnings);
     69 
     70   void AddObserver(Observer* observer);
     71   void RemoveObserver(Observer* observer);
     72 
     73  private:
     74   void NotifyWarningsChanged();
     75 
     76   // ExtensionRegistryObserver implementation.
     77   virtual void OnExtensionUnloaded(content::BrowserContext* browser_context,
     78                                    const Extension* extension,
     79                                    UnloadedExtensionInfo::Reason reason)
     80       OVERRIDE;
     81 
     82   // Currently existing warnings.
     83   ExtensionWarningSet warnings_;
     84 
     85   Profile* profile_;
     86 
     87   // Listen to extension unloaded notifications.
     88   ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
     89       extension_registry_observer_;
     90 
     91   ObserverList<Observer> observer_list_;
     92 };
     93 
     94 }  // namespace extensions
     95 
     96 #endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_WARNING_SERVICE_H_
     97