Revert 285173 "Removed InProcessBrowserTest::CleanUpOnMainThread()"
[chromium-blink-merge.git] / chrome / browser / extensions / extension_storage_monitor.h
blob144c42e841f5d45242e2921b957327d485de5b4f
1 // Copyright 2014 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.
5 #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_STORAGE_MONITOR_H_
6 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_STORAGE_MONITOR_H_
8 #include <set>
10 #include "base/memory/ref_counted.h"
11 #include "base/memory/weak_ptr.h"
12 #include "base/scoped_observer.h"
13 #include "chrome/browser/extensions/extension_uninstall_dialog.h"
14 #include "components/keyed_service/core/keyed_service.h"
15 #include "content/public/browser/notification_observer.h"
16 #include "content/public/browser/notification_registrar.h"
17 #include "extensions/browser/extension_registry_observer.h"
19 namespace content {
20 class BrowserContext;
23 namespace gfx {
24 class Image;
27 namespace extensions {
29 class Extension;
30 class ExtensionPrefs;
31 class ExtensionRegistry;
32 class StorageEventObserver;
34 // ExtensionStorageMonitor monitors the storage usage of extensions and apps
35 // that are granted unlimited storage and displays notifications when high
36 // usage is detected.
37 class ExtensionStorageMonitor : public KeyedService,
38 public content::NotificationObserver,
39 public ExtensionRegistryObserver,
40 public ExtensionUninstallDialog::Delegate {
41 public:
42 static ExtensionStorageMonitor* Get(content::BrowserContext* context);
44 // Indices of buttons in the notification. Exposed for testing.
45 enum ButtonIndex {
46 BUTTON_DISABLE_NOTIFICATION = 0,
47 BUTTON_UNINSTALL
50 explicit ExtensionStorageMonitor(content::BrowserContext* context);
51 virtual ~ExtensionStorageMonitor();
53 private:
54 // content::NotificationObserver overrides:
55 virtual void Observe(int type,
56 const content::NotificationSource& source,
57 const content::NotificationDetails& details) OVERRIDE;
59 // ExtensionRegistryObserver overrides:
60 virtual void OnExtensionLoaded(content::BrowserContext* browser_context,
61 const Extension* extension) OVERRIDE;
62 virtual void OnExtensionUnloaded(
63 content::BrowserContext* browser_context,
64 const Extension* extension,
65 UnloadedExtensionInfo::Reason reason) OVERRIDE;
66 virtual void OnExtensionWillBeInstalled(
67 content::BrowserContext* browser_context,
68 const Extension* extension,
69 bool is_update,
70 bool from_ephemeral,
71 const std::string& old_name) OVERRIDE;
72 virtual void OnExtensionUninstalled(
73 content::BrowserContext* browser_context,
74 const Extension* extension,
75 extensions::UninstallReason reason) OVERRIDE;
77 // Overridden from ExtensionUninstallDialog::Delegate:
78 virtual void ExtensionUninstallAccepted() OVERRIDE;
79 virtual void ExtensionUninstallCanceled() OVERRIDE;
81 std::string GetNotificationId(const std::string& extension_id);
83 void OnStorageThresholdExceeded(const std::string& extension_id,
84 int64 next_threshold,
85 int64 current_usage);
86 void OnImageLoaded(const std::string& extension_id,
87 int64 current_usage,
88 const gfx::Image& image);
89 void OnNotificationButtonClick(const std::string& extension_id,
90 int button_index);
92 void DisableStorageMonitoring(const std::string& extension_id);
93 void StartMonitoringStorage(const Extension* extension);
94 void StopMonitoringStorage(const std::string& extension_id);
95 void StopMonitoringAll();
97 void RemoveNotificationForExtension(const std::string& extension_id);
98 void RemoveAllNotifications();
100 // Displays the prompt for uninstalling the extension.
101 void ShowUninstallPrompt(const std::string& extension_id);
103 // Returns/sets the next threshold for displaying a notification if an
104 // extension or app consumes excessive disk space.
105 int64 GetNextStorageThreshold(const std::string& extension_id) const;
106 void SetNextStorageThreshold(const std::string& extension_id,
107 int64 next_threshold);
109 // Returns the raw next storage threshold value stored in prefs. Returns 0 if
110 // the initial threshold has not yet been reached.
111 int64 GetNextStorageThresholdFromPrefs(const std::string& extension_id) const;
113 // Returns/sets whether notifications should be shown if an extension or app
114 // consumes too much disk space.
115 bool IsStorageNotificationEnabled(const std::string& extension_id) const;
116 void SetStorageNotificationEnabled(const std::string& extension_id,
117 bool enable_notifications);
119 // Initially, monitoring will only be applied to ephemeral apps. This flag
120 // is set by tests to enable for all extensions and apps.
121 bool enable_for_all_extensions_;
123 // The first notification is shown after the initial threshold is exceeded.
124 // Ephemeral apps have a lower threshold than fully installed extensions.
125 // A lower threshold is set by tests.
126 int64 initial_extension_threshold_;
127 int64 initial_ephemeral_threshold_;
129 // The rate (in seconds) at which we would like to receive storage updates
130 // from QuotaManager. Overridden in tests.
131 int observer_rate_;
133 // IDs of extensions that notifications were shown for.
134 std::set<std::string> notified_extension_ids_;
136 content::BrowserContext* context_;
137 extensions::ExtensionPrefs* extension_prefs_;
139 content::NotificationRegistrar registrar_;
140 ScopedObserver<extensions::ExtensionRegistry,
141 extensions::ExtensionRegistryObserver>
142 extension_registry_observer_;
144 // StorageEventObserver monitors storage for extensions on the IO thread.
145 scoped_refptr<StorageEventObserver> storage_observer_;
147 // Modal dialog used to confirm removal of an extension.
148 scoped_ptr<ExtensionUninstallDialog> uninstall_dialog_;
150 // The ID of the extension that is the subject of the uninstall confirmation
151 // dialog.
152 std::string uninstall_extension_id_;
154 base::WeakPtrFactory<ExtensionStorageMonitor> weak_ptr_factory_;
156 friend class StorageEventObserver;
157 friend class ExtensionStorageMonitorTest;
159 DISALLOW_COPY_AND_ASSIGN(ExtensionStorageMonitor);
162 } // namespace extensions
164 #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_STORAGE_MONITOR_H_