Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Side by Side Diff: content/public/test/download_test_observer.h

Issue 10855116: Move DownloadTestObserver and friends down into content. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Incorporated comments. Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « content/content_tests.gypi ('k') | content/test/download_test_observer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_TEST_OBSERVER_H_ 5 #ifndef CONTENT_TEST_DOWNLOAD_TEST_OBSERVER_H_
6 #define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_TEST_OBSERVER_H_ 6 #define CONTENT_TEST_DOWNLOAD_TEST_OBSERVER_H_
7 7
8 #include <set> 8 #include <set>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/basictypes.h" 11 #include "base/basictypes.h"
12 #include "base/memory/ref_counted.h" 12 #include "base/memory/ref_counted.h"
13 #include "content/public/browser/download_item.h" 13 #include "content/public/browser/download_item.h"
14 #include "content/public/browser/download_manager.h" 14 #include "content/public/browser/download_manager.h"
15 #include "content/public/browser/download_url_parameters.h" 15 #include "content/public/browser/download_url_parameters.h"
16 #include "net/base/net_errors.h" 16 #include "net/base/net_errors.h"
17 17
18 namespace internal { 18 namespace content {
19 class MockFileChooserDownloadManagerDelegate;
20 }
21
22 class Profile;
23 19
24 // Detects changes to the downloads after construction. 20 // Detects changes to the downloads after construction.
25 // Finishes when one of the following happens: 21 // Finishes when one of the following happens:
26 // - A specified number of downloads change to a terminal state (defined 22 // - A specified number of downloads change to a terminal state (defined
27 // in derived classes). 23 // in derived classes).
28 // - Specific events, such as a select file dialog. 24 // - Specific events, such as a select file dialog.
29 // Callers may either probe for the finished state, or wait on it. 25 // Callers may either probe for the finished state, or wait on it.
30 // 26 //
31 // TODO(rdsmith): Detect manager going down, remove pointer to 27 // TODO(rdsmith): Detect manager going down, remove pointer to
32 // DownloadManager, transition to finished. (For right now we 28 // DownloadManager, transition to finished. (For right now we
33 // just use a scoped_refptr<> to keep it around, but that may cause 29 // just use a scoped_refptr<> to keep it around, but that may cause
34 // timeouts on waiting if a DownloadManager::Shutdown() occurs which 30 // timeouts on waiting if a DownloadManager::Shutdown() occurs which
35 // cancels our in-progress downloads.) 31 // cancels our in-progress downloads.)
36 class DownloadTestObserver : public content::DownloadManager::Observer, 32 class DownloadTestObserver : public DownloadManager::Observer,
37 public content::DownloadItem::Observer { 33 public DownloadItem::Observer {
38 public: 34 public:
39 // Action an observer should take if a dangerous download is encountered. 35 // Action an observer should take if a dangerous download is encountered.
40 enum DangerousDownloadAction { 36 enum DangerousDownloadAction {
41 ON_DANGEROUS_DOWNLOAD_ACCEPT, // Accept the download 37 ON_DANGEROUS_DOWNLOAD_ACCEPT, // Accept the download
42 ON_DANGEROUS_DOWNLOAD_DENY, // Deny the download 38 ON_DANGEROUS_DOWNLOAD_DENY, // Deny the download
43 ON_DANGEROUS_DOWNLOAD_FAIL // Fail if a dangerous download is seen 39 ON_DANGEROUS_DOWNLOAD_FAIL // Fail if a dangerous download is seen
44 }; 40 };
45 41
46 // Create an object that will be considered finished when |wait_count| 42 // Create an object that will be considered finished when |wait_count|
47 // download items have entered a terminal state. 43 // download items have entered a terminal state.
48 DownloadTestObserver( 44 DownloadTestObserver(DownloadManager* download_manager,
49 content::DownloadManager* download_manager, 45 size_t wait_count,
50 size_t wait_count, 46 DangerousDownloadAction dangerous_download_action);
51 DangerousDownloadAction dangerous_download_action);
52 47
53 virtual ~DownloadTestObserver(); 48 virtual ~DownloadTestObserver();
54 49
55 // Wait for the requested number of downloads to enter a terminal state. 50 // Wait for the requested number of downloads to enter a terminal state.
56 void WaitForFinished(); 51 void WaitForFinished();
57 52
58 // Return true if everything's happened that we're configured for. 53 // Return true if everything's happened that we're configured for.
59 bool IsFinished() const; 54 bool IsFinished() const;
60 55
61 // content::DownloadItem::Observer 56 // DownloadItem::Observer
62 virtual void OnDownloadUpdated(content::DownloadItem* download) OVERRIDE; 57 virtual void OnDownloadUpdated(DownloadItem* download) OVERRIDE;
63 virtual void OnDownloadDestroyed(content::DownloadItem* download) OVERRIDE; 58 virtual void OnDownloadDestroyed(DownloadItem* download) OVERRIDE;
64 59
65 // content::DownloadManager::Observer 60 // DownloadManager::Observer
66 virtual void ModelChanged(content::DownloadManager* manager) OVERRIDE; 61 virtual void ModelChanged(DownloadManager* manager) OVERRIDE;
67 62
68 size_t NumDangerousDownloadsSeen() const; 63 size_t NumDangerousDownloadsSeen() const;
69 64
70 size_t NumDownloadsSeenInState( 65 size_t NumDownloadsSeenInState(DownloadItem::DownloadState state) const;
71 content::DownloadItem::DownloadState state) const;
72 66
73 protected: 67 protected:
74 // Only to be called by derived classes' constructors. 68 // Only to be called by derived classes' constructors.
75 virtual void Init(); 69 virtual void Init();
76 70
77 // Called to see if a download item is in a final state. 71 // Called to see if a download item is in a final state.
78 virtual bool IsDownloadInFinalState(content::DownloadItem* download) = 0; 72 virtual bool IsDownloadInFinalState(DownloadItem* download) = 0;
79 73
80 private: 74 private:
81 typedef std::set<content::DownloadItem*> DownloadSet; 75 typedef std::set<DownloadItem*> DownloadSet;
82 76
83 // Maps states to the number of times they have been encountered 77 // Maps states to the number of times they have been encountered
84 typedef std::map<content::DownloadItem::DownloadState, size_t> StateMap; 78 typedef std::map<DownloadItem::DownloadState, size_t> StateMap;
85 79
86 // Called when we know that a download item is in a final state. 80 // Called when we know that a download item is in a final state.
87 // Note that this is not the same as it first transitioning in to the 81 // Note that this is not the same as it first transitioning in to the
88 // final state; multiple notifications may occur once the item is in 82 // final state; multiple notifications may occur once the item is in
89 // that state. So we keep our own track of transitions into final. 83 // that state. So we keep our own track of transitions into final.
90 void DownloadInFinalState(content::DownloadItem* download); 84 void DownloadInFinalState(DownloadItem* download);
91 85
92 void SignalIfFinished(); 86 void SignalIfFinished();
93 87
94 // The observed download manager. 88 // The observed download manager.
95 scoped_refptr<content::DownloadManager> download_manager_; 89 scoped_refptr<DownloadManager> download_manager_;
96 90
97 // The set of DownloadItem's that have transitioned to their finished state 91 // The set of DownloadItem's that have transitioned to their finished state
98 // since construction of this object. When the size of this array 92 // since construction of this object. When the size of this array
99 // reaches wait_count_, we're done. 93 // reaches wait_count_, we're done.
100 DownloadSet finished_downloads_; 94 DownloadSet finished_downloads_;
101 95
102 // The set of DownloadItem's we are currently observing. Generally there 96 // The set of DownloadItem's we are currently observing. Generally there
103 // won't be any overlap with the above; once we see the final state 97 // won't be any overlap with the above; once we see the final state
104 // on a DownloadItem, we'll stop observing it. 98 // on a DownloadItem, we'll stop observing it.
105 DownloadSet downloads_observed_; 99 DownloadSet downloads_observed_;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 }; 131 };
138 132
139 class DownloadTestObserverTerminal : public DownloadTestObserver { 133 class DownloadTestObserverTerminal : public DownloadTestObserver {
140 public: 134 public:
141 // Create an object that will be considered finished when |wait_count| 135 // Create an object that will be considered finished when |wait_count|
142 // download items have entered a terminal state (any but IN_PROGRESS). 136 // download items have entered a terminal state (any but IN_PROGRESS).
143 // If |finish_on_select_file| is true, the object will also be 137 // If |finish_on_select_file| is true, the object will also be
144 // considered finished if the DownloadManager raises a 138 // considered finished if the DownloadManager raises a
145 // SelectFileDialogDisplayed() notification. 139 // SelectFileDialogDisplayed() notification.
146 DownloadTestObserverTerminal( 140 DownloadTestObserverTerminal(
147 content::DownloadManager* download_manager, 141 DownloadManager* download_manager,
148 size_t wait_count, 142 size_t wait_count,
149 DangerousDownloadAction dangerous_download_action); 143 DangerousDownloadAction dangerous_download_action);
150 144
151 virtual ~DownloadTestObserverTerminal(); 145 virtual ~DownloadTestObserverTerminal();
152 146
153 private: 147 private:
154 virtual bool IsDownloadInFinalState(content::DownloadItem* download) OVERRIDE; 148 virtual bool IsDownloadInFinalState(DownloadItem* download) OVERRIDE;
155 149
156 DISALLOW_COPY_AND_ASSIGN(DownloadTestObserverTerminal); 150 DISALLOW_COPY_AND_ASSIGN(DownloadTestObserverTerminal);
157 }; 151 };
158 152
159 // Detects changes to the downloads after construction. 153 // Detects changes to the downloads after construction.
160 // Finishes when a specified number of downloads change to the 154 // Finishes when a specified number of downloads change to the
161 // IN_PROGRESS state, or a Select File Dialog has appeared. 155 // IN_PROGRESS state, or a Select File Dialog has appeared.
162 // Dangerous downloads are accepted. 156 // Dangerous downloads are accepted.
163 // Callers may either probe for the finished state, or wait on it. 157 // Callers may either probe for the finished state, or wait on it.
164 class DownloadTestObserverInProgress : public DownloadTestObserver { 158 class DownloadTestObserverInProgress : public DownloadTestObserver {
165 public: 159 public:
166 // Create an object that will be considered finished when |wait_count| 160 // Create an object that will be considered finished when |wait_count|
167 // download items have entered state |IN_PROGRESS|. 161 // download items have entered state |IN_PROGRESS|.
168 // If |finish_on_select_file| is true, the object will also be 162 // If |finish_on_select_file| is true, the object will also be
169 // considered finished if the DownloadManager raises a 163 // considered finished if the DownloadManager raises a
170 // SelectFileDialogDisplayed() notification. 164 // SelectFileDialogDisplayed() notification.
171 DownloadTestObserverInProgress( 165 DownloadTestObserverInProgress(
172 content::DownloadManager* download_manager, 166 DownloadManager* download_manager, size_t wait_count);
173 size_t wait_count);
174 167
175 virtual ~DownloadTestObserverInProgress(); 168 virtual ~DownloadTestObserverInProgress();
176 169
177 private: 170 private:
178 virtual bool IsDownloadInFinalState(content::DownloadItem* download) OVERRIDE; 171 virtual bool IsDownloadInFinalState(DownloadItem* download) OVERRIDE;
179 172
180 DISALLOW_COPY_AND_ASSIGN(DownloadTestObserverInProgress); 173 DISALLOW_COPY_AND_ASSIGN(DownloadTestObserverInProgress);
181 }; 174 };
182 175
183 // The WaitForFlush() method on this class returns after: 176 // The WaitForFlush() method on this class returns after:
184 // * There are no IN_PROGRESS download items remaining on the 177 // * There are no IN_PROGRESS download items remaining on the
185 // DownloadManager. 178 // DownloadManager.
186 // * There have been two round trip messages through the file and 179 // * There have been two round trip messages through the file and
187 // IO threads. 180 // IO threads.
188 // This almost certainly means that a Download cancel has propagated through 181 // This almost certainly means that a Download cancel has propagated through
189 // the system. 182 // the system.
190 class DownloadTestFlushObserver 183 class DownloadTestFlushObserver
191 : public content::DownloadManager::Observer, 184 : public DownloadManager::Observer,
192 public content::DownloadItem::Observer, 185 public DownloadItem::Observer,
193 public base::RefCountedThreadSafe<DownloadTestFlushObserver> { 186 public base::RefCountedThreadSafe<DownloadTestFlushObserver> {
194 public: 187 public:
195 explicit DownloadTestFlushObserver( 188 explicit DownloadTestFlushObserver(DownloadManager* download_manager);
196 content::DownloadManager* download_manager);
197 189
198 void WaitForFlush(); 190 void WaitForFlush();
199 191
200 // DownloadsManager observer methods. 192 // DownloadsManager observer methods.
201 virtual void ModelChanged(content::DownloadManager* manager) OVERRIDE; 193 virtual void ModelChanged(DownloadManager* manager) OVERRIDE;
202 194
203 // DownloadItem observer methods. 195 // DownloadItem observer methods.
204 virtual void OnDownloadUpdated(content::DownloadItem* download) OVERRIDE; 196 virtual void OnDownloadUpdated(DownloadItem* download) OVERRIDE;
205 virtual void OnDownloadDestroyed(content::DownloadItem* download) OVERRIDE; 197 virtual void OnDownloadDestroyed(DownloadItem* download) OVERRIDE;
206 198
207 protected: 199 protected:
208 friend class base::RefCountedThreadSafe<DownloadTestFlushObserver>; 200 friend class base::RefCountedThreadSafe<DownloadTestFlushObserver>;
209 201
210 virtual ~DownloadTestFlushObserver(); 202 virtual ~DownloadTestFlushObserver();
211 203
212 private: 204 private:
213 typedef std::set<content::DownloadItem*> DownloadSet; 205 typedef std::set<DownloadItem*> DownloadSet;
214 206
215 // If we're waiting for that flush point, check the number 207 // If we're waiting for that flush point, check the number
216 // of downloads in the IN_PROGRESS state and take appropriate 208 // of downloads in the IN_PROGRESS state and take appropriate
217 // action. If requested, also observes all downloads while iterating. 209 // action. If requested, also observes all downloads while iterating.
218 void CheckDownloadsInProgress(bool observe_downloads); 210 void CheckDownloadsInProgress(bool observe_downloads);
219 211
220 void PingFileThread(int cycle); 212 void PingFileThread(int cycle);
221 213
222 void PingIOThread(int cycle); 214 void PingIOThread(int cycle);
223 215
224 content::DownloadManager* download_manager_; 216 DownloadManager* download_manager_;
225 DownloadSet downloads_observed_; 217 DownloadSet downloads_observed_;
226 bool waiting_for_zero_inprogress_; 218 bool waiting_for_zero_inprogress_;
227 219
228 DISALLOW_COPY_AND_ASSIGN(DownloadTestFlushObserver); 220 DISALLOW_COPY_AND_ASSIGN(DownloadTestFlushObserver);
229 }; 221 };
230 222
231 // Waits for a callback indicating that the DownloadItem is about to be created, 223 // Waits for a callback indicating that the DownloadItem is about to be created,
232 // or that an error occurred and it won't be created. 224 // or that an error occurred and it won't be created.
233 class DownloadTestItemCreationObserver 225 class DownloadTestItemCreationObserver
234 : public base::RefCountedThreadSafe<DownloadTestItemCreationObserver> { 226 : public base::RefCountedThreadSafe<DownloadTestItemCreationObserver> {
235 public: 227 public:
236 DownloadTestItemCreationObserver(); 228 DownloadTestItemCreationObserver();
237 229
238 void WaitForDownloadItemCreation(); 230 void WaitForDownloadItemCreation();
239 231
240 content::DownloadId download_id() const { return download_id_; } 232 DownloadId download_id() const { return download_id_; }
241 net::Error error() const { return error_; } 233 net::Error error() const { return error_; }
242 bool started() const { return called_back_count_ > 0; } 234 bool started() const { return called_back_count_ > 0; }
243 bool succeeded() const { return started() && (error_ == net::OK); } 235 bool succeeded() const { return started() && (error_ == net::OK); }
244 236
245 const content::DownloadUrlParameters::OnStartedCallback callback(); 237 const DownloadUrlParameters::OnStartedCallback callback();
246 238
247 private: 239 private:
248 friend class base::RefCountedThreadSafe<DownloadTestItemCreationObserver>; 240 friend class base::RefCountedThreadSafe<DownloadTestItemCreationObserver>;
249 241
250 ~DownloadTestItemCreationObserver(); 242 ~DownloadTestItemCreationObserver();
251 243
252 void DownloadItemCreationCallback(content::DownloadId download_id, 244 void DownloadItemCreationCallback(DownloadId download_id,
253 net::Error error); 245 net::Error error);
254 246
255 // The download creation information we received. 247 // The download creation information we received.
256 content::DownloadId download_id_; 248 DownloadId download_id_;
257 249
258 net::Error error_; 250 net::Error error_;
259 251
260 // Count of callbacks. 252 // Count of callbacks.
261 size_t called_back_count_; 253 size_t called_back_count_;
262 254
263 // We are in the message loop. 255 // We are in the message loop.
264 bool waiting_; 256 bool waiting_;
265 257
266 DISALLOW_COPY_AND_ASSIGN(DownloadTestItemCreationObserver); 258 DISALLOW_COPY_AND_ASSIGN(DownloadTestItemCreationObserver);
267 }; 259 };
268 260
269 // Observes and overrides file chooser activity for a profile. By default, once 261 } // namespace content`
270 // attached to a profile, this class overrides the default file chooser by
271 // replacing the ChromeDownloadManagerDelegate associated with |profile|.
272 // NOTE: Again, this overrides the ChromeDownloadManagerDelegate for |profile|.
273 class DownloadTestFileChooserObserver {
274 public:
275 // Attaches to |profile|. By default file chooser dialogs will be disabled
276 // once attached. Call EnableFileChooser() to re-enable.
277 explicit DownloadTestFileChooserObserver(Profile* profile);
278 ~DownloadTestFileChooserObserver();
279 262
280 // Sets whether the file chooser dialog is enabled. If |enable| is false, any 263 #endif // CONTENT_TEST_DOWNLOAD_TEST_OBSERVER_H_
281 // attempt to display a file chooser dialog will cause the download to be
282 // canceled. Otherwise, attempting to display a file chooser dialog will
283 // result in the download continuing with the suggested path.
284 void EnableFileChooser(bool enable);
285
286 // Returns true if a file chooser dialog was displayed since the last time
287 // this method was called.
288 bool TestAndResetDidShowFileChooser();
289
290 private:
291 scoped_refptr<internal::MockFileChooserDownloadManagerDelegate>
292 test_delegate_;
293 };
294
295 #endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_TEST_OBSERVER_H_
OLDNEW
« no previous file with comments | « content/content_tests.gypi ('k') | content/test/download_test_observer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698