OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/download_manager.h" | 5 #include "chrome/browser/download/download_manager.h" |
6 | 6 |
7 #include "base/callback.h" | 7 #include "base/callback.h" |
8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
9 #include "base/i18n/case_conversion.h" | 9 #include "base/i18n/case_conversion.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
273 bool is_dangerous_url) { | 273 bool is_dangerous_url) { |
274 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 274 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
275 | 275 |
276 DownloadItem* download = GetActiveDownloadItem(download_id); | 276 DownloadItem* download = GetActiveDownloadItem(download_id); |
277 if (!download) | 277 if (!download) |
278 return; | 278 return; |
279 | 279 |
280 if (is_dangerous_url) | 280 if (is_dangerous_url) |
281 download->MarkUrlDangerous(); | 281 download->MarkUrlDangerous(); |
282 | 282 |
283 DownloadStateInfo state = download->state_info(); | 283 download_history_->CheckVisitedReferrerBefore(download_id, |
| 284 download->referrer_url(), |
| 285 NewCallback(this, &DownloadManager::CheckVisitedReferrerBeforeDone)); |
| 286 } |
| 287 |
| 288 void DownloadManager::CheckVisitedReferrerBeforeDone( |
| 289 int32 download_id, |
| 290 bool visited_referrer_before) { |
| 291 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 292 |
| 293 DownloadItem* download = GetActiveDownloadItem(download_id); |
| 294 if (!download) |
| 295 return; |
284 | 296 |
285 // Check whether this download is for an extension install or not. | 297 // Check whether this download is for an extension install or not. |
286 // Allow extensions to be explicitly saved. | 298 // Allow extensions to be explicitly saved. |
| 299 DownloadStateInfo state = download->state_info(); |
287 if (!state.prompt_user_for_save_location) { | 300 if (!state.prompt_user_for_save_location) { |
288 if (UserScript::IsURLUserScript(download->GetURL(), | 301 if (UserScript::IsURLUserScript(download->GetURL(), |
289 download->mime_type()) || | 302 download->mime_type()) || |
290 (download->mime_type() == Extension::kMimeType)) { | 303 (download->mime_type() == Extension::kMimeType)) { |
291 state.is_extension_install = true; | 304 state.is_extension_install = true; |
292 } | 305 } |
293 } | 306 } |
294 | 307 |
295 if (state.force_file_name.empty()) { | 308 if (state.force_file_name.empty()) { |
296 FilePath generated_name; | 309 FilePath generated_name; |
(...skipping 27 matching lines...) Expand all Loading... |
324 if (state.prompt_user_for_save_location && !last_download_path_.empty()) { | 337 if (state.prompt_user_for_save_location && !last_download_path_.empty()) { |
325 state.suggested_path = last_download_path_; | 338 state.suggested_path = last_download_path_; |
326 } else { | 339 } else { |
327 state.suggested_path = download_prefs_->download_path(); | 340 state.suggested_path = download_prefs_->download_path(); |
328 } | 341 } |
329 state.suggested_path = state.suggested_path.Append(generated_name); | 342 state.suggested_path = state.suggested_path.Append(generated_name); |
330 } else { | 343 } else { |
331 state.suggested_path = state.force_file_name; | 344 state.suggested_path = state.force_file_name; |
332 } | 345 } |
333 | 346 |
334 if (!state.prompt_user_for_save_location && state.force_file_name.empty()) | 347 if (!state.prompt_user_for_save_location && state.force_file_name.empty()) { |
335 state.is_dangerous_file = IsDangerous(*download, state); | 348 state.is_dangerous_file = |
| 349 IsDangerous(*download, state, visited_referrer_before); |
| 350 } |
336 | 351 |
337 // We need to move over to the download thread because we don't want to stat | 352 // We need to move over to the download thread because we don't want to stat |
338 // the suggested path on the UI thread. | 353 // the suggested path on the UI thread. |
339 // We can only access preferences on the UI thread, so check the download path | 354 // We can only access preferences on the UI thread, so check the download path |
340 // now and pass the value to the FILE thread. | 355 // now and pass the value to the FILE thread. |
341 BrowserThread::PostTask( | 356 BrowserThread::PostTask( |
342 BrowserThread::FILE, FROM_HERE, | 357 BrowserThread::FILE, FROM_HERE, |
343 NewRunnableMethod( | 358 NewRunnableMethod( |
344 this, | 359 this, |
345 &DownloadManager::CheckIfSuggestedPathExists, | 360 &DownloadManager::CheckIfSuggestedPathExists, |
346 download_id, | 361 download->id(), |
347 state, | 362 state, |
348 download_prefs()->download_path())); | 363 download_prefs()->download_path())); |
349 } | 364 } |
350 | 365 |
351 void DownloadManager::CheckIfSuggestedPathExists(int32 download_id, | 366 void DownloadManager::CheckIfSuggestedPathExists(int32 download_id, |
352 DownloadStateInfo state, | 367 DownloadStateInfo state, |
353 const FilePath& default_path) { | 368 const FilePath& default_path) { |
354 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 369 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
355 | 370 |
356 // Make sure the default download directory exists. | 371 // Make sure the default download directory exists. |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
430 } | 445 } |
431 | 446 |
432 BrowserThread::PostTask( | 447 BrowserThread::PostTask( |
433 BrowserThread::UI, FROM_HERE, | 448 BrowserThread::UI, FROM_HERE, |
434 NewRunnableMethod(this, | 449 NewRunnableMethod(this, |
435 &DownloadManager::OnPathExistenceAvailable, | 450 &DownloadManager::OnPathExistenceAvailable, |
436 download_id, | 451 download_id, |
437 state)); | 452 state)); |
438 } | 453 } |
439 | 454 |
440 void DownloadManager::OnPathExistenceAvailable( | 455 void DownloadManager::OnPathExistenceAvailable(int32 download_id, |
441 int32 download_id, DownloadStateInfo new_state) { | 456 DownloadStateInfo new_state) { |
442 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 457 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
443 | 458 |
444 DownloadItem* download = GetActiveDownloadItem(download_id); | 459 DownloadItem* download = GetActiveDownloadItem(download_id); |
445 if (!download) | 460 if (!download) |
446 return; | 461 return; |
447 | 462 |
448 VLOG(20) << __FUNCTION__ << "()" | 463 VLOG(20) << __FUNCTION__ << "()" |
449 << " download = " << download->DebugString(true); | 464 << " download = " << download->DebugString(true); |
450 | 465 |
451 download->SetFileCheckResults(new_state); | 466 download->SetFileCheckResults(new_state); |
(...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1030 return; | 1045 return; |
1031 | 1046 |
1032 VLOG(20) << __FUNCTION__ << "()" | 1047 VLOG(20) << __FUNCTION__ << "()" |
1033 << " download = " << download->DebugString(true); | 1048 << " download = " << download->DebugString(true); |
1034 | 1049 |
1035 DownloadCancelledInternal(download_id, download->process_handle()); | 1050 DownloadCancelledInternal(download_id, download->process_handle()); |
1036 } | 1051 } |
1037 | 1052 |
1038 // TODO(phajdan.jr): This is apparently not being exercised in tests. | 1053 // TODO(phajdan.jr): This is apparently not being exercised in tests. |
1039 bool DownloadManager::IsDangerous(const DownloadItem& download, | 1054 bool DownloadManager::IsDangerous(const DownloadItem& download, |
1040 const DownloadStateInfo& state) { | 1055 const DownloadStateInfo& state, |
| 1056 bool visited_referrer_before) { |
1041 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1057 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1042 | 1058 |
1043 bool auto_open = ShouldOpenFileBasedOnExtension(state.suggested_path); | 1059 bool auto_open = ShouldOpenFileBasedOnExtension(state.suggested_path); |
1044 download_util::DownloadDangerLevel danger_level = | 1060 download_util::DownloadDangerLevel danger_level = |
1045 download_util::GetFileDangerLevel(state.suggested_path.BaseName()); | 1061 download_util::GetFileDangerLevel(state.suggested_path.BaseName()); |
1046 | 1062 |
1047 if (danger_level == download_util::Dangerous) | 1063 if (danger_level == download_util::Dangerous) |
1048 return !(auto_open && state.has_user_gesture); | 1064 return !(auto_open && state.has_user_gesture); |
1049 | 1065 |
1050 if (danger_level == download_util::AllowOnUserGesture && | 1066 if (danger_level == download_util::AllowOnUserGesture && |
1051 !state.has_user_gesture) | 1067 (!state.has_user_gesture || !visited_referrer_before)) |
1052 return true; | 1068 return true; |
1053 | 1069 |
1054 if (state.is_extension_install) { | 1070 if (state.is_extension_install) { |
1055 // Extensions that are not from the gallery are considered dangerous. | 1071 // Extensions that are not from the gallery are considered dangerous. |
1056 ExtensionService* service = profile()->GetExtensionService(); | 1072 ExtensionService* service = profile()->GetExtensionService(); |
1057 if (!service || !service->IsDownloadFromGallery(download.GetURL(), | 1073 if (!service || !service->IsDownloadFromGallery(download.GetURL(), |
1058 download.referrer_url())) | 1074 download.referrer_url())) |
1059 return true; | 1075 return true; |
1060 } | 1076 } |
1061 return false; | 1077 return false; |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1261 observed_download_manager_->RemoveObserver(this); | 1277 observed_download_manager_->RemoveObserver(this); |
1262 } | 1278 } |
1263 | 1279 |
1264 void DownloadManager::OtherDownloadManagerObserver::ModelChanged() { | 1280 void DownloadManager::OtherDownloadManagerObserver::ModelChanged() { |
1265 observing_download_manager_->NotifyModelChanged(); | 1281 observing_download_manager_->NotifyModelChanged(); |
1266 } | 1282 } |
1267 | 1283 |
1268 void DownloadManager::OtherDownloadManagerObserver::ManagerGoingDown() { | 1284 void DownloadManager::OtherDownloadManagerObserver::ManagerGoingDown() { |
1269 observed_download_manager_ = NULL; | 1285 observed_download_manager_ = NULL; |
1270 } | 1286 } |
OLD | NEW |