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)#ifndef CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_MANAGER_IMPL_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_MANAGER_IMPL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sequenced_task_runner_helpers.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_item_impl_delegate.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h"
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/browser/download_manager_delegate.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/download_url_parameters.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BoundNetLog;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadFileFactory;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadItemFactory;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadItemImpl;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DownloadRequestHandleInterface;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT DownloadManagerImpl : public DownloadManager,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           private DownloadItemImplDelegate {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  typedef base::Callback<void(DownloadItemImpl*)> DownloadItemImplCreated;
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Caller guarantees that |net_log| will remain valid
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for the lifetime of DownloadManagerImpl (until Shutdown() is called).
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DownloadManagerImpl(net::NetLog* net_log, BrowserContext* browser_context);
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~DownloadManagerImpl();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Implementation functions (not part of the DownloadManager interface).
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a download item for the SavePackage system.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Must be called on the UI thread.  Note that the DownloadManager
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // retains ownership.
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void CreateSavePackageDownloadItem(
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& main_file_path,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& page_url,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& mime_type,
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<DownloadRequestHandleInterface> request_handle,
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const DownloadItemImplCreated& item_created);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notifies DownloadManager about a successful completion of |download_item|.
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnSavePackageSuccessfullyFinished(DownloadItem* download_item);
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DownloadManager functions.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetDelegate(DownloadManagerDelegate* delegate) OVERRIDE;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual DownloadManagerDelegate* GetDelegate() const OVERRIDE;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Shutdown() OVERRIDE;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetAllDownloads(DownloadVector* result) OVERRIDE;
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void StartDownload(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<DownloadCreateInfo> info,
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      scoped_ptr<ByteStreamReader> stream,
677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const DownloadUrlParameters::OnStartedCallback& on_started) OVERRIDE;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int RemoveDownloadsBetween(base::Time remove_begin,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     base::Time remove_end) OVERRIDE;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int RemoveDownloads(base::Time remove_begin) OVERRIDE;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int RemoveAllDownloads() OVERRIDE;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DownloadUrl(scoped_ptr<DownloadUrlParameters> params) OVERRIDE;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddObserver(Observer* observer) OVERRIDE;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RemoveObserver(Observer* observer) OVERRIDE;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual content::DownloadItem* CreateDownloadItem(
767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      uint32 id,
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& current_path,
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& target_path,
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::vector<GURL>& url_chain,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& referrer_url,
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Time& start_time,
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Time& end_time,
83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const std::string& etag,
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const std::string& last_modified,
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int64 received_bytes,
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int64 total_bytes,
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::DownloadItem::DownloadState state,
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadDangerType danger_type,
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadInterruptReason interrupt_reason,
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool opened) OVERRIDE;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int InProgressCount() const OVERRIDE;
928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual int NonMaliciousInProgressCount() const OVERRIDE;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual BrowserContext* GetBrowserContext() const OVERRIDE;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CheckForHistoryFilesRemoval() OVERRIDE;
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual DownloadItem* GetDownload(uint32 id) OVERRIDE;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For testing; specifically, accessed from TestFileErrorInjector.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetDownloadItemFactoryForTesting(
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<DownloadItemFactory> item_factory);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetDownloadFileFactoryForTesting(
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<DownloadFileFactory> file_factory);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual DownloadFileFactory* GetDownloadFileFactoryForTesting();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::set<DownloadItem*> DownloadSet;
1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  typedef base::hash_map<uint32, DownloadItemImpl*> DownloadMap;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<DownloadItemImpl*> DownloadItemImplVector;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For testing.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class DownloadManagerTest;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class DownloadTest;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void StartDownloadWithId(
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      scoped_ptr<DownloadCreateInfo> info,
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      scoped_ptr<ByteStreamReader> stream,
1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const DownloadUrlParameters::OnStartedCallback& on_started,
1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      bool new_download,
1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      uint32 id);
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void CreateSavePackageDownloadItemWithId(
1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const base::FilePath& main_file_path,
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const GURL& page_url,
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const std::string& mime_type,
1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      scoped_ptr<DownloadRequestHandleInterface> request_handle,
1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const DownloadItemImplCreated& on_started,
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      uint32 id);
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Create a new active item based on the info.  Separate from
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // StartDownload() for testing.
1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DownloadItemImpl* CreateActiveItem(uint32 id,
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                     const DownloadCreateInfo& info);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Get next download id. |callback| is called on the UI thread and may
1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // be called synchronously.
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void GetNextId(const DownloadIdCallback& callback);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called with the result of DownloadManagerDelegate::CheckForFileExistence.
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Updates the state of the file and then notifies this update to the file's
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // observer.
1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void OnFileExistenceChecked(uint32 download_id, bool result);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from DownloadItemImplDelegate
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (Note that |GetBrowserContext| are present in both interfaces.)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DetermineDownloadTarget(
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItemImpl* item, const DownloadTargetCallback& callback) OVERRIDE;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool ShouldCompleteDownload(
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItemImpl* item, const base::Closure& complete_callback) OVERRIDE;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool ShouldOpenFileBasedOnExtension(
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path) OVERRIDE;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ShouldOpenDownload(
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItemImpl* item,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ShouldOpenDownloadCallback& callback) OVERRIDE;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CheckForFileRemoval(DownloadItemImpl* download_item) OVERRIDE;
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ResumeInterruptedDownload(
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<content::DownloadUrlParameters> params,
1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      uint32 id) OVERRIDE;
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OpenDownload(DownloadItemImpl* download) OVERRIDE;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ShowDownloadInShell(DownloadItemImpl* download) OVERRIDE;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DownloadRemoved(DownloadItemImpl* download) OVERRIDE;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Factory for creation of downloads items.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DownloadItemFactory> item_factory_;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Factory for the creation of download files.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DownloadFileFactory> file_factory_;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |downloads_| is the owning set for all downloads known to the
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DownloadManager.  This includes downloads started by the user in
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this session, downloads initialized from the history system, and
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // "save page as" downloads.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadMap downloads_;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int history_size_;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if the download manager has been initialized and requires a shutdown.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool shutdown_needed_;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Observers that want to be notified of changes to the set of downloads.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObserverList<Observer> observers_;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The current active browser context.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserContext* browser_context_;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allows an embedder to control behavior. Guaranteed to outlive this object.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManagerDelegate* delegate_;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::NetLog* net_log_;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::WeakPtrFactory<DownloadManagerImpl> weak_factory_;
19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadManagerImpl);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_MANAGER_IMPL_H_
197