OLD | NEW |
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 #include "chrome/browser/download/chrome_download_manager_delegate.h" | 5 #include "chrome/browser/download/chrome_download_manager_delegate.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 26 matching lines...) Expand all Loading... |
37 #include "chrome/common/extensions/extension.h" | 37 #include "chrome/common/extensions/extension.h" |
38 #include "chrome/common/pref_names.h" | 38 #include "chrome/common/pref_names.h" |
39 #include "components/user_prefs/pref_registry_syncable.h" | 39 #include "components/user_prefs/pref_registry_syncable.h" |
40 #include "content/public/browser/download_item.h" | 40 #include "content/public/browser/download_item.h" |
41 #include "content/public/browser/download_manager.h" | 41 #include "content/public/browser/download_manager.h" |
42 #include "content/public/browser/notification_source.h" | 42 #include "content/public/browser/notification_source.h" |
43 | 43 |
44 #if defined(OS_CHROMEOS) | 44 #if defined(OS_CHROMEOS) |
45 #include "chrome/browser/chromeos/drive/download_handler.h" | 45 #include "chrome/browser/chromeos/drive/download_handler.h" |
46 #include "chrome/browser/chromeos/drive/file_system_util.h" | 46 #include "chrome/browser/chromeos/drive/file_system_util.h" |
47 #include "chrome/browser/download/save_package_file_picker_chromeos.h" | |
48 #endif | 47 #endif |
49 | 48 |
50 using content::BrowserContext; | |
51 using content::BrowserThread; | 49 using content::BrowserThread; |
52 using content::DownloadId; | 50 using content::DownloadId; |
53 using content::DownloadItem; | 51 using content::DownloadItem; |
54 using content::DownloadManager; | 52 using content::DownloadManager; |
55 using safe_browsing::DownloadProtectionService; | 53 using safe_browsing::DownloadProtectionService; |
56 | 54 |
57 namespace { | 55 namespace { |
58 | 56 |
59 // String pointer used for identifying safebrowing data associated with | 57 // String pointer used for identifying safebrowing data associated with |
60 // a download item. | 58 // a download item. |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 } else { | 144 } else { |
147 // If the URL is malicious, we'll use that as the danger type. The results | 145 // If the URL is malicious, we'll use that as the danger type. The results |
148 // of the content check, if one is performed, will be ignored. | 146 // of the content check, if one is performed, will be ignored. |
149 danger_type = content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL; | 147 danger_type = content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL; |
150 } | 148 } |
151 callback.Run(danger_type); | 149 callback.Run(danger_type); |
152 } | 150 } |
153 | 151 |
154 } // namespace | 152 } // namespace |
155 | 153 |
156 // static | |
157 void ChromeDownloadManagerDelegate::RegisterUserPrefs( | |
158 user_prefs::PrefRegistrySyncable* registry) { | |
159 const base::FilePath& default_download_path = | |
160 download_util::GetDefaultDownloadDirectory(); | |
161 registry->RegisterFilePathPref( | |
162 prefs::kSaveFileDefaultDirectory, | |
163 default_download_path, | |
164 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); | |
165 } | |
166 | |
167 ChromeDownloadManagerDelegate::ChromeDownloadManagerDelegate(Profile* profile) | 154 ChromeDownloadManagerDelegate::ChromeDownloadManagerDelegate(Profile* profile) |
168 : profile_(profile), | 155 : profile_(profile), |
169 next_download_id_(0), | 156 next_download_id_(0), |
170 download_prefs_(new DownloadPrefs(profile)) { | 157 download_prefs_(new DownloadPrefs(profile)) { |
171 } | 158 } |
172 | 159 |
173 ChromeDownloadManagerDelegate::~ChromeDownloadManagerDelegate() { | 160 ChromeDownloadManagerDelegate::~ChromeDownloadManagerDelegate() { |
174 } | 161 } |
175 | 162 |
176 void ChromeDownloadManagerDelegate::SetDownloadManager(DownloadManager* dm) { | 163 void ChromeDownloadManagerDelegate::SetDownloadManager(DownloadManager* dm) { |
177 download_manager_ = dm; | 164 download_manager_ = dm; |
178 } | 165 } |
179 | 166 |
180 void ChromeDownloadManagerDelegate::Shutdown() { | 167 void ChromeDownloadManagerDelegate::Shutdown() { |
181 download_prefs_.reset(); | 168 download_prefs_.reset(); |
182 } | 169 } |
183 | 170 |
184 DownloadId ChromeDownloadManagerDelegate::GetNextId() { | 171 DownloadId ChromeDownloadManagerDelegate::GetNextId() { |
185 if (!profile_->IsOffTheRecord()) | 172 if (!profile_->IsOffTheRecord()) |
186 return DownloadId(this, next_download_id_++); | 173 return DownloadId(this, next_download_id_++); |
187 | 174 |
188 return BrowserContext::GetDownloadManager(profile_->GetOriginalProfile())-> | 175 return content::BrowserContext::GetDownloadManager( |
189 GetDelegate()->GetNextId(); | 176 profile_->GetOriginalProfile())->GetDelegate()->GetNextId(); |
190 } | 177 } |
191 | 178 |
192 bool ChromeDownloadManagerDelegate::DetermineDownloadTarget( | 179 bool ChromeDownloadManagerDelegate::DetermineDownloadTarget( |
193 DownloadItem* download, | 180 DownloadItem* download, |
194 const content::DownloadTargetCallback& callback) { | 181 const content::DownloadTargetCallback& callback) { |
195 DownloadTargetDeterminer::Start(download, | 182 DownloadTargetDeterminer::Start(download, |
196 download_prefs_.get(), | 183 download_prefs_.get(), |
197 last_download_path_, | |
198 this, | 184 this, |
199 callback); | 185 callback); |
200 return true; | 186 return true; |
201 } | 187 } |
202 | 188 |
203 bool ChromeDownloadManagerDelegate::ShouldOpenFileBasedOnExtension( | 189 bool ChromeDownloadManagerDelegate::ShouldOpenFileBasedOnExtension( |
204 const base::FilePath& path) { | 190 const base::FilePath& path) { |
205 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 191 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
206 if (path.Extension().empty()) | 192 if (path.Extension().empty()) |
207 return false; | 193 return false; |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 bool ChromeDownloadManagerDelegate::GenerateFileHash() { | 291 bool ChromeDownloadManagerDelegate::GenerateFileHash() { |
306 #if defined(FULL_SAFE_BROWSING) | 292 #if defined(FULL_SAFE_BROWSING) |
307 return profile_->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled) && | 293 return profile_->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled) && |
308 g_browser_process->safe_browsing_service()->DownloadBinHashNeeded(); | 294 g_browser_process->safe_browsing_service()->DownloadBinHashNeeded(); |
309 #else | 295 #else |
310 return false; | 296 return false; |
311 #endif | 297 #endif |
312 } | 298 } |
313 | 299 |
314 void ChromeDownloadManagerDelegate::GetSaveDir( | 300 void ChromeDownloadManagerDelegate::GetSaveDir( |
315 BrowserContext* browser_context, | 301 content::BrowserContext* browser_context, |
316 base::FilePath* website_save_dir, | 302 base::FilePath* website_save_dir, |
317 base::FilePath* download_save_dir, | 303 base::FilePath* download_save_dir, |
318 bool* skip_dir_check) { | 304 bool* skip_dir_check) { |
319 Profile* profile = Profile::FromBrowserContext(browser_context); | 305 *website_save_dir = download_prefs_->SaveFilePath(); |
320 PrefService* prefs = profile->GetPrefs(); | |
321 | |
322 // Check whether the preference for the preferred directory for | |
323 // saving file has been explicitly set. If not, and the preference | |
324 // for the default download directory has been set, initialize it | |
325 // with the latter. Note that the defaults for both are the same. | |
326 const PrefService::Preference* download_default_directory = | |
327 prefs->FindPreference(prefs::kDownloadDefaultDirectory); | |
328 if (!download_default_directory->IsDefaultValue() && | |
329 prefs->FindPreference( | |
330 prefs::kSaveFileDefaultDirectory)->IsDefaultValue()) { | |
331 prefs->Set(prefs::kSaveFileDefaultDirectory, | |
332 *(download_default_directory->GetValue())); | |
333 } | |
334 | |
335 // Get the directory from preference. | |
336 *website_save_dir = prefs->GetFilePath(prefs::kSaveFileDefaultDirectory); | |
337 DCHECK(!website_save_dir->empty()); | 306 DCHECK(!website_save_dir->empty()); |
338 | 307 *download_save_dir = download_prefs_->DownloadPath(); |
339 *download_save_dir = prefs->GetFilePath(prefs::kDownloadDefaultDirectory); | |
340 | |
341 *skip_dir_check = false; | 308 *skip_dir_check = false; |
342 #if defined(OS_CHROMEOS) | 309 #if defined(OS_CHROMEOS) |
343 *skip_dir_check = drive::util::IsUnderDriveMountPoint(*website_save_dir); | 310 *skip_dir_check = drive::util::IsUnderDriveMountPoint(*website_save_dir); |
344 #endif | 311 #endif |
345 } | 312 } |
346 | 313 |
347 void ChromeDownloadManagerDelegate::ChooseSavePath( | 314 void ChromeDownloadManagerDelegate::ChooseSavePath( |
348 content::WebContents* web_contents, | 315 content::WebContents* web_contents, |
349 const base::FilePath& suggested_path, | 316 const base::FilePath& suggested_path, |
350 const base::FilePath::StringType& default_extension, | 317 const base::FilePath::StringType& default_extension, |
351 bool can_save_as_complete, | 318 bool can_save_as_complete, |
352 const content::SavePackagePathPickedCallback& callback) { | 319 const content::SavePackagePathPickedCallback& callback) { |
353 // Deletes itself. | 320 // Deletes itself. |
354 #if defined(OS_CHROMEOS) | |
355 new SavePackageFilePickerChromeOS( | |
356 web_contents, | |
357 suggested_path, | |
358 can_save_as_complete, | |
359 callback); | |
360 #else | |
361 new SavePackageFilePicker( | 321 new SavePackageFilePicker( |
362 web_contents, | 322 web_contents, |
363 suggested_path, | 323 suggested_path, |
364 default_extension, | 324 default_extension, |
365 can_save_as_complete, | 325 can_save_as_complete, |
366 download_prefs_.get(), | 326 download_prefs_.get(), |
367 callback); | 327 callback); |
368 #endif | |
369 } | 328 } |
370 | 329 |
371 void ChromeDownloadManagerDelegate::OpenDownload(DownloadItem* download) { | 330 void ChromeDownloadManagerDelegate::OpenDownload(DownloadItem* download) { |
372 DCHECK_EQ(DownloadItem::COMPLETE, download->GetState()); | 331 DCHECK_EQ(DownloadItem::COMPLETE, download->GetState()); |
373 if (!download->CanOpenDownload()) | 332 if (!download->CanOpenDownload()) |
374 return; | 333 return; |
375 platform_util::OpenItem(GetPlatformDownloadPath(profile_, download)); | 334 platform_util::OpenItem(GetPlatformDownloadPath(profile_, download)); |
376 } | 335 } |
377 | 336 |
378 void ChromeDownloadManagerDelegate::ShowDownloadInShell( | 337 void ChromeDownloadManagerDelegate::ShowDownloadInShell( |
(...skipping 14 matching lines...) Expand all Loading... |
393 drive_download_handler->CheckForFileExistence(download, callback); | 352 drive_download_handler->CheckForFileExistence(download, callback); |
394 return; | 353 return; |
395 } | 354 } |
396 #endif | 355 #endif |
397 BrowserThread::PostTaskAndReplyWithResult( | 356 BrowserThread::PostTaskAndReplyWithResult( |
398 BrowserThread::FILE, FROM_HERE, | 357 BrowserThread::FILE, FROM_HERE, |
399 base::Bind(&file_util::PathExists, download->GetTargetFilePath()), | 358 base::Bind(&file_util::PathExists, download->GetTargetFilePath()), |
400 callback); | 359 callback); |
401 } | 360 } |
402 | 361 |
403 void ChromeDownloadManagerDelegate::ClearLastDownloadPath() { | |
404 last_download_path_.clear(); | |
405 } | |
406 | |
407 DownloadProtectionService* | 362 DownloadProtectionService* |
408 ChromeDownloadManagerDelegate::GetDownloadProtectionService() { | 363 ChromeDownloadManagerDelegate::GetDownloadProtectionService() { |
409 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 364 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
410 #if defined(FULL_SAFE_BROWSING) | 365 #if defined(FULL_SAFE_BROWSING) |
411 SafeBrowsingService* sb_service = g_browser_process->safe_browsing_service(); | 366 SafeBrowsingService* sb_service = g_browser_process->safe_browsing_service(); |
412 if (sb_service && sb_service->download_protection_service() && | 367 if (sb_service && sb_service->download_protection_service() && |
413 profile_->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled)) { | 368 profile_->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled)) { |
414 return sb_service->download_protection_service(); | 369 return sb_service->download_protection_service(); |
415 } | 370 } |
416 #endif | 371 #endif |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
458 DownloadPathReservationTracker::GetReservedPath( | 413 DownloadPathReservationTracker::GetReservedPath( |
459 *download, virtual_path, download_prefs_->DownloadPath(), | 414 *download, virtual_path, download_prefs_->DownloadPath(), |
460 create_directory, conflict_action, callback); | 415 create_directory, conflict_action, callback); |
461 } | 416 } |
462 | 417 |
463 void ChromeDownloadManagerDelegate::PromptUserForDownloadPath( | 418 void ChromeDownloadManagerDelegate::PromptUserForDownloadPath( |
464 DownloadItem* download, | 419 DownloadItem* download, |
465 const base::FilePath& suggested_path, | 420 const base::FilePath& suggested_path, |
466 const DownloadTargetDeterminerDelegate::FileSelectedCallback& callback) { | 421 const DownloadTargetDeterminerDelegate::FileSelectedCallback& callback) { |
467 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 422 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
468 DownloadFilePicker::ShowFilePicker( | 423 DownloadFilePicker::ShowFilePicker(download, suggested_path, callback); |
469 download, | |
470 suggested_path, | |
471 base::Bind(&ChromeDownloadManagerDelegate::OnDownloadPathSelected, | |
472 this, | |
473 callback)); | |
474 } | |
475 | |
476 void ChromeDownloadManagerDelegate::OnDownloadPathSelected( | |
477 const DownloadTargetDeterminerDelegate::FileSelectedCallback& callback, | |
478 const base::FilePath& virtual_path) { | |
479 if (!virtual_path.empty()) | |
480 last_download_path_ = virtual_path.DirName(); | |
481 callback.Run(virtual_path); | |
482 } | 424 } |
483 | 425 |
484 void ChromeDownloadManagerDelegate::DetermineLocalPath( | 426 void ChromeDownloadManagerDelegate::DetermineLocalPath( |
485 DownloadItem* download, | 427 DownloadItem* download, |
486 const base::FilePath& virtual_path, | 428 const base::FilePath& virtual_path, |
487 const DownloadTargetDeterminerDelegate::LocalPathCallback& callback) { | 429 const DownloadTargetDeterminerDelegate::LocalPathCallback& callback) { |
488 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 430 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
489 #if defined(OS_CHROMEOS) | 431 #if defined(OS_CHROMEOS) |
490 drive::DownloadHandler* drive_download_handler = | 432 drive::DownloadHandler* drive_download_handler = |
491 drive::DownloadHandler::GetForProfile(profile_); | 433 drive::DownloadHandler::GetForProfile(profile_); |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
570 registrar_.Remove(this, | 512 registrar_.Remove(this, |
571 chrome::NOTIFICATION_CRX_INSTALLER_DONE, | 513 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
572 source); | 514 source); |
573 | 515 |
574 scoped_refptr<extensions::CrxInstaller> installer = | 516 scoped_refptr<extensions::CrxInstaller> installer = |
575 content::Source<extensions::CrxInstaller>(source).ptr(); | 517 content::Source<extensions::CrxInstaller>(source).ptr(); |
576 content::DownloadOpenDelayedCallback callback = crx_installers_[installer]; | 518 content::DownloadOpenDelayedCallback callback = crx_installers_[installer]; |
577 crx_installers_.erase(installer.get()); | 519 crx_installers_.erase(installer.get()); |
578 callback.Run(installer->did_handle_successfully()); | 520 callback.Run(installer->did_handle_successfully()); |
579 } | 521 } |
OLD | NEW |