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
20namespace content {
21class BrowserContext;
22class NotificationDetails;
23class NotificationSource;
24}
25
26namespace extensions {
27
28class 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.
34class 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