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