download_util.h revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Download utilities.
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_UTIL_H_
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_UTIL_H_
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/file_path.h"
153f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/string16.h"
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/native_widget_types.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(TOOLKIT_VIEWS)
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/view.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace gfx {
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Canvas;
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BaseDownloadItemModel;
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DictionaryValue;
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DownloadItem;
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass DownloadManager;
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GURL;
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass Profile;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ResourceDispatcherHost;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SkBitmap;
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass URLRequestContextGetter;
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstruct DownloadCreateInfo;
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct DownloadSaveInfo;
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace download_util {
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Download temporary file creation --------------------------------------------
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Return the default download directory.
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst FilePath& GetDefaultDownloadDirectory();
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Create a temporary file for a download in the user's default download
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// directory and return true if was successful in creating the file.
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool CreateTemporaryFileForDownload(FilePath* path);
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Return true if the |download_path| is dangerous path.
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool DownloadPathIsDangerous(const FilePath& download_path);
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Create an extension based on the file name and mime type.
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid GenerateExtension(const FilePath& file_name,
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       const std::string& mime_type,
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       FilePath::StringType* generated_extension);
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Create a file name based on the response from the server.
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid GenerateFileNameFromInfo(DownloadCreateInfo* info,
603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              FilePath* generated_name);
613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Create a file name based on the response from the server.
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid GenerateFileName(const GURL& url,
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                      const std::string& content_disposition,
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                      const std::string& referrer_charset,
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                      const std::string& mime_type,
673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                      FilePath* generated_name);
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Used to make sure we have a safe file extension and filename for a
703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// download.  |file_name| can either be just the file name or it can be a
713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// full path to a file.
723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid GenerateSafeFileName(const std::string& mime_type, FilePath* file_name);
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Opens downloaded Chrome extension file (*.crx).
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid OpenChromeExtension(Profile* profile,
763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         DownloadManager* download_manager,
773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         const DownloadItem& download_item);
783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Download progress animations ------------------------------------------------
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Arc sweep angle for use with downloads of unknown size
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kUnknownAngleDegrees = 50;
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Rate of progress for use with downloads of unknown size
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kUnknownIncrementDegrees = 12;
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Start angle for downloads with known size (midnight position)
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kStartAngleDegrees = -90;
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A circle
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kMaxDegrees = 360;
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Progress animation timer period, in milliseconds.
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kProgressRateMs = 150;
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// XP and Vista must support icons of this size.
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kSmallIconSize = 16;
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kBigIconSize = 32;
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Our progress halo around the icon.
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint GetBigProgressIconSize();
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kSmallProgressIconSize = 39;
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kBigProgressIconSize = 52;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The offset required to center the icon in the progress bitmaps.
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint GetBigProgressIconOffset();
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kSmallProgressIconOffset =
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (kSmallProgressIconSize - kSmallIconSize) / 2;
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochenum PaintDownloadProgressSize {
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SMALL = 0,
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BIG
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Paint the common download animation progress foreground and background,
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// clipping the foreground to 'percent' full. If percent is -1, then we don't
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// know the total size, so we just draw a rotating segment until we're done.
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |containing_view| is the View subclass within which the progress animation
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// is drawn (generally either DownloadItemTabView or DownloadItemView). We
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// require the containing View in addition to the canvas because if we are
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// drawing in a right-to-left locale, we need to mirror the position of the
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// progress animation within the containing View.
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PaintDownloadProgress(gfx::Canvas* canvas,
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(TOOLKIT_VIEWS)
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           views::View* containing_view,
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           int origin_x,
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           int origin_y,
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           int start_angle,
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           int percent,
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           PaintDownloadProgressSize size);
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PaintDownloadComplete(gfx::Canvas* canvas,
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(TOOLKIT_VIEWS)
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           views::View* containing_view,
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           int origin_x,
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           int origin_y,
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           double animation_progress,
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           PaintDownloadProgressSize size);
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Drag support ----------------------------------------------------------------
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Helper function for download views to use when acting as a drag source for a
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// DownloadItem. If |icon| is NULL, no image will be accompany the drag. |view|
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// is only required for Mac OS X, elsewhere it can be NULL.
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DragDownload(const DownloadItem* download,
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  SkBitmap* icon,
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  gfx::NativeView view);
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Helpers ---------------------------------------------------------------------
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Creates a representation of a download in a format that the downloads
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HTML page can understand.
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochDictionaryValue* CreateDownloadItemValue(DownloadItem* download, int id);
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Get the localized status text for an in-progress download.
1613f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenstring16 GetProgressStatusText(DownloadItem* download);
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Update the application icon to indicate overall download progress.
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |download_count| is the number of downloads currently in progress. If
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |progress_known| is false, then at least one download is of indeterminate
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// size and |progress| is invalid, otherwise |progress| indicates the overall
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// download progress (float value from 0..1).
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid UpdateAppIconDownloadProgress(int download_count,
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   bool progress_known,
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   float progress);
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Appends the passed the number between parenthesis the path before the
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// extension.
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AppendNumberToPath(FilePath* path, int number);
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Attempts to find a number that can be appended to that path to make it
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// unique. If |path| does not exist, 0 is returned.  If it fails to find such
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// a number, -1 is returned.
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint GetUniquePathNumber(const FilePath& path);
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Download the URL. Must be called on the IO thread.
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DownloadUrl(const GURL& url,
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 const GURL& referrer,
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 const std::string& referrer_charset,
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 const DownloadSaveInfo& save_info,
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 ResourceDispatcherHost* rdh,
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 int render_process_host_id,
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 int render_view_id,
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 URLRequestContextGetter* request_context_getter);
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tells the resource dispatcher host to cancel a download request.
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Must be called on the IO thread.
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CancelDownloadRequest(ResourceDispatcherHost* rdh,
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           int render_process_id,
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           int request_id);
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Same as GetUniquePathNumber, except that it also checks the existence
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// of its .crdownload intermediate path.
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// If |path| does not exist, 0 is returned.  If it fails to find such
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// a number, -1 is returned.
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint GetUniquePathNumberWithCrDownload(const FilePath& path);
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Erases all downloaded files with the specified path and name prefix.
2044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Used by download UI tests to clean up the download directory.
2054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid EraseUniqueDownloadFiles(const FilePath& path_prefix);
2064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Returns a .crdownload intermediate path for the |suggested_path|.
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFilePath GetCrDownloadPath(const FilePath& suggested_path);
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Returns true if this download should show the "dangerous file" warning.
21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Various factors are considered, such as the type of the file, whether a
21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// user action initiated the download, and whether the user has explictly
21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// marked the file type as "auto open".
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool IsDangerous(DownloadCreateInfo* info, Profile* profile, bool auto_open);
215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace download_util
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_UTIL_H_
219