Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(25)

Side by Side Diff: chrome/browser/download/chrome_download_manager_delegate.h

Issue 10704052: Download filename determination refactor (3/3) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CHROME_BROWSER_DOWNLOAD_CHROME_DOWNLOAD_MANAGER_DELEGATE_H_ 5 #ifndef CHROME_BROWSER_DOWNLOAD_CHROME_DOWNLOAD_MANAGER_DELEGATE_H_
6 #define CHROME_BROWSER_DOWNLOAD_CHROME_DOWNLOAD_MANAGER_DELEGATE_H_ 6 #define CHROME_BROWSER_DOWNLOAD_CHROME_DOWNLOAD_MANAGER_DELEGATE_H_
7 7
8 #include "base/compiler_specific.h" 8 #include "base/compiler_specific.h"
9 #include "base/hash_tables.h" 9 #include "base/hash_tables.h"
10 #include "base/memory/ref_counted.h" 10 #include "base/memory/ref_counted.h"
(...skipping 27 matching lines...) Expand all
38 }; 38 };
39 } // namespace BASE_HASH_NAMESPACE 39 } // namespace BASE_HASH_NAMESPACE
40 #endif 40 #endif
41 41
42 // This is the Chrome side helper for the download system. 42 // This is the Chrome side helper for the download system.
43 class ChromeDownloadManagerDelegate 43 class ChromeDownloadManagerDelegate
44 : public base::RefCountedThreadSafe<ChromeDownloadManagerDelegate>, 44 : public base::RefCountedThreadSafe<ChromeDownloadManagerDelegate>,
45 public content::DownloadManagerDelegate, 45 public content::DownloadManagerDelegate,
46 public content::NotificationObserver { 46 public content::NotificationObserver {
47 public: 47 public:
48 // Callback type used with ChooseDownloadPath(). The callback should be
49 // invoked with the user-selected path as the argument. If the file selection
50 // was canceled, the argument should be the empty path.
51 typedef base::Callback<void(const FilePath&)> FileSelectedCallback;
52
48 explicit ChromeDownloadManagerDelegate(Profile* profile); 53 explicit ChromeDownloadManagerDelegate(Profile* profile);
49 54
50 void SetDownloadManager(content::DownloadManager* dm); 55 void SetDownloadManager(content::DownloadManager* dm);
51 56
52 // Should be called before the first call to ShouldCompleteDownload() to 57 // Should be called before the first call to ShouldCompleteDownload() to
53 // disable SafeBrowsing checks for |item|. 58 // disable SafeBrowsing checks for |item|.
54 static void DisableSafeBrowsing(content::DownloadItem* item); 59 static void DisableSafeBrowsing(content::DownloadItem* item);
55 60
61 // content::DownloadManagerDelegate
56 virtual void Shutdown() OVERRIDE; 62 virtual void Shutdown() OVERRIDE;
57 virtual content::DownloadId GetNextId() OVERRIDE; 63 virtual content::DownloadId GetNextId() OVERRIDE;
58 virtual bool ShouldStartDownload(int32 download_id) OVERRIDE; 64 virtual bool DetermineDownloadTarget(
59 virtual void ChooseDownloadPath(content::DownloadItem* item) OVERRIDE; 65 content::DownloadItem* item,
60 virtual FilePath GetIntermediatePath( 66 const content::DownloadTargetCallback& callback) OVERRIDE;
61 const content::DownloadItem& item) OVERRIDE;
62 virtual content::WebContents* 67 virtual content::WebContents*
63 GetAlternativeWebContentsToNotifyForDownload() OVERRIDE; 68 GetAlternativeWebContentsToNotifyForDownload() OVERRIDE;
64 virtual bool ShouldOpenFileBasedOnExtension(const FilePath& path) OVERRIDE; 69 virtual bool ShouldOpenFileBasedOnExtension(const FilePath& path) OVERRIDE;
65 virtual bool ShouldCompleteDownload( 70 virtual bool ShouldCompleteDownload(
66 content::DownloadItem* item, 71 content::DownloadItem* item,
67 const base::Closure& complete_callback) OVERRIDE; 72 const base::Closure& complete_callback) OVERRIDE;
68 virtual bool ShouldOpenDownload(content::DownloadItem* item) OVERRIDE; 73 virtual bool ShouldOpenDownload(content::DownloadItem* item) OVERRIDE;
69 virtual bool GenerateFileHash() OVERRIDE; 74 virtual bool GenerateFileHash() OVERRIDE;
70 virtual void AddItemToPersistentStore(content::DownloadItem* item) OVERRIDE; 75 virtual void AddItemToPersistentStore(content::DownloadItem* item) OVERRIDE;
71 virtual void UpdateItemInPersistentStore( 76 virtual void UpdateItemInPersistentStore(
(...skipping 10 matching lines...) Expand all
82 FilePath* website_save_dir, 87 FilePath* website_save_dir,
83 FilePath* download_save_dir, 88 FilePath* download_save_dir,
84 bool* skip_dir_check) OVERRIDE; 89 bool* skip_dir_check) OVERRIDE;
85 virtual void ChooseSavePath( 90 virtual void ChooseSavePath(
86 content::WebContents* web_contents, 91 content::WebContents* web_contents,
87 const FilePath& suggested_path, 92 const FilePath& suggested_path,
88 const FilePath::StringType& default_extension, 93 const FilePath::StringType& default_extension,
89 bool can_save_as_complete, 94 bool can_save_as_complete,
90 const content::SavePackagePathPickedCallback& callback) OVERRIDE; 95 const content::SavePackagePathPickedCallback& callback) OVERRIDE;
91 96
97 // Clears the last directory chosen by the user in response to a file chooser
98 // prompt. Called when clearing recent history.
99 void ClearLastDownloadPath();
100
92 DownloadPrefs* download_prefs() { return download_prefs_.get(); } 101 DownloadPrefs* download_prefs() { return download_prefs_.get(); }
93 DownloadHistory* download_history() { return download_history_.get(); } 102 DownloadHistory* download_history() { return download_history_.get(); }
94 103
95 protected: 104 protected:
96 // So that test classes can inherit from this for override purposes. 105 // So that test classes can inherit from this for override purposes.
97 virtual ~ChromeDownloadManagerDelegate(); 106 virtual ~ChromeDownloadManagerDelegate();
98 107
99 // Returns the SafeBrowsing download protection service if it's 108 // Returns the SafeBrowsing download protection service if it's
100 // enabled. Returns NULL otherwise. Protected virtual for testing. 109 // enabled. Returns NULL otherwise. Protected virtual for testing.
101 virtual safe_browsing::DownloadProtectionService* 110 virtual safe_browsing::DownloadProtectionService*
102 GetDownloadProtectionService(); 111 GetDownloadProtectionService();
103 112
104 // Returns true if this download should show the "dangerous file" warning. 113 // Returns true if this download should show the "dangerous file" warning.
105 // Various factors are considered, such as the type of the file, whether a 114 // Various factors are considered, such as the type of the file, whether a
106 // user action initiated the download, and whether the user has explicitly 115 // user action initiated the download, and whether the user has explicitly
107 // marked the file type as "auto open". Protected virtual for testing. 116 // marked the file type as "auto open". Protected virtual for testing.
108 virtual bool IsDangerousFile(const content::DownloadItem& download, 117 virtual bool IsDangerousFile(const content::DownloadItem& download,
109 const FilePath& suggested_path, 118 const FilePath& suggested_path,
110 bool visited_referrer_before); 119 bool visited_referrer_before);
111 120
112 // Obtains a path reservation by calling 121 // Obtains a path reservation by calling
113 // DownloadPathReservationTracker::GetReservedPath(). Protected virtual for 122 // DownloadPathReservationTracker::GetReservedPath(). Protected virtual for
114 // testing. 123 // testing.
115 virtual void GetReservedPath( 124 virtual void GetReservedPath(
116 content::DownloadItem& download, 125 content::DownloadItem& download,
117 const FilePath& target_path, 126 const FilePath& target_path,
118 const FilePath& default_download_path, 127 const FilePath& default_download_path,
119 bool should_uniquify_path, 128 bool should_uniquify_path,
120 const DownloadPathReservationTracker::ReservedPathCallback callback); 129 const DownloadPathReservationTracker::ReservedPathCallback& callback);
130
131 // Displays the file chooser dialog to prompt the user for the download
132 // location for |item|. |suggested_path| will be used as the initial download
133 // path. Once a location is available |callback| will be invoked with the
134 // selected full path. If the user cancels the dialog, then an empty FilePath
135 // will be passed into |callback|. Protected virtual for testing.
136 virtual void ChooseDownloadPath(content::DownloadItem* item,
137 const FilePath& suggested_path,
138 const FileSelectedCallback& callback);
121 139
122 // So that test classes that inherit from this for override purposes 140 // So that test classes that inherit from this for override purposes
123 // can call back into the DownloadManager. 141 // can call back into the DownloadManager.
124 scoped_refptr<content::DownloadManager> download_manager_; 142 scoped_refptr<content::DownloadManager> download_manager_;
125 143
126 private: 144 private:
127 friend class base::RefCountedThreadSafe<ChromeDownloadManagerDelegate>; 145 friend class base::RefCountedThreadSafe<ChromeDownloadManagerDelegate>;
128 146
129 // content::NotificationObserver implementation. 147 // content::NotificationObserver implementation.
130 virtual void Observe(int type, 148 virtual void Observe(int type,
131 const content::NotificationSource& source, 149 const content::NotificationSource& source,
132 const content::NotificationDetails& details) OVERRIDE; 150 const content::NotificationDetails& details) OVERRIDE;
133 151
134 // Callback function after url is checked with safebrowsing service. 152 // Callback function after url is checked with safebrowsing service.
135 void CheckDownloadUrlDone( 153 void CheckDownloadUrlDone(
136 int32 download_id, 154 int32 download_id,
155 const content::DownloadTargetCallback& callback,
137 safe_browsing::DownloadProtectionService::DownloadCheckResult result); 156 safe_browsing::DownloadProtectionService::DownloadCheckResult result);
138 157
139 // Callback function after the DownloadProtectionService completes. 158 // Callback function after the DownloadProtectionService completes.
140 void CheckClientDownloadDone( 159 void CheckClientDownloadDone(
141 int32 download_id, 160 int32 download_id,
142 safe_browsing::DownloadProtectionService::DownloadCheckResult result); 161 safe_browsing::DownloadProtectionService::DownloadCheckResult result);
143 162
144 // Callback function after we check whether the referrer URL has been visited 163 // Callback function after we check whether the referrer URL has been visited
145 // before today. Determines the danger state of the download based on the file 164 // before today. Determines the danger state of the download based on the file
146 // type and |visited_referrer_before|. Generates a target path for the 165 // type and |visited_referrer_before|. Generates a target path for the
147 // download. Invokes |DownloadPathReservationTracker::GetReservedPath| to get 166 // download. Invokes |DownloadPathReservationTracker::GetReservedPath| to get
148 // a reserved path for the download. The path is then passed into 167 // a reserved path for the download. The path is then passed into
149 // OnPathReservationAvailable(). 168 // OnPathReservationAvailable().
150 void CheckVisitedReferrerBeforeDone(int32 download_id, 169 void CheckVisitedReferrerBeforeDone(
151 content::DownloadDangerType danger_type, 170 int32 download_id,
152 bool visited_referrer_before); 171 const content::DownloadTargetCallback& callback,
172 content::DownloadDangerType danger_type,
173 bool visited_referrer_before);
153 174
154 #if defined (OS_CHROMEOS) 175 #if defined (OS_CHROMEOS)
155 // GDataDownloadObserver::SubstituteGDataDownloadPath callback. Calls 176 // GDataDownloadObserver::SubstituteGDataDownloadPath callback. Calls
156 // |DownloadPathReservationTracker::GetReservedPath| to get a reserved path 177 // |DownloadPathReservationTracker::GetReservedPath| to get a reserved path
157 // for the download. The path is then passed into 178 // for the download. The path is then passed into
158 // OnPathReservationAvailable(). 179 // OnPathReservationAvailable().
159 void SubstituteGDataDownloadPathCallback( 180 void SubstituteGDataDownloadPathCallback(
160 int32 download_id, 181 int32 download_id,
182 const content::DownloadTargetCallback& callback,
161 bool should_prompt, 183 bool should_prompt,
162 bool is_forced_path, 184 bool is_forced_path,
163 content::DownloadDangerType danger_type, 185 content::DownloadDangerType danger_type,
164 const FilePath& unverified_path); 186 const FilePath& unverified_path);
165 #endif 187 #endif
166 188
189 // Determine the intermediate path to use for |target_path|. |danger_type|
190 // specifies the danger level of the download.
191 FilePath GetIntermediatePath(const FilePath& target_path,
192 content::DownloadDangerType danger_type);
193
167 // Called on the UI thread once a reserved path is available. Updates the 194 // Called on the UI thread once a reserved path is available. Updates the
168 // download identified by |download_id| with the |target_path|, target 195 // download identified by |download_id| with the |target_path|, target
169 // disposition and |danger_type|. 196 // disposition and |danger_type|.
170 void OnPathReservationAvailable( 197 void OnPathReservationAvailable(
171 int32 download_id, 198 int32 download_id,
199 const content::DownloadTargetCallback& callback,
172 bool should_prompt, 200 bool should_prompt,
173 content::DownloadDangerType danger_type, 201 content::DownloadDangerType danger_type,
174 const FilePath& target_path, 202 const FilePath& reserved_path,
175 bool target_path_verified); 203 bool reserved_path_verified);
204
205 // Called on the UI thread once the final target path is available.
206 void OnTargetPathDetermined(
207 int32 download_id,
208 const content::DownloadTargetCallback& callback,
209 content::DownloadItem::TargetDisposition disposition,
210 content::DownloadDangerType danger_type,
211 const FilePath& target_path);
176 212
177 // Callback from history system. 213 // Callback from history system.
178 void OnItemAddedToPersistentStore(int32 download_id, int64 db_handle); 214 void OnItemAddedToPersistentStore(int32 download_id, int64 db_handle);
179 215
180 // Check policy of whether we should open this download with a web intents 216 // Check policy of whether we should open this download with a web intents
181 // dispatch. 217 // dispatch.
182 bool ShouldOpenWithWebIntents(const content::DownloadItem* item); 218 bool ShouldOpenWithWebIntents(const content::DownloadItem* item);
183 219
184 // Open the given item with a web intent dispatch. 220 // Open the given item with a web intent dispatch.
185 void OpenWithWebIntent(const content::DownloadItem* item); 221 void OpenWithWebIntent(const content::DownloadItem* item);
(...skipping 24 matching lines...) Expand all
210 #if !defined(OS_ANDROID) 246 #if !defined(OS_ANDROID)
211 // The ExtensionDownloadsEventRouter dispatches download creation, change, and 247 // The ExtensionDownloadsEventRouter dispatches download creation, change, and
212 // erase events to extensions. Like ChromeDownloadManagerDelegate, it's a 248 // erase events to extensions. Like ChromeDownloadManagerDelegate, it's a
213 // chrome-level concept and its lifetime should match DownloadManager. There 249 // chrome-level concept and its lifetime should match DownloadManager. There
214 // should be a separate EDER for on-record and off-record managers. 250 // should be a separate EDER for on-record and off-record managers.
215 // There does not appear to be a separate ExtensionSystem for on-record and 251 // There does not appear to be a separate ExtensionSystem for on-record and
216 // off-record profiles, so ExtensionSystem cannot own the EDER. 252 // off-record profiles, so ExtensionSystem cannot own the EDER.
217 scoped_ptr<ExtensionDownloadsEventRouter> extension_event_router_; 253 scoped_ptr<ExtensionDownloadsEventRouter> extension_event_router_;
218 #endif 254 #endif
219 255
256 // The directory most recently chosen by the user in response to a Save As
257 // dialog for a regular download.
258 FilePath last_download_path_;
259
220 DISALLOW_COPY_AND_ASSIGN(ChromeDownloadManagerDelegate); 260 DISALLOW_COPY_AND_ASSIGN(ChromeDownloadManagerDelegate);
221 }; 261 };
222 262
223 #endif // CHROME_BROWSER_DOWNLOAD_CHROME_DOWNLOAD_MANAGER_DELEGATE_H_ 263 #endif // CHROME_BROWSER_DOWNLOAD_CHROME_DOWNLOAD_MANAGER_DELEGATE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698