Upstream version 9.37.195.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / download / chrome_download_manager_delegate.h
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CHROME_BROWSER_DOWNLOAD_CHROME_DOWNLOAD_MANAGER_DELEGATE_H_
6 #define CHROME_BROWSER_DOWNLOAD_CHROME_DOWNLOAD_MANAGER_DELEGATE_H_
7
8 #include "base/compiler_specific.h"
9 #include "base/containers/hash_tables.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "base/memory/weak_ptr.h"
12 #include "chrome/browser/download/download_path_reservation_tracker.h"
13 #include "chrome/browser/download/download_target_determiner_delegate.h"
14 #include "chrome/browser/download/download_target_info.h"
15 #include "chrome/browser/safe_browsing/download_protection_service.h"
16 #include "content/public/browser/download_danger_type.h"
17 #include "content/public/browser/download_item.h"
18 #include "content/public/browser/download_manager_delegate.h"
19 #include "content/public/browser/notification_observer.h"
20 #include "content/public/browser/notification_registrar.h"
21
22 class DownloadPrefs;
23 class Profile;
24
25 namespace content {
26 class DownloadManager;
27 }
28
29 namespace extensions {
30 class CrxInstaller;
31 }
32
33 namespace user_prefs {
34 class PrefRegistrySyncable;
35 }
36
37 #if defined(COMPILER_GCC) && defined(ENABLE_EXTENSIONS)
38 namespace BASE_HASH_NAMESPACE {
39 template<>
40 struct hash<extensions::CrxInstaller*> {
41   std::size_t operator()(extensions::CrxInstaller* const& p) const {
42     return reinterpret_cast<std::size_t>(p);
43   }
44 };
45 }  // namespace BASE_HASH_NAMESPACE
46 #endif
47
48 // This is the Chrome side helper for the download system.
49 class ChromeDownloadManagerDelegate
50     : public content::DownloadManagerDelegate,
51       public content::NotificationObserver,
52       public DownloadTargetDeterminerDelegate {
53  public:
54   explicit ChromeDownloadManagerDelegate(Profile* profile);
55   virtual ~ChromeDownloadManagerDelegate();
56
57   // Should be called before the first call to ShouldCompleteDownload() to
58   // disable SafeBrowsing checks for |item|.
59   static void DisableSafeBrowsing(content::DownloadItem* item);
60
61   void SetDownloadManager(content::DownloadManager* dm);
62
63   // Callbacks passed to GetNextId() will not be called until the returned
64   // callback is called.
65   content::DownloadIdCallback GetDownloadIdReceiverCallback();
66
67   // content::DownloadManagerDelegate
68   virtual void Shutdown() OVERRIDE;
69   virtual void GetNextId(const content::DownloadIdCallback& callback) OVERRIDE;
70   virtual bool DetermineDownloadTarget(
71       content::DownloadItem* item,
72       const content::DownloadTargetCallback& callback) OVERRIDE;
73   virtual bool ShouldOpenFileBasedOnExtension(
74       const base::FilePath& path) OVERRIDE;
75   virtual bool ShouldCompleteDownload(
76       content::DownloadItem* item,
77       const base::Closure& complete_callback) OVERRIDE;
78   virtual bool ShouldOpenDownload(
79       content::DownloadItem* item,
80       const content::DownloadOpenDelayedCallback& callback) OVERRIDE;
81   virtual bool GenerateFileHash() OVERRIDE;
82   virtual void GetSaveDir(content::BrowserContext* browser_context,
83                           base::FilePath* website_save_dir,
84                           base::FilePath* download_save_dir,
85                           bool* skip_dir_check) OVERRIDE;
86   virtual void ChooseSavePath(
87       content::WebContents* web_contents,
88       const base::FilePath& suggested_path,
89       const base::FilePath::StringType& default_extension,
90       bool can_save_as_complete,
91       const content::SavePackagePathPickedCallback& callback) OVERRIDE;
92   virtual void OpenDownload(content::DownloadItem* download) OVERRIDE;
93   virtual void ShowDownloadInShell(content::DownloadItem* download) OVERRIDE;
94   virtual void CheckForFileExistence(
95       content::DownloadItem* download,
96       const content::CheckForFileExistenceCallback& callback) OVERRIDE;
97   virtual std::string ApplicationClientIdForFileScanning() const OVERRIDE;
98
99   // Opens a download using the platform handler. DownloadItem::OpenDownload,
100   // which ends up being handled by OpenDownload(), will open a download in the
101   // browser if doing so is preferred.
102   void OpenDownloadUsingPlatformHandler(content::DownloadItem* download);
103
104   DownloadPrefs* download_prefs() { return download_prefs_.get(); }
105
106  protected:
107   // So that test classes that inherit from this for override purposes
108   // can call back into the DownloadManager.
109   content::DownloadManager* download_manager_;
110
111   virtual safe_browsing::DownloadProtectionService*
112       GetDownloadProtectionService();
113
114   // DownloadTargetDeterminerDelegate. Protected for testing.
115   virtual void NotifyExtensions(
116       content::DownloadItem* download,
117       const base::FilePath& suggested_virtual_path,
118       const NotifyExtensionsCallback& callback) OVERRIDE;
119   virtual void ReserveVirtualPath(
120       content::DownloadItem* download,
121       const base::FilePath& virtual_path,
122       bool create_directory,
123       DownloadPathReservationTracker::FilenameConflictAction conflict_action,
124       const ReservedPathCallback& callback) OVERRIDE;
125   virtual void PromptUserForDownloadPath(
126       content::DownloadItem* download,
127       const base::FilePath& suggested_virtual_path,
128       const FileSelectedCallback& callback) OVERRIDE;
129   virtual void DetermineLocalPath(
130       content::DownloadItem* download,
131       const base::FilePath& virtual_path,
132       const LocalPathCallback& callback) OVERRIDE;
133   virtual void CheckDownloadUrl(
134       content::DownloadItem* download,
135       const base::FilePath& suggested_virtual_path,
136       const CheckDownloadUrlCallback& callback) OVERRIDE;
137   virtual void GetFileMimeType(
138       const base::FilePath& path,
139       const GetFileMimeTypeCallback& callback) OVERRIDE;
140
141  private:
142   friend class base::RefCountedThreadSafe<ChromeDownloadManagerDelegate>;
143
144   typedef std::vector<content::DownloadIdCallback> IdCallbackVector;
145
146   // content::NotificationObserver implementation.
147   virtual void Observe(int type,
148                        const content::NotificationSource& source,
149                        const content::NotificationDetails& details) OVERRIDE;
150
151   // Callback function after the DownloadProtectionService completes.
152   void CheckClientDownloadDone(
153       uint32 download_id,
154       safe_browsing::DownloadProtectionService::DownloadCheckResult result);
155
156   // Internal gateways for ShouldCompleteDownload().
157   bool IsDownloadReadyForCompletion(
158       content::DownloadItem* item,
159       const base::Closure& internal_complete_callback);
160   void ShouldCompleteDownloadInternal(
161     uint32 download_id,
162     const base::Closure& user_complete_callback);
163
164   void SetNextId(uint32 id);
165
166   void ReturnNextId(const content::DownloadIdCallback& callback);
167
168   void OnDownloadTargetDetermined(
169       int32 download_id,
170       const content::DownloadTargetCallback& callback,
171       scoped_ptr<DownloadTargetInfo> target_info);
172
173   // Returns true if |path| should open in the browser.
174   bool IsOpenInBrowserPreferreredForFile(const base::FilePath& path);
175
176   Profile* profile_;
177   uint32 next_download_id_;
178   IdCallbackVector id_callbacks_;
179   scoped_ptr<DownloadPrefs> download_prefs_;
180
181 #if defined(ENABLE_EXTENSIONS)
182   // Maps from pending extension installations to DownloadItem IDs.
183   typedef base::hash_map<extensions::CrxInstaller*,
184       content::DownloadOpenDelayedCallback> CrxInstallerMap;
185   CrxInstallerMap crx_installers_;
186 #endif
187
188   content::NotificationRegistrar registrar_;
189
190   base::WeakPtrFactory<ChromeDownloadManagerDelegate> weak_ptr_factory_;
191
192   DISALLOW_COPY_AND_ASSIGN(ChromeDownloadManagerDelegate);
193 };
194
195 #endif  // CHROME_BROWSER_DOWNLOAD_CHROME_DOWNLOAD_MANAGER_DELEGATE_H_