15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_TEST_DOWNLOAD_TEST_OBSERVER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_TEST_DOWNLOAD_TEST_OBSERVER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/download_interrupt_reasons.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_url_parameters.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Detects an arbitrary change on a download item.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO: Rewrite other observers to use this (or be replaced by it).
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadUpdatedObserver : public DownloadItem::Observer {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::Callback<bool(DownloadItem*)> EventFilter;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The filter passed may be called multiple times, even after it
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returns true.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadUpdatedObserver(DownloadItem* item, EventFilter filter);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DownloadUpdatedObserver();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns when either the event has been seen (at least once since
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // object construction) or the item is destroyed.  Return value indicates
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if the wait ended because the item was seen (true) or the object
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // destroyed (false).
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool WaitForEvent();
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DownloadItem::Observer
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadUpdated(DownloadItem* item) OVERRIDE;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadDestroyed(DownloadItem* item) OVERRIDE;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item_;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventFilter filter_;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool event_seen_;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadUpdatedObserver);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Detects changes to the downloads after construction.
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)//
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Finishes when one of the following happens:
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   - A specified number of downloads change to a terminal state (defined
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     in derived classes).
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)//   - The download manager was shutdown.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Callers may either probe for the finished state, or wait on it.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadTestObserver : public DownloadManager::Observer,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             public DownloadItem::Observer {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Action an observer should take if a dangerous download is encountered.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum DangerousDownloadAction {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ON_DANGEROUS_DOWNLOAD_ACCEPT,  // Accept the download
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ON_DANGEROUS_DOWNLOAD_DENY,    // Deny the download
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ON_DANGEROUS_DOWNLOAD_FAIL,    // Fail if a dangerous download is seen
678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ON_DANGEROUS_DOWNLOAD_IGNORE,  // Make it the callers problem.
688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ON_DANGEROUS_DOWNLOAD_QUIT     // Will set final state without decision.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create an object that will be considered finished when |wait_count|
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // download items have entered a terminal state.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadTestObserver(DownloadManager* download_manager,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       size_t wait_count,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DangerousDownloadAction dangerous_download_action);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DownloadTestObserver();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Wait for one of the finish conditions.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForFinished();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Return true if we reached one of the finish conditions.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsFinished() const;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DownloadItem::Observer
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadUpdated(DownloadItem* download) OVERRIDE;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadDestroyed(DownloadItem* download) OVERRIDE;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DownloadManager::Observer
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadCreated(
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadManager* manager, DownloadItem* item) OVERRIDE;
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void ManagerGoingDown(DownloadManager* manager) OVERRIDE;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t NumDangerousDownloadsSeen() const;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t NumDownloadsSeenInState(DownloadItem::DownloadState state) const;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only to be called by derived classes' constructors.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Init();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called to see if a download item is in a final state.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsDownloadInFinalState(DownloadItem* download) = 0;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::set<DownloadItem*> DownloadSet;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maps states to the number of times they have been encountered
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<DownloadItem::DownloadState, size_t> StateMap;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when we know that a download item is in a final state.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that this is not the same as it first transitioning in to the
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // final state; multiple notifications may occur once the item is in
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that state.  So we keep our own track of transitions into final.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DownloadInFinalState(DownloadItem* download);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SignalIfFinished();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Fake user click on "Accept".
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void AcceptDangerousDownload(uint32 download_id);
12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Fake user click on "Deny".
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void DenyDangerousDownload(uint32 download_id);
12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The observed download manager.
12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DownloadManager* download_manager_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The set of DownloadItem's that have transitioned to their finished state
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // since construction of this object.  When the size of this array
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reaches wait_count_, we're done.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadSet finished_downloads_;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The set of DownloadItem's we are currently observing.  Generally there
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // won't be any overlap with the above; once we see the final state
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on a DownloadItem, we'll stop observing it.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadSet downloads_observed_;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The map of states to the number of times they have been observed since
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we started looking.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Recorded at the time downloads_observed_ is recorded, but cleared in the
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // constructor to exclude pre-existing states.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StateMap states_observed_;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The number of downloads to wait on completing.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t wait_count_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The number of downloads entered in final state in Init().  We use
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |finished_downloads_| to track the incoming transitions to final state we
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should ignore, and to track the number of final state transitions that
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // occurred between construction and return from wait.  But some downloads may
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be in our final state (and thus be entered into |finished_downloads_|) when
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we construct this class.  We don't want to count those in our transition to
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // finished.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int finished_downloads_at_construction_;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether an internal message loop has been started and must be quit upon
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // all downloads completing.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Action to take if a dangerous download is encountered.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DangerousDownloadAction dangerous_download_action_;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Holds the download ids which were dangerous.
1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::set<uint32> dangerous_downloads_seen_;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::WeakPtrFactory<DownloadTestObserver> weak_factory_;
16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadTestObserver);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadTestObserverTerminal : public DownloadTestObserver {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create an object that will be considered finished when |wait_count|
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // download items have entered a terminal state (DownloadItem::IsDone() is
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // true).
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadTestObserverTerminal(
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadManager* download_manager,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size_t wait_count,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DangerousDownloadAction dangerous_download_action);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DownloadTestObserverTerminal();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsDownloadInFinalState(DownloadItem* download) OVERRIDE;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadTestObserverTerminal);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Detects changes to the downloads after construction.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Finishes when a specified number of downloads change to the
19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// IN_PROGRESS state, or when the download manager is destroyed.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dangerous downloads are accepted.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Callers may either probe for the finished state, or wait on it.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadTestObserverInProgress : public DownloadTestObserver {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create an object that will be considered finished when |wait_count|
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // download items have entered state |IN_PROGRESS|.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadTestObserverInProgress(
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadManager* download_manager, size_t wait_count);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DownloadTestObserverInProgress();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsDownloadInFinalState(DownloadItem* download) OVERRIDE;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadTestObserverInProgress);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass DownloadTestObserverInterrupted : public DownloadTestObserver {
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Create an object that will be considered finished when |wait_count|
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // download items are interrupted.
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DownloadTestObserverInterrupted(
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      DownloadManager* download_manager,
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      size_t wait_count,
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      DangerousDownloadAction dangerous_download_action);
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~DownloadTestObserverInterrupted();
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual bool IsDownloadInFinalState(DownloadItem* download) OVERRIDE;
222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(DownloadTestObserverInterrupted);
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The WaitForFlush() method on this class returns after:
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//      * There are no IN_PROGRESS download items remaining on the
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//        DownloadManager.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//      * There have been two round trip messages through the file and
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//        IO threads.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This almost certainly means that a Download cancel has propagated through
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the system.
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadTestFlushObserver
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public DownloadManager::Observer,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public DownloadItem::Observer,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public base::RefCountedThreadSafe<DownloadTestFlushObserver> {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit DownloadTestFlushObserver(DownloadManager* download_manager);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForFlush();
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DownloadsManager observer methods.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadCreated(
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadManager* manager,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem* item) OVERRIDE;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DownloadItem observer methods.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadUpdated(DownloadItem* download) OVERRIDE;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadDestroyed(DownloadItem* download) OVERRIDE;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<DownloadTestFlushObserver>;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DownloadTestFlushObserver();
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::set<DownloadItem*> DownloadSet;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we're waiting for that flush point, check the number
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of downloads in the IN_PROGRESS state and take appropriate
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // action.  If requested, also observes all downloads while iterating.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckDownloadsInProgress(bool observe_downloads);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PingFileThread(int cycle);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PingIOThread(int cycle);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* download_manager_;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadSet downloads_observed_;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_for_zero_inprogress_;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadTestFlushObserver);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Waits for a callback indicating that the DownloadItem is about to be created,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// or that an error occurred and it won't be created.
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadTestItemCreationObserver
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public base::RefCountedThreadSafe<DownloadTestItemCreationObserver> {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadTestItemCreationObserver();
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForDownloadItemCreation();
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  uint32 download_id() const { return download_id_; }
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DownloadInterruptReason interrupt_reason() const { return interrupt_reason_; }
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool started() const { return called_back_count_ > 0; }
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool succeeded() const {
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return started() && interrupt_reason_ == DOWNLOAD_INTERRUPT_REASON_NONE;
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const DownloadUrlParameters::OnStartedCallback callback();
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<DownloadTestItemCreationObserver>;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~DownloadTestItemCreationObserver();
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void DownloadItemCreationCallback(DownloadItem* item,
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    DownloadInterruptReason interrupt_reason);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The download creation information we received.
3027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  uint32 download_id_;
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DownloadInterruptReason interrupt_reason_;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Count of callbacks.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t called_back_count_;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We are in the message loop.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadTestItemCreationObserver);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content`
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_TEST_DOWNLOAD_TEST_OBSERVER_H_
317