Index: chrome/browser/download/download_test_observer.h |
diff --git a/chrome/browser/download/download_test_observer.h b/chrome/browser/download/download_test_observer.h |
index 3404f425e3c9d6fc57beb11ee7ca6e49536a251b..9cafbd570982ef0e3df530325566e24337180ac7 100644 |
--- a/chrome/browser/download/download_test_observer.h |
+++ b/chrome/browser/download/download_test_observer.h |
@@ -13,12 +13,12 @@ |
#include "content/public/browser/download_item.h" |
#include "content/public/browser/download_manager.h" |
-// Construction of this class defines a system state, based on some number |
-// of downloads being seen in a particular state + other events that |
-// may occur in the download system. That state will be recorded if it |
-// occurs at any point after construction. When that state occurs, the class |
-// is considered finished. Callers may either probe for the finished state, or |
-// wait on it. |
+// Detects changes to the downloads after construction. |
+// Finishes when one of the following happens: |
+// - A specified number of downloads change to a terminal state (defined |
+// in derived classes). |
+// - Specific events, such as a select file dialog. |
+// Callers may either probe for the finished state, or wait on it. |
// |
// TODO(rdsmith): Detect manager going down, remove pointer to |
// DownloadManager, transition to finished. (For right now we |
@@ -36,17 +36,13 @@ class DownloadTestObserver : public content::DownloadManager::Observer, |
}; |
// Create an object that will be considered finished when |wait_count| |
- // download items have entered state |download_finished_state|. |
+ // download items have entered a terminal state. |
// If |finish_on_select_file| is true, the object will also be |
// considered finished if the DownloadManager raises a |
// SelectFileDialogDisplayed() notification. |
- |
- // TODO(rdsmith): Consider rewriting the interface to take a list of events |
- // to treat as completion events. |
DownloadTestObserver( |
content::DownloadManager* download_manager, |
size_t wait_count, |
- content::DownloadItem::DownloadState download_finished_state, |
bool finish_on_select_file, |
DangerousDownloadAction dangerous_download_action); |
@@ -55,7 +51,7 @@ class DownloadTestObserver : public content::DownloadManager::Observer, |
// State accessors. |
bool select_file_dialog_seen() const { return select_file_dialog_seen_; } |
- // Wait for whatever state was specified in the constructor. |
+ // Wait for the requested number of downloads to enter a terminal state. |
void WaitForFinished(); |
// Return true if everything's happened that we're configured for. |
@@ -73,16 +69,17 @@ class DownloadTestObserver : public content::DownloadManager::Observer, |
size_t NumDangerousDownloadsSeen() const; |
- private: |
+ size_t NumDownloadsSeenInState( |
+ content::DownloadItem::DownloadState state) const; |
Randy Smith (Not in Mondays)
2012/03/08 18:25:31
Up to you, but I'd be more inclined to leave this
ahendrickson
2012/03/08 20:56:34
It's here specifically for IN_PROGRESS tests, whic
Randy Smith (Not in Mondays)
2012/03/09 18:39:38
Ah, makes sense. Ok.
|
+ |
+ protected: |
typedef std::set<content::DownloadItem*> DownloadSet; |
- // Called when we know that a download item is in a final state. |
- // Note that this is not the same as it first transitioning in to the |
- // final state; multiple notifications may occur once the item is in |
- // that state. So we keep our own track of transitions into final. |
- void DownloadInFinalState(content::DownloadItem* download); |
+ // Maps states to the number of times they have been encountered |
+ typedef std::map<content::DownloadItem::DownloadState, size_t> StateMap; |
- void SignalIfFinished(); |
+ // Called to see if a download item is in a final state. |
+ virtual bool IsDownloadInFinalState(content::DownloadItem* download) = 0; |
// The observed download manager. |
scoped_refptr<content::DownloadManager> download_manager_; |
benjhayden
2012/03/08 20:30:02
Would it be too much trouble to keep member fields
ahendrickson
2012/03/08 21:28:55
My preference would be to punt this to another CL,
Randy Smith (Not in Mondays)
2012/03/09 18:39:38
For this kind of issue, it's useful to look at whe
ahendrickson
2012/03/09 20:07:23
OK, done.
|
@@ -92,13 +89,11 @@ class DownloadTestObserver : public content::DownloadManager::Observer, |
// reaches wait_count_, we're done. |
DownloadSet finished_downloads_; |
- // The set of DownloadItem's we are currently observing. Generally there |
- // won't be any overlap with the above; once we see the final state |
- // on a DownloadItem, we'll stop observing it. |
- DownloadSet downloads_observed_; |
- |
- // The number of downloads to wait on completing. |
- size_t wait_count_; |
+ // The map of states to the number of times they have been observed since |
+ // we started looking. |
+ // Recorded at the time downloads_observed_ is recorded, but cleared in the |
+ // constructor to exclude pre-existing states. |
+ StateMap states_observed_; |
// The number of downloads entered in final state in initial |
// ModelChanged(). We use |finished_downloads_| to track the incoming |
@@ -110,13 +105,27 @@ class DownloadTestObserver : public content::DownloadManager::Observer, |
// to finished. |
int finished_downloads_at_construction_; |
+ private: |
+ // Called when we know that a download item is in a final state. |
+ // Note that this is not the same as it first transitioning in to the |
+ // final state; multiple notifications may occur once the item is in |
+ // that state. So we keep our own track of transitions into final. |
+ void DownloadInFinalState(content::DownloadItem* download); |
+ |
+ void SignalIfFinished(); |
+ |
+ // The set of DownloadItem's we are currently observing. Generally there |
+ // won't be any overlap with the above; once we see the final state |
+ // on a DownloadItem, we'll stop observing it. |
+ DownloadSet downloads_observed_; |
+ |
+ // The number of downloads to wait on completing. |
+ size_t wait_count_; |
+ |
// Whether an internal message loop has been started and must be quit upon |
// all downloads completing. |
bool waiting_; |
- // The state on which to consider the DownloadItem finished. |
- content::DownloadItem::DownloadState download_finished_state_; |
- |
// True if we should transition the DownloadTestObserver to finished if |
// the select file dialog comes up. |
bool finish_on_select_file_; |
@@ -133,6 +142,49 @@ class DownloadTestObserver : public content::DownloadManager::Observer, |
DISALLOW_COPY_AND_ASSIGN(DownloadTestObserver); |
}; |
+class DownloadTestObserverTerminal : public DownloadTestObserver { |
+ public: |
+ // Create an object that will be considered finished when |wait_count| |
+ // download items have entered a terminal state (any but IN_PROGRESS). |
+ // If |finish_on_select_file| is true, the object will also be |
+ // considered finished if the DownloadManager raises a |
+ // SelectFileDialogDisplayed() notification. |
+ DownloadTestObserverTerminal( |
+ content::DownloadManager* download_manager, |
+ size_t wait_count, |
+ bool finish_on_select_file, |
+ DangerousDownloadAction dangerous_download_action); |
+ |
+ virtual ~DownloadTestObserverTerminal(); |
+ |
+ private: |
+ virtual bool IsDownloadInFinalState(content::DownloadItem* download) OVERRIDE; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DownloadTestObserverTerminal); |
+}; |
+ |
+// Detects changes to the downloads after construction. |
+// Finishes when one of the following happens: |
+// - A specified number of downloads change to the IN_PROGRESS state. |
Randy Smith (Not in Mondays)
2012/03/08 18:25:31
You haven't specified the behavior on a dangerous
ahendrickson
2012/03/08 20:56:34
I think we're in trouble if the select file dialog
Randy Smith (Not in Mondays)
2012/03/09 18:39:38
Confused, and I'd like to be unconfused before we
ahendrickson
2012/03/09 20:07:23
OK, added the parameter to DownloadObserverTestInP
|
+// Callers may either probe for the finished state, or wait on it. |
+// |
Randy Smith (Not in Mondays)
2012/03/08 18:25:31
nit: Could you nuke the blank comment line? I thi
ahendrickson
2012/03/08 20:56:34
Done.
|
+class DownloadTestObserverInProgress : public DownloadTestObserver { |
+ public: |
+ // Create an object that will be considered finished when |wait_count| |
+ // download items have entered state |IN_PROGRESS|. |
+ |
+ DownloadTestObserverInProgress( |
+ content::DownloadManager* download_manager, |
+ size_t wait_count); |
+ |
+ virtual ~DownloadTestObserverInProgress(); |
+ |
+ private: |
+ virtual bool IsDownloadInFinalState(content::DownloadItem* download) OVERRIDE; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DownloadTestObserverInProgress); |
+}; |
+ |
// The WaitForFlush() method on this class returns after: |
// * There are no IN_PROGRESS download items remaining on the |
// DownloadManager. |