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