1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_TARGET_DETERMINER_DELEGATE_H_ 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_TARGET_DETERMINER_DELEGATE_H_ 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/callback_forward.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/download/download_path_reservation_tracker.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/download_danger_type.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ExtensionDownloadsEventRouter; 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace base { 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FilePath; 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace content { 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DownloadItem; 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Delegate for DownloadTargetDeterminer. The delegate isn't owned by 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// DownloadTargetDeterminer and is expected to outlive it. 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DownloadTargetDeterminerDelegate { 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Callback to be invoked after NotifyExtensions() completes. The 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |new_virtual_path| should be set to a new path if an extension wishes to 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // override the download path. |conflict_action| should be set to the action 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // to take if a file exists at |new_virtual_path|. If |new_virtual_path| is 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // empty, then the download target will be unchanged and |conflict_action| is 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // ignored. 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef base::Callback<void( 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& new_virtual_path, 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadPathReservationTracker::FilenameConflictAction conflict_action)> 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NotifyExtensionsCallback; 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Callback to be invoked when ReserveVirtualPath() completes. If the path 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // reservation is successful, then |successful| should be true and 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |reserved_path| should contain the reserved path. Otherwise, |successful| 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // should be false. In the failure case, |reserved_path| is ignored. 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef base::Callback<void(const base::FilePath& reserved_path, 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool successful)> ReservedPathCallback; 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Callback to be invoked when PromptUserForDownloadPath() completes. 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |virtual_path|: The path chosen by the user. If the user cancels the file 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // selection, then this parameter will be the empty path. On Chrome OS, 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // this path may contain virtual mount points if the user chose a virtual 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // path (e.g. Google Drive). 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef base::Callback<void(const base::FilePath& virtual_path)> 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FileSelectedCallback; 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Callback to be invoked when DetermineLocalPath() completes. The argument 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // should be the determined local path. It should be non-empty on success. If 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |virtual_path| is already a local path, then |virtual_path| should be 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // returned as-is. 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef base::Callback<void(const base::FilePath&)> LocalPathCallback; 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Callback to be invoked after CheckDownloadUrl() completes. The parameter to 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the callback should indicate the danger type of the download based on the 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // results of the URL check. 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef base::Callback<void(content::DownloadDangerType danger_type)> 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CheckDownloadUrlCallback; 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Callback to be invoked after GetFileMimeType() completes. The parameter 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // should be the MIME type of the requested file. If no MIME type can be 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // determined, it should be set to the empty string. 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) typedef base::Callback<void(const std::string&)> GetFileMimeTypeCallback; 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Notifies extensions of the impending filename determination. |virtual_path| 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // is the current suggested virtual path. The |callback| should be invoked to 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // indicate whether any extensions wish to override the path. 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void NotifyExtensions(content::DownloadItem* download, 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& virtual_path, 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const NotifyExtensionsCallback& callback) = 0; 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Reserve |virtual_path|. This is expected to check the following: 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // - Whether |virtual_path| can be written to by the user. If not, the 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |virtual_path| can be changed to writeable path if necessary. 80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // - If |conflict_action| is UNIQUIFY then |virtual_path| should be 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // modified so that the new path is writeable and unique. If 82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // |conflict_action| is PROMPT, then in the event of a conflict, 83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // |callback| should be invoked with |success| set to |false| in 84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // order to force a prompt. |virtual_path| may or may not be 85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // modified in the latter case. 86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // - If |create_directory| is true, then the parent directory of 87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // |virtual_path| should be created if it doesn't exist. 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |callback| should be invoked on completion with the results. 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ReserveVirtualPath( 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::DownloadItem* download, 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& virtual_path, 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool create_directory, 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadPathReservationTracker::FilenameConflictAction conflict_action, 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ReservedPathCallback& callback) = 0; 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Display a prompt to the user requesting that a download target be chosen. 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Should invoke |callback| upon completion. 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void PromptUserForDownloadPath( 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::DownloadItem* download, 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& virtual_path, 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const FileSelectedCallback& callback) = 0; 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If |virtual_path| is not a local path, should return a possibly temporary 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // local path to use for storing the downloaded file. If |virtual_path| is 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // already local, then it should return the same path. |callback| should be 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // invoked to return the path. 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DetermineLocalPath(content::DownloadItem* download, 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& virtual_path, 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LocalPathCallback& callback) = 0; 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check whether the download URL is malicious and invoke |callback| with a 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // suggested danger type for the download. 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CheckDownloadUrl(content::DownloadItem* download, 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& virtual_path, 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const CheckDownloadUrlCallback& callback) = 0; 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Get the MIME type for the given file. 119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void GetFileMimeType(const base::FilePath& path, 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GetFileMimeTypeCallback& callback) = 0; 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~DownloadTargetDeterminerDelegate(); 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_TARGET_DETERMINER_DELEGATE_H_ 126