• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
warnings()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