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