| 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 3d918255c6d8f5bbd7e87f9b93dd3513e04d93c3..17d763efb5a33e8bc2a1b7f1e01a5b84cdb71ab4 100644
|
| --- a/content/public/test/download_test_observer.cc
|
| +++ b/content/public/test/download_test_observer.cc
|
| @@ -18,35 +18,6 @@
|
|
|
| namespace content {
|
|
|
| -namespace {
|
| -
|
| -// These functions take scoped_refptr's to DownloadManager because they
|
| -// are posted to message queues, and hence may execute arbitrarily after
|
| -// their actual posting. Once posted, there is no connection between
|
| -// these routines and the DownloadTestObserver class from which
|
| -// they came, so the DownloadTestObserver's reference to the
|
| -// DownloadManager cannot be counted on to keep the DownloadManager around.
|
| -
|
| -// Fake user click on "Accept".
|
| -void AcceptDangerousDownload(scoped_refptr<DownloadManager> download_manager,
|
| - int32 download_id) {
|
| - DownloadItem* download = download_manager->GetDownload(download_id);
|
| - if (download && (download->GetState() == DownloadItem::IN_PROGRESS))
|
| - download->DangerousDownloadValidated();
|
| -}
|
| -
|
| -// Fake user click on "Deny".
|
| -void DenyDangerousDownload(scoped_refptr<DownloadManager> download_manager,
|
| - int32 download_id) {
|
| - DownloadItem* download = download_manager->GetDownload(download_id);
|
| - if (download && (download->GetState() == DownloadItem::IN_PROGRESS)) {
|
| - download->Cancel(true);
|
| - download->Delete(DownloadItem::DELETE_DUE_TO_USER_DISCARD);
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| DownloadUpdatedObserver::DownloadUpdatedObserver(
|
| DownloadItem* item, DownloadUpdatedObserver::EventFilter filter)
|
| : item_(item),
|
| @@ -97,7 +68,8 @@ DownloadTestObserver::DownloadTestObserver(
|
| wait_count_(wait_count),
|
| finished_downloads_at_construction_(0),
|
| waiting_(false),
|
| - dangerous_download_action_(dangerous_download_action) {
|
| + dangerous_download_action_(dangerous_download_action),
|
| + weak_factory_(this) {
|
| }
|
|
|
| DownloadTestObserver::~DownloadTestObserver() {
|
| @@ -105,7 +77,8 @@ DownloadTestObserver::~DownloadTestObserver() {
|
| it != downloads_observed_.end(); ++it)
|
| (*it)->RemoveObserver(this);
|
|
|
| - download_manager_->RemoveObserver(this);
|
| + if (download_manager_)
|
| + download_manager_->RemoveObserver(this);
|
| }
|
|
|
| void DownloadTestObserver::Init() {
|
| @@ -120,6 +93,12 @@ void DownloadTestObserver::Init() {
|
| states_observed_.clear();
|
| }
|
|
|
| +void DownloadTestObserver::ManagerGoingDown(DownloadManager* manager) {
|
| + CHECK_EQ(manager, download_manager_);
|
| + download_manager_ = NULL;
|
| + SignalIfFinished();
|
| +}
|
| +
|
| void DownloadTestObserver::WaitForFinished() {
|
| if (!IsFinished()) {
|
| waiting_ = true;
|
| @@ -130,7 +109,7 @@ void DownloadTestObserver::WaitForFinished() {
|
|
|
| bool DownloadTestObserver::IsFinished() const {
|
| return (finished_downloads_.size() - finished_downloads_at_construction_ >=
|
| - wait_count_);
|
| + wait_count_) || (download_manager_ == NULL);
|
| }
|
|
|
| void DownloadTestObserver::OnDownloadCreated(
|
| @@ -171,7 +150,8 @@ void DownloadTestObserver::OnDownloadUpdated(DownloadItem* download) {
|
| // real UI would.
|
| BrowserThread::PostTask(
|
| BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&AcceptDangerousDownload, download_manager_,
|
| + base::Bind(&DownloadTestObserver::AcceptDangerousDownload,
|
| + weak_factory_.GetWeakPtr(),
|
| download->GetId()));
|
| break;
|
|
|
| @@ -180,7 +160,8 @@ void DownloadTestObserver::OnDownloadUpdated(DownloadItem* download) {
|
| // real UI would.
|
| BrowserThread::PostTask(
|
| BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&DenyDangerousDownload, download_manager_,
|
| + base::Bind(&DownloadTestObserver::DenyDangerousDownload,
|
| + weak_factory_.GetWeakPtr(),
|
| download->GetId()));
|
| break;
|
|
|
| @@ -234,6 +215,28 @@ void DownloadTestObserver::SignalIfFinished() {
|
| base::MessageLoopForUI::current()->Quit();
|
| }
|
|
|
| +void DownloadTestObserver::AcceptDangerousDownload(int32 download_id) {
|
| + // Download manager was shutdown before the UI thread could accept the
|
| + // download.
|
| + if (!download_manager_)
|
| + return;
|
| + DownloadItem* download = download_manager_->GetDownload(download_id);
|
| + if (download && (download->GetState() == DownloadItem::IN_PROGRESS))
|
| + download->DangerousDownloadValidated();
|
| +}
|
| +
|
| +void DownloadTestObserver::DenyDangerousDownload(int32 download_id) {
|
| + // Download manager was shutdown before the UI thread could deny the
|
| + // download.
|
| + if (!download_manager_)
|
| + return;
|
| + DownloadItem* download = download_manager_->GetDownload(download_id);
|
| + if (download && (download->GetState() == DownloadItem::IN_PROGRESS)) {
|
| + download->Cancel(true);
|
| + download->Delete(DownloadItem::DELETE_DUE_TO_USER_DISCARD);
|
| + }
|
| +}
|
| +
|
| DownloadTestObserverTerminal::DownloadTestObserverTerminal(
|
| DownloadManager* download_manager,
|
| size_t wait_count,
|
|
|