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)#include "chrome/browser/download/chrome_download_manager_delegate.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/basictypes.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_member.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/rand_util.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/task_runner.h" 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/task_runner_util.h" 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/threading/sequenced_worker_pool.h" 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_completion_blocker.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_crx_util.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_file_picker.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_history.h" 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/download/download_item_model.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_path_reservation_tracker.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_prefs.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/download/download_service.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/download/download_service_factory.h" 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/download/download_stats.h" 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/download/download_target_determiner.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/save_package_file_picker.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/platform_util.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_service.h" 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" 42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/common/chrome_constants.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/page_navigator.h" 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/notification_types.h" 50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/base/filename_util.h" 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/base/mime_util.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/download_handler.h" 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/extensions/api/downloads/downloads_api.h" 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/extensions/crx_installer.h" 6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/extensions/webstore_installer.h" 6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/common/constants.h" 6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif 6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadItem; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadManager; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using safe_browsing::DownloadProtectionService; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// String pointer used for identifying safebrowing data associated with 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a download item. 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kSafeBrowsingUserDataKey[] = "Safe Browsing ID"; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The state of a safebrowsing check. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SafeBrowsingState : public DownloadCompletionBlocker { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SafeBrowsingState() {} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SafeBrowsingState(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SafeBrowsingState); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SafeBrowsingState::~SafeBrowsingState() {} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif // FULL_SAFE_BROWSING 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Used with GetPlatformDownloadPath() to indicate which platform path to 93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// return. 94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)enum PlatformDownloadPathType { 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Return the platform specific target path. 96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PLATFORM_TARGET_PATH, 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Return the platform specific current path. If the download is in-progress 99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // and the download location is a local filesystem path, then 100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // GetPlatformDownloadPath will return the path to the intermediate file. 101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PLATFORM_CURRENT_PATH 102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Returns a path in the form that that is expected by platform_util::OpenItem / 105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// platform_util::ShowItemInFolder / DownloadTargetDeterminer. 106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// DownloadItems corresponding to Drive downloads use a temporary file as the 108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// target path. The paths returned by DownloadItem::GetFullPath() / 109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// GetTargetFilePath() refer to this temporary file. This function looks up the 110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// corresponding path in Drive for these downloads. 111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// How the platform path is determined is based on PlatformDownloadPathType. 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetPlatformDownloadPath(Profile* profile, 114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const DownloadItem* download, 115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PlatformDownloadPathType path_type) { 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS) 117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Drive downloads always return the target path for all types. 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) drive::DownloadHandler* drive_download_handler = 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) drive::DownloadHandler::GetForProfile(profile); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (drive_download_handler && 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drive_download_handler->IsDriveDownload(download)) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return drive_download_handler->GetTargetPath(download); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 124b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (path_type == PLATFORM_TARGET_PATH) 126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return download->GetTargetFilePath(); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return download->GetFullPath(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Callback invoked by DownloadProtectionService::CheckClientDownload. 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |is_content_check_supported| is true if the SB service supports scanning the 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// download for malicious content. 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |callback| is invoked with a danger type determined as follows: 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Danger type is (in order of preference): 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// * DANGEROUS_URL, if the URL is a known malware site. 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// * MAYBE_DANGEROUS_CONTENT, if the content will be scanned for 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// malware. I.e. |is_content_check_supported| is true. 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// * NOT_DANGEROUS. 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void CheckDownloadUrlDone( 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const DownloadTargetDeterminerDelegate::CheckDownloadUrlCallback& callback, 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_content_check_supported, 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadProtectionService::DownloadCheckResult result) { 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::DownloadDangerType danger_type; 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result == DownloadProtectionService::SAFE || 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result == DownloadProtectionService::UNKNOWN) { 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If this type of files is handled by the enhanced SafeBrowsing download 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // protection, mark it as potentially dangerous content until we are done 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // with scanning it. 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (is_content_check_supported) 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) danger_type = content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT; 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) danger_type = content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS; 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the URL is malicious, we'll use that as the danger type. The results 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // of the content check, if one is performed, will be ignored. 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) danger_type = content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL; 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback.Run(danger_type); 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif // FULL_SAFE_BROWSING 16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Called on the blocking pool to determine the MIME type for |path|. 166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)std::string GetMimeType(const base::FilePath& path) { 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string mime_type; 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::GetMimeTypeFromFile(path, &mime_type); 169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return mime_type; 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeDownloadManagerDelegate::ChromeDownloadManagerDelegate(Profile* profile) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : profile_(profile), 1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch next_download_id_(content::DownloadItem::kInvalidId), 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) download_prefs_(new DownloadPrefs(profile)), 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_ptr_factory_(this) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeDownloadManagerDelegate::~ChromeDownloadManagerDelegate() { 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If a DownloadManager was set for this, Shutdown() must be called. 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!download_manager_); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeDownloadManagerDelegate::SetDownloadManager(DownloadManager* dm) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_manager_ = dm; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeDownloadManagerDelegate::Shutdown() { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_prefs_.reset(); 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_ptr_factory_.InvalidateWeakPtrs(); 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) download_manager_ = NULL; 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)content::DownloadIdCallback 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ChromeDownloadManagerDelegate::GetDownloadIdReceiverCallback() { 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::Bind(&ChromeDownloadManagerDelegate::SetNextId, 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr()); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ChromeDownloadManagerDelegate::SetNextId(uint32 next_id) { 2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(!profile_->IsOffTheRecord()); 2057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK_NE(content::DownloadItem::kInvalidId, next_id); 2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch next_download_id_ = next_id; 2077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IdCallbackVector callbacks; 2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch id_callbacks_.swap(callbacks); 2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (IdCallbackVector::const_iterator it = callbacks.begin(); 2117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch it != callbacks.end(); ++it) { 2127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ReturnNextId(*it); 2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ChromeDownloadManagerDelegate::GetNextId( 2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const content::DownloadIdCallback& callback) { 2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (profile_->IsOffTheRecord()) { 2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::BrowserContext::GetDownloadManager( 2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch profile_->GetOriginalProfile())->GetDelegate()->GetNextId(callback); 2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (next_download_id_ == content::DownloadItem::kInvalidId) { 2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch id_callbacks_.push_back(callback); 2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ReturnNextId(callback); 2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ChromeDownloadManagerDelegate::ReturnNextId( 2327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const content::DownloadIdCallback& callback) { 2337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(!profile_->IsOffTheRecord()); 2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK_NE(content::DownloadItem::kInvalidId, next_download_id_); 2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch callback.Run(next_download_id_++); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeDownloadManagerDelegate::DetermineDownloadTarget( 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* download, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::DownloadTargetCallback& callback) { 242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DownloadTargetDeterminer::CompletionCallback target_determined_callback = 243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&ChromeDownloadManagerDelegate::OnDownloadTargetDetermined, 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) download->GetId(), 246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) callback); 247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DownloadTargetDeterminer::Start( 248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) download, 249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetPlatformDownloadPath(profile_, download, PLATFORM_TARGET_PATH), 250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) download_prefs_.get(), 251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) this, 252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) target_determined_callback); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeDownloadManagerDelegate::ShouldOpenFileBasedOnExtension( 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (path.Extension().empty()) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 26146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(asanka): This determination is done based on |path|, while 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // ShouldOpenDownload() detects extension downloads based on the 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // characteristics of the download. Reconcile this. http://crbug.com/167702 265a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (path.MatchesExtension(extensions::kExtensionFileExtension)) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return download_prefs_->IsAutoOpenEnabledBasedOnExtension(path); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeDownloadManagerDelegate::DisableSafeBrowsing(DownloadItem* item) { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingState* state = static_cast<SafeBrowsingState*>( 27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) item->GetUserData(&kSafeBrowsingUserDataKey)); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!state) { 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = new SafeBrowsingState(); 27958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) item->SetUserData(&kSafeBrowsingUserDataKey, state); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci state->CompleteDownload(); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeDownloadManagerDelegate::IsDownloadReadyForCompletion( 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item, 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& internal_complete_callback) { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingState* state = static_cast<SafeBrowsingState*>( 29158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) item->GetUserData(&kSafeBrowsingUserDataKey)); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!state) { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Begin the safe browsing download protection check. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadProtectionService* service = GetDownloadProtectionService(); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (service) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(2) << __FUNCTION__ << "() Start SB download check for download = " 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << item->DebugString(false); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = new SafeBrowsingState(); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->set_callback(internal_complete_callback); 30058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) item->SetUserData(&kSafeBrowsingUserDataKey, state); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->CheckClientDownload( 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item, 3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&ChromeDownloadManagerDelegate::CheckClientDownloadDone, 3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci weak_ptr_factory_.GetWeakPtr(), 3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci item->GetId())); 3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // In case the service was disabled between the download starting and now, 3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // we need to restore the danger state. 3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::DownloadDangerType danger_type = item->GetDangerType(); 3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (DownloadItemModel(item).IsDangerousFileBasedOnType() && 3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (danger_type == content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS || 3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci danger_type == 3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT)) { 3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DVLOG(2) << __FUNCTION__ 3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << "() SB service disabled. Marking download as DANGEROUS FILE"; 3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci item->OnContentCheckCompleted( 3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); 3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::BrowserThread::PostTask( 3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::BrowserThread::UI, FROM_HERE, internal_complete_callback); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (!state->is_complete()) { 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't complete the download until we have an answer. 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->set_callback(internal_complete_callback); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeDownloadManagerDelegate::ShouldCompleteDownloadInternal( 3357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch uint32 download_id, 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& user_complete_callback) { 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = download_manager_->GetDownload(download_id); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!item) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShouldCompleteDownload(item, user_complete_callback)) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_complete_callback.Run(); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeDownloadManagerDelegate::ShouldCompleteDownload( 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item, 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& user_complete_callback) { 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return IsDownloadReadyForCompletion(item, base::Bind( 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ChromeDownloadManagerDelegate::ShouldCompleteDownloadInternal, 349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), item->GetId(), user_complete_callback)); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeDownloadManagerDelegate::ShouldOpenDownload( 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item, const content::DownloadOpenDelayedCallback& callback) { 35446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 3550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (download_crx_util::IsExtensionDownload(*item) && 3560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch !extensions::WebstoreInstaller::GetAssociatedApproval(*item)) { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<extensions::CrxInstaller> crx_installer = 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_crx_util::OpenChromeExtension(profile_, *item); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CRX_INSTALLER_DONE will fire when the install completes. At that 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time, Observe() will call the passed callback. 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add( 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 3645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<extensions::CrxInstaller>(crx_installer.get())); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crx_installers_[crx_installer.get()] = callback; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The status text and percent complete indicator will change now 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that we are installing a CRX. Update observers so that they pick 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // up the change. 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item->UpdateObservers(); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeDownloadManagerDelegate::GenerateFileHash() { 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return profile_->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled) && 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_browser_process->safe_browsing_service()->DownloadBinHashNeeded(); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeDownloadManagerDelegate::GetSaveDir( 389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::BrowserContext* browser_context, 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* website_save_dir, 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* download_save_dir, 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool* skip_dir_check) { 393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) *website_save_dir = download_prefs_->SaveFilePath(); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!website_save_dir->empty()); 395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) *download_save_dir = download_prefs_->DownloadPath(); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *skip_dir_check = false; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *skip_dir_check = drive::util::IsUnderDriveMountPoint(*website_save_dir); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeDownloadManagerDelegate::ChooseSavePath( 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::WebContents* web_contents, 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& suggested_path, 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::StringType& default_extension, 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool can_save_as_complete, 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::SavePackagePathPickedCallback& callback) { 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deletes itself. 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new SavePackageFilePicker( 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents, 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_path, 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default_extension, 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) can_save_as_complete, 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_prefs_.get(), 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ChromeDownloadManagerDelegate::OpenDownloadUsingPlatformHandler( 419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DownloadItem* download) { 420868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath platform_path( 421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetPlatformDownloadPath(profile_, download, PLATFORM_TARGET_PATH)); 422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!platform_path.empty()); 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) platform_util::OpenItem(profile_, platform_path); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 426f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ChromeDownloadManagerDelegate::OpenDownload(DownloadItem* download) { 427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK_EQ(DownloadItem::COMPLETE, download->GetState()); 428f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(!download->GetTargetFilePath().empty()); 429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!download->CanOpenDownload()) 430f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!DownloadItemModel(download).ShouldPreferOpeningInBrowser()) { 433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RecordDownloadOpenMethod(DOWNLOAD_OPEN_METHOD_DEFAULT_PLATFORM); 434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) OpenDownloadUsingPlatformHandler(download); 435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 437f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if !defined(OS_ANDROID) 439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WebContents* web_contents = download->GetWebContents(); 440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Browser* browser = 441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_contents ? chrome::FindBrowserWithWebContents(web_contents) : NULL; 442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<chrome::ScopedTabbedBrowserDisplayer> browser_displayer; 443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!browser || 444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) !browser->CanSupportWindowFeature(Browser::FEATURE_TABSTRIP)) { 445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser_displayer.reset(new chrome::ScopedTabbedBrowserDisplayer( 446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) profile_, chrome::GetActiveDesktop())); 447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser = browser_displayer->browser(); 448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::OpenURLParams params( 450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::FilePathToFileURL(download->GetTargetFilePath()), 451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::Referrer(), 452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NEW_FOREGROUND_TAB, 4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_LINK, 454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) false); 455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser->OpenURL(params); 456f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RecordDownloadOpenMethod(DOWNLOAD_OPEN_METHOD_DEFAULT_BROWSER); 457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else 458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // ShouldPreferOpeningInBrowser() should never be true on Android. 459f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NOTREACHED(); 460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeDownloadManagerDelegate::ShowDownloadInShell( 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* download) { 465b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!download->CanShowInFolder()) 466b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return; 467868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath platform_path( 468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetPlatformDownloadPath(profile_, download, PLATFORM_CURRENT_PATH)); 469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!platform_path.empty()); 4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) platform_util::ShowItemInFolder(profile_, platform_path); 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeDownloadManagerDelegate::CheckForFileExistence( 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* download, 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::CheckForFileExistenceCallback& callback) { 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS) 477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) drive::DownloadHandler* drive_download_handler = 478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) drive::DownloadHandler::GetForProfile(profile_); 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (drive_download_handler && 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drive_download_handler->IsDriveDownload(download)) { 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drive_download_handler->CheckForFileExistence(download, callback); 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static const char kSequenceToken[] = "ChromeDMD-FileExistenceChecker"; 486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::SequencedWorkerPool* worker_pool = BrowserThread::GetBlockingPool(); 487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> task_runner = 488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) worker_pool->GetSequencedTaskRunnerWithShutdownBehavior( 489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) worker_pool->GetNamedSequenceToken(kSequenceToken), 490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); 491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::PostTaskAndReplyWithResult( 492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) task_runner.get(), 493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FROM_HERE, 4947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(&base::PathExists, download->GetTargetFilePath()), 495b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) callback); 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 498ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochstd::string 499ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochChromeDownloadManagerDelegate::ApplicationClientIdForFileScanning() const { 500ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return std::string(chrome::kApplicationClientIDStringForAVScanning); 501ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 502ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DownloadProtectionService* 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeDownloadManagerDelegate::GetDownloadProtectionService() { 505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingService* sb_service = g_browser_process->safe_browsing_service(); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sb_service && sb_service->download_protection_service() && 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled)) { 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sb_service->download_protection_service(); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ChromeDownloadManagerDelegate::NotifyExtensions( 517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadItem* download, 518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& virtual_path, 519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const NotifyExtensionsCallback& callback) { 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 52146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 5225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu extensions::ExtensionDownloadsEventRouter* router = 5235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DownloadServiceFactory::GetForBrowserContext(profile_) 5245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ->GetExtensionEventRouter(); 525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (router) { 526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Closure original_path_callback = 527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(callback, base::FilePath(), 528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadPathReservationTracker::UNIQUIFY); 529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) router->OnDeterminingFilename(download, virtual_path.BaseName(), 530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) original_path_callback, 531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback); 532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback.Run(base::FilePath(), DownloadPathReservationTracker::UNIQUIFY); 536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ChromeDownloadManagerDelegate::ReserveVirtualPath( 539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::DownloadItem* download, 540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& virtual_path, 541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool create_directory, 542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadPathReservationTracker::FilenameConflictAction conflict_action, 543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const DownloadTargetDeterminerDelegate::ReservedPathCallback& callback) { 544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!virtual_path.empty()); 546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(asanka): Handle path reservations for virtual paths as well. 548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // http://crbug.com/151618 549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (drive::util::IsUnderDriveMountPoint(virtual_path)) { 550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback.Run(virtual_path, true); 551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadPathReservationTracker::GetReservedPath( 5557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch download, 5567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual_path, 5577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch download_prefs_->DownloadPath(), 5587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch create_directory, 5597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch conflict_action, 5607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch callback); 561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ChromeDownloadManagerDelegate::PromptUserForDownloadPath( 564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadItem* download, 565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& suggested_path, 566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const DownloadTargetDeterminerDelegate::FileSelectedCallback& callback) { 567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 568868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DownloadFilePicker::ShowFilePicker(download, suggested_path, callback); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ChromeDownloadManagerDelegate::DetermineLocalPath( 572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadItem* download, 573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& virtual_path, 574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const DownloadTargetDeterminerDelegate::LocalPathCallback& callback) { 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) drive::DownloadHandler* drive_download_handler = 578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) drive::DownloadHandler::GetForProfile(profile_); 579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (drive_download_handler) { 580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) drive_download_handler->SubstituteDriveDownloadPath( 581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual_path, download, callback); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback.Run(virtual_path); 586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ChromeDownloadManagerDelegate::CheckDownloadUrl( 589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadItem* download, 590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& suggested_path, 591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const CheckDownloadUrlCallback& callback) { 592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) safe_browsing::DownloadProtectionService* service = 596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetDownloadProtectionService(); 597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (service) { 598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_content_check_supported = 599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) service->IsSupportedDownload(*download, suggested_path); 600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG(2) << __FUNCTION__ << "() Start SB URL check for download = " 601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) << download->DebugString(false); 602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) service->CheckDownloadUrl(*download, 603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&CheckDownloadUrlDone, 604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback, 605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_content_check_supported)); 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback.Run(content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 612f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ChromeDownloadManagerDelegate::GetFileMimeType( 613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::FilePath& path, 614f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GetFileMimeTypeCallback& callback) { 615f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 616f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::PostTaskAndReplyWithResult(BrowserThread::GetBlockingPool(), 617f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FROM_HERE, 618f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&GetMimeType, path), 619f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) callback); 620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 62258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeDownloadManagerDelegate::CheckClientDownloadDone( 6247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch uint32 download_id, 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadProtectionService::DownloadCheckResult result) { 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = download_manager_->GetDownload(download_id); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!item || (item->GetState() != DownloadItem::IN_PROGRESS)) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(2) << __FUNCTION__ << "() download = " << item->DebugString(false) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " verdict = " << result; 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only mark the content as being dangerous if the download's safety state 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // has not been set to DANGEROUS yet. We don't want to show two warnings. 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (item->GetDangerType() == content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS || 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item->GetDangerType() == 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT) { 637a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch content::DownloadDangerType danger_type = 638a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (result) { 6401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case DownloadProtectionService::UNKNOWN: 6411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The check failed or was inconclusive. 6421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (DownloadItemModel(item).IsDangerousFileBasedOnType()) 6431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci danger_type = content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE; 6441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DownloadProtectionService::SAFE: 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do nothing. 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DownloadProtectionService::DANGEROUS: 649a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch danger_type = content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT; 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DownloadProtectionService::UNCOMMON: 652a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch danger_type = content::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case DownloadProtectionService::DANGEROUS_HOST: 655a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch danger_type = content::DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST; 656a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch break; 657a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch case DownloadProtectionService::POTENTIALLY_UNWANTED: 658a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch danger_type = content::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED; 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 661a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 662a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (danger_type != content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS) 663a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch item->OnContentCheckCompleted(danger_type); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingState* state = static_cast<SafeBrowsingState*>( 66758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) item->GetUserData(&kSafeBrowsingUserDataKey)); 6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci state->CompleteDownload(); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 67058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif // FULL_SAFE_BROWSING 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content::NotificationObserver implementation. 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeDownloadManagerDelegate::Observe( 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type, 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 67746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 6785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(type == extensions::NOTIFICATION_CRX_INSTALLER_DONE); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) registrar_.Remove(this, extensions::NOTIFICATION_CRX_INSTALLER_DONE, source); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<extensions::CrxInstaller> installer = 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<extensions::CrxInstaller>(source).ptr(); 684868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::DownloadOpenDelayedCallback callback = 685868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) crx_installers_[installer.get()]; 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crx_installers_.erase(installer.get()); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(installer->did_handle_successfully()); 68846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 690f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 691f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ChromeDownloadManagerDelegate::OnDownloadTargetDetermined( 692f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int32 download_id, 693f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const content::DownloadTargetCallback& callback, 694f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<DownloadTargetInfo> target_info) { 695f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 696f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DownloadItem* item = download_manager_->GetDownload(download_id); 6971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (item) { 6981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!target_info->target_path.empty() && 6991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IsOpenInBrowserPreferreredForFile(target_info->target_path) && 7001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci target_info->is_filetype_handled_safely) 7011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DownloadItemModel(item).SetShouldPreferOpeningInBrowser(true); 7021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (target_info->is_dangerous_file) 7041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DownloadItemModel(item).SetIsDangerousFileBasedOnType(true); 7051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) callback.Run(target_info->target_path, 707f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) target_info->target_disposition, 708f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) target_info->danger_type, 709f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) target_info->intermediate_path); 710f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 711116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 712116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ChromeDownloadManagerDelegate::IsOpenInBrowserPreferreredForFile( 713116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath& path) { 714116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // On Windows, PDFs should open in Acrobat Reader if the user chooses. 715116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN) 716116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (path.MatchesExtension(FILE_PATH_LITERAL(".pdf")) && 717116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DownloadTargetDeterminer::IsAdobeReaderUpToDate()) { 718116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return !download_prefs_->ShouldOpenPdfInAdobeReader(); 719116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 720116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 721116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 722116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // On Android, always prefer opening with an external app. On ChromeOS, there 723116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // are no external apps so just allow all opens to be handled by the "System." 724116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) && defined(ENABLE_PLUGINS) 725116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(asanka): Consider other file types and MIME types. 726116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // http://crbug.com/323561 727116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (path.MatchesExtension(FILE_PATH_LITERAL(".pdf")) || 728116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch path.MatchesExtension(FILE_PATH_LITERAL(".htm")) || 729116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch path.MatchesExtension(FILE_PATH_LITERAL(".html")) || 730116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch path.MatchesExtension(FILE_PATH_LITERAL(".shtm")) || 731116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch path.MatchesExtension(FILE_PATH_LITERAL(".shtml")) || 732116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch path.MatchesExtension(FILE_PATH_LITERAL(".svg")) || 733116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch path.MatchesExtension(FILE_PATH_LITERAL(".xht")) || 734116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch path.MatchesExtension(FILE_PATH_LITERAL(".xhtm")) || 735116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch path.MatchesExtension(FILE_PATH_LITERAL(".xhtml")) || 736116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch path.MatchesExtension(FILE_PATH_LITERAL(".xsl")) || 737116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch path.MatchesExtension(FILE_PATH_LITERAL(".xslt"))) { 738116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 739116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 740116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 741116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 742116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 743