1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // The DownloadManager object manages the process of downloading, including
6 // updates to the history system and providing the information for displaying
7 // the downloads view in the Destinations tab. There is one DownloadManager per
8 // active browser context in Chrome.
10 // Download observers:
11 // Objects that are interested in notifications about new downloads, or progress
12 // updates for a given download must implement one of the download observer
14 // DownloadManager::Observer:
15 // - allows observers, primarily views, to be notified when changes to the
16 // set of all downloads (such as new downloads, or deletes) occur
17 // Use AddObserver() / RemoveObserver() on the appropriate download object to
18 // receive state updates.
20 // Download state persistence:
21 // The DownloadManager uses the history service for storing persistent
22 // information about the state of all downloads. The history system maintains a
23 // separate table for this called 'downloads'. At the point that the
24 // DownloadManager is constructed, we query the history service for the state of
25 // all persisted downloads.
27 #ifndef CONTENT_PUBLIC_BROWSER_DOWNLOAD_MANAGER_H_
28 #define CONTENT_PUBLIC_BROWSER_DOWNLOAD_MANAGER_H_
33 #include "base/basictypes.h"
34 #include "base/callback.h"
35 #include "base/files/file_path.h"
36 #include "base/gtest_prod_util.h"
37 #include "base/sequenced_task_runner_helpers.h"
38 #include "base/time/time.h"
39 #include "content/public/browser/download_interrupt_reasons.h"
40 #include "content/public/browser/download_item.h"
41 #include "content/public/browser/download_url_parameters.h"
42 #include "net/base/net_errors.h"
43 #include "net/log/net_log.h"
54 class ByteStreamReader
;
55 class DownloadManagerDelegate
;
57 class DownloadRequestHandle
;
58 struct DownloadCreateInfo
;
60 // Browser's download manager: manages all downloads and destination view.
61 class CONTENT_EXPORT DownloadManager
: public base::SupportsUserData::Data
{
63 ~DownloadManager() override
{}
65 // Sets/Gets the delegate for this DownloadManager. The delegate has to live
66 // past its Shutdown method being called (by the DownloadManager).
67 virtual void SetDelegate(DownloadManagerDelegate
* delegate
) = 0;
68 virtual DownloadManagerDelegate
* GetDelegate() const = 0;
70 // Shutdown the download manager. Content calls this when BrowserContext is
71 // being destructed. If the embedder needs this to be called earlier, it can
72 // call it. In that case, the delegate's Shutdown() method will only be called
74 virtual void Shutdown() = 0;
76 // Interface to implement for observers that wish to be informed of changes
77 // to the DownloadManager's collection of downloads.
78 class CONTENT_EXPORT Observer
{
80 // A DownloadItem was created. This item may be visible before the filename
81 // is determined; in this case the return value of GetTargetFileName() will
82 // be null. This method may be called an arbitrary number of times, e.g.
83 // when loading history on startup. As a result, consumers should avoid
84 // doing large amounts of work in OnDownloadCreated(). TODO(<whoever>):
85 // When we've fully specified the possible states of the DownloadItem in
86 // download_item.h, we should remove the caveat above.
87 virtual void OnDownloadCreated(
88 DownloadManager
* manager
, DownloadItem
* item
) {}
90 // A SavePackage has successfully finished.
91 virtual void OnSavePackageSuccessfullyFinished(
92 DownloadManager
* manager
, DownloadItem
* item
) {}
94 // Called when the DownloadManager is being destroyed to prevent Observers
95 // from calling back to a stale pointer.
96 virtual void ManagerGoingDown(DownloadManager
* manager
) {}
99 virtual ~Observer() {}
102 typedef std::vector
<DownloadItem
*> DownloadVector
;
104 // Add all download items to |downloads|, no matter the type or state, without
105 // clearing |downloads| first.
106 virtual void GetAllDownloads(DownloadVector
* downloads
) = 0;
108 // Called by a download source (Currently DownloadResourceHandler)
109 // to initiate the non-source portions of a download.
110 // Returns the id assigned to the download. If the DownloadCreateInfo
111 // specifies an id, that id will be used.
112 virtual void StartDownload(
113 scoped_ptr
<DownloadCreateInfo
> info
,
114 scoped_ptr
<ByteStreamReader
> stream
,
115 const DownloadUrlParameters::OnStartedCallback
& on_started
) = 0;
117 // Remove downloads which are same-origin with the given origin and pertain to
118 // the given time constraints. (See |RemoveDownloadsBetween|.)
119 virtual int RemoveDownloadsByOriginAndTime(const url::Origin
& origin
,
120 base::Time remove_begin
,
121 base::Time remove_end
) = 0;
123 // Remove downloads after remove_begin (inclusive) and before remove_end
124 // (exclusive). You may pass in null Time values to do an unbounded delete
125 // in either direction.
126 virtual int RemoveDownloadsBetween(base::Time remove_begin
,
127 base::Time remove_end
) = 0;
129 // Remove downloads will delete all downloads that have a timestamp that is
130 // the same or more recent than |remove_begin|. The number of downloads
131 // deleted is returned back to the caller.
132 virtual int RemoveDownloads(base::Time remove_begin
) = 0;
134 // Remove all downloads will delete all downloads. The number of downloads
135 // deleted is returned back to the caller.
136 virtual int RemoveAllDownloads() = 0;
138 // See DownloadUrlParameters for details about controlling the download.
139 virtual void DownloadUrl(scoped_ptr
<DownloadUrlParameters
> parameters
) = 0;
141 // Allow objects to observe the download creation process.
142 virtual void AddObserver(Observer
* observer
) = 0;
144 // Remove a download observer from ourself.
145 virtual void RemoveObserver(Observer
* observer
) = 0;
147 // Called by the embedder, after creating the download manager, to let it know
148 // about downloads from previous runs of the browser.
149 virtual DownloadItem
* CreateDownloadItem(
151 const base::FilePath
& current_path
,
152 const base::FilePath
& target_path
,
153 const std::vector
<GURL
>& url_chain
,
154 const GURL
& referrer_url
,
155 const std::string
& mime_type
,
156 const std::string
& original_mime_type
,
157 const base::Time
& start_time
,
158 const base::Time
& end_time
,
159 const std::string
& etag
,
160 const std::string
& last_modified
,
161 int64 received_bytes
,
163 DownloadItem::DownloadState state
,
164 DownloadDangerType danger_type
,
165 DownloadInterruptReason interrupt_reason
,
168 // The number of in progress (including paused) downloads.
169 // Performance note: this loops over all items. If profiling finds that this
170 // is too slow, use an AllDownloadItemNotifier to count in-progress items.
171 virtual int InProgressCount() const = 0;
173 // The number of in progress (including paused) downloads.
174 // Performance note: this loops over all items. If profiling finds that this
175 // is too slow, use an AllDownloadItemNotifier to count in-progress items.
176 // This excludes downloads that are marked as malicious.
177 virtual int NonMaliciousInProgressCount() const = 0;
179 virtual BrowserContext
* GetBrowserContext() const = 0;
181 // Checks whether downloaded files still exist. Updates state of downloads
182 // that refer to removed files. The check runs in the background and may
183 // finish asynchronously after this method returns.
184 virtual void CheckForHistoryFilesRemoval() = 0;
186 // Get the download item for |id| if present, no matter what type of download
187 // it is or state it's in.
188 virtual DownloadItem
* GetDownload(uint32 id
) = 0;
191 } // namespace content
193 #endif // CONTENT_PUBLIC_BROWSER_DOWNLOAD_MANAGER_H_