Index: content/public/test/download_test_observer.cc |
diff --git a/content/public/test/download_test_observer.cc b/content/public/test/download_test_observer.cc |
index 85caf410ade5d3706840c7ca8ac9ebf8c7d99b43..877d39fc0ddb2627075c4e2abfb17bdcc9a74c3e 100644 |
--- a/content/public/test/download_test_observer.cc |
+++ b/content/public/test/download_test_observer.cc |
@@ -44,6 +44,43 @@ void DenyDangerousDownload(scoped_refptr<DownloadManager> download_manager, |
} // namespace |
+DownloadUpdatedObserver::DownloadUpdatedObserver( |
+ DownloadItem* item, DownloadUpdatedObserver::EventFilter filter) |
+ : item_(item), filter_(filter), waiting_(false), event_seen_(false) { |
+ item->AddObserver(this); |
+} |
+ |
+DownloadUpdatedObserver::~DownloadUpdatedObserver() { |
+ if (item_) |
+ item_->RemoveObserver(this); |
+} |
+ |
+bool DownloadUpdatedObserver::WaitForEvent() { |
+ if (item_ && filter_.Run(item_)) |
+ return true; |
+ |
+ waiting_ = true; |
+ RunMessageLoop(); |
+ waiting_ = false; |
+ return event_seen_; |
benjhayden
2012/09/10 17:37:29
Nice!
What if WaitForEvent() is called on the sam
Randy Smith (Not in Mondays)
2012/09/10 18:32:34
I think of this type of class as tracking whether
|
+} |
+ |
+void DownloadUpdatedObserver::OnDownloadUpdated(DownloadItem* item) { |
+ DCHECK_EQ(item_, item); |
+ if (filter_.Run(item_)) |
+ event_seen_ = true; |
+ if (waiting_ && event_seen_) |
+ MessageLoopForUI::current()->Quit(); |
+} |
+ |
+void DownloadUpdatedObserver::OnDownloadDestroyed(DownloadItem* item) { |
+ DCHECK_EQ(item_, item); |
+ item_->RemoveObserver(this); |
+ item_ = NULL; |
+ if (waiting_) |
+ MessageLoopForUI::current()->Quit(); |
+} |
+ |
DownloadTestObserver::DownloadTestObserver( |
DownloadManager* download_manager, |
size_t wait_count, |