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_DOWNLOAD_SERVICE_H_ 6 #define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SERVICE_H_ 7 8 #include "base/basictypes.h" 9 #include "base/callback_forward.h" 10 #include "base/memory/ref_counted.h" 11 #include "base/memory/scoped_ptr.h" 12 #include "components/browser_context_keyed_service/browser_context_keyed_service.h" 13 14 class ChromeDownloadManagerDelegate; 15 class DownloadHistory; 16 class DownloadUIController; 17 class ExtensionDownloadsEventRouter; 18 class Profile; 19 20 namespace content { 21 class DownloadManager; 22 } 23 24 // Owning class for ChromeDownloadManagerDelegate. 25 class DownloadService : public BrowserContextKeyedService { 26 public: 27 explicit DownloadService(Profile* profile); 28 virtual ~DownloadService(); 29 30 // Get the download manager delegate, creating it if it doesn't already exist. 31 ChromeDownloadManagerDelegate* GetDownloadManagerDelegate(); 32 33 // Get the interface to the history system. Returns NULL if profile is 34 // incognito or if the DownloadManager hasn't been created yet or if there is 35 // no HistoryService for profile. 36 DownloadHistory* GetDownloadHistory(); 37 38 #if !defined(OS_ANDROID) 39 ExtensionDownloadsEventRouter* GetExtensionEventRouter() { 40 return extension_event_router_.get(); 41 } 42 #endif 43 44 // Has a download manager been created? 45 bool HasCreatedDownloadManager(); 46 47 // Number of downloads associated with this instance of the service. 48 int DownloadCount() const; 49 50 // Number of downloads associated with all profiles. 51 static int DownloadCountAllProfiles(); 52 53 // Sets the DownloadManagerDelegate associated with this object and 54 // its DownloadManager. Takes ownership of |delegate|, and destroys 55 // the previous delegate. For testing. 56 void SetDownloadManagerDelegateForTesting( 57 ChromeDownloadManagerDelegate* delegate); 58 59 // Will be called to release references on other services as part 60 // of Profile shutdown. 61 virtual void Shutdown() OVERRIDE; 62 63 // Returns false if at least one extension has disabled the shelf, true 64 // otherwise. 65 bool IsShelfEnabled(); 66 67 private: 68 bool download_manager_created_; 69 Profile* profile_; 70 71 // ChromeDownloadManagerDelegate may be the target of callbacks from 72 // the history service/DB thread and must be kept alive for those 73 // callbacks. 74 scoped_refptr<ChromeDownloadManagerDelegate> manager_delegate_; 75 76 scoped_ptr<DownloadHistory> download_history_; 77 78 // The UI controller is responsible for observing the download manager and 79 // notifying the UI of any new downloads. Its lifetime matches that of the 80 // associated download manager. 81 scoped_ptr<DownloadUIController> download_ui_; 82 83 // On Android, GET downloads are not handled by the DownloadManager. 84 // Once we have extensions on android, we probably need the EventRouter 85 // in ContentViewDownloadDelegate which knows about both GET and POST 86 // downloads. 87 #if !defined(OS_ANDROID) 88 // The ExtensionDownloadsEventRouter dispatches download creation, change, and 89 // erase events to extensions. Like ChromeDownloadManagerDelegate, it's a 90 // chrome-level concept and its lifetime should match DownloadManager. There 91 // should be a separate EDER for on-record and off-record managers. 92 // There does not appear to be a separate ExtensionSystem for on-record and 93 // off-record profiles, so ExtensionSystem cannot own the EDER. 94 scoped_ptr<ExtensionDownloadsEventRouter> extension_event_router_; 95 #endif 96 97 DISALLOW_COPY_AND_ASSIGN(DownloadService); 98 }; 99 100 #endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SERVICE_H_ 101