| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // This file contains download browser tests that are known to be runnable | 5 // This file contains download browser tests that are known to be runnable |
| 6 // in a pure content context. Over time tests should be migrated here. | 6 // in a pure content context. Over time tests should be migrated here. |
| 7 | 7 |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 #include "base/time/time.h" | 24 #include "base/time/time.h" |
| 25 #include "build/build_config.h" | 25 #include "build/build_config.h" |
| 26 #include "content/browser/byte_stream.h" | 26 #include "content/browser/byte_stream.h" |
| 27 #include "content/browser/download/download_file_factory.h" | 27 #include "content/browser/download/download_file_factory.h" |
| 28 #include "content/browser/download/download_file_impl.h" | 28 #include "content/browser/download/download_file_impl.h" |
| 29 #include "content/browser/download/download_item_impl.h" | 29 #include "content/browser/download/download_item_impl.h" |
| 30 #include "content/browser/download/download_manager_impl.h" | 30 #include "content/browser/download/download_manager_impl.h" |
| 31 #include "content/browser/download/download_resource_handler.h" | 31 #include "content/browser/download/download_resource_handler.h" |
| 32 #include "content/browser/loader/resource_dispatcher_host_impl.h" | 32 #include "content/browser/loader/resource_dispatcher_host_impl.h" |
| 33 #include "content/browser/web_contents/web_contents_impl.h" | 33 #include "content/browser/web_contents/web_contents_impl.h" |
| 34 #include "content/public/browser/download_danger_type.h" |
| 34 #include "content/public/browser/power_save_blocker.h" | 35 #include "content/public/browser/power_save_blocker.h" |
| 35 #include "content/public/browser/resource_dispatcher_host_delegate.h" | 36 #include "content/public/browser/resource_dispatcher_host_delegate.h" |
| 36 #include "content/public/browser/resource_throttle.h" | 37 #include "content/public/browser/resource_throttle.h" |
| 37 #include "content/public/common/content_features.h" | 38 #include "content/public/common/content_features.h" |
| 38 #include "content/public/common/webplugininfo.h" | 39 #include "content/public/common/webplugininfo.h" |
| 39 #include "content/public/test/browser_test_utils.h" | 40 #include "content/public/test/browser_test_utils.h" |
| 40 #include "content/public/test/content_browser_test.h" | 41 #include "content/public/test/content_browser_test.h" |
| 41 #include "content/public/test/content_browser_test_utils.h" | 42 #include "content/public/test/content_browser_test_utils.h" |
| 42 #include "content/public/test/download_test_observer.h" | 43 #include "content/public/test/download_test_observer.h" |
| 43 #include "content/public/test/test_download_request_handler.h" | 44 #include "content/public/test/test_download_request_handler.h" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 static DownloadManagerImpl* DownloadManagerForShell(Shell* shell) { | 115 static DownloadManagerImpl* DownloadManagerForShell(Shell* shell) { |
| 115 // We're in a content_browsertest; we know that the DownloadManager | 116 // We're in a content_browsertest; we know that the DownloadManager |
| 116 // is a DownloadManagerImpl. | 117 // is a DownloadManagerImpl. |
| 117 return static_cast<DownloadManagerImpl*>( | 118 return static_cast<DownloadManagerImpl*>( |
| 118 BrowserContext::GetDownloadManager( | 119 BrowserContext::GetDownloadManager( |
| 119 shell->web_contents()->GetBrowserContext())); | 120 shell->web_contents()->GetBrowserContext())); |
| 120 } | 121 } |
| 121 | 122 |
| 122 class DownloadFileWithDelay : public DownloadFileImpl { | 123 class DownloadFileWithDelay : public DownloadFileImpl { |
| 123 public: | 124 public: |
| 124 DownloadFileWithDelay(const DownloadSaveInfo& save_info, | 125 DownloadFileWithDelay(scoped_ptr<DownloadSaveInfo> save_info, |
| 125 const base::FilePath& default_download_directory, | 126 const base::FilePath& default_download_directory, |
| 126 const GURL& url, | |
| 127 const GURL& referrer_url, | |
| 128 bool calculate_hash, | |
| 129 base::File file, | |
| 130 scoped_ptr<ByteStreamReader> stream, | 127 scoped_ptr<ByteStreamReader> stream, |
| 131 const net::BoundNetLog& bound_net_log, | 128 const net::BoundNetLog& bound_net_log, |
| 132 scoped_ptr<PowerSaveBlocker> power_save_blocker, | 129 scoped_ptr<PowerSaveBlocker> power_save_blocker, |
| 133 base::WeakPtr<DownloadDestinationObserver> observer, | 130 base::WeakPtr<DownloadDestinationObserver> observer, |
| 134 base::WeakPtr<DownloadFileWithDelayFactory> owner); | 131 base::WeakPtr<DownloadFileWithDelayFactory> owner); |
| 135 | 132 |
| 136 ~DownloadFileWithDelay() override; | 133 ~DownloadFileWithDelay() override; |
| 137 | 134 |
| 138 // Wraps DownloadFileImpl::Rename* and intercepts the return callback, | 135 // Wraps DownloadFileImpl::Rename* and intercepts the return callback, |
| 139 // storing it in the factory that produced this object for later | 136 // storing it in the factory that produced this object for later |
| 140 // retrieval. | 137 // retrieval. |
| 141 void RenameAndUniquify(const base::FilePath& full_path, | 138 void RenameAndUniquify(const base::FilePath& full_path, |
| 142 const RenameCompletionCallback& callback) override; | 139 const RenameCompletionCallback& callback) override; |
| 143 void RenameAndAnnotate(const base::FilePath& full_path, | 140 void RenameAndAnnotate(const base::FilePath& full_path, |
| 141 const std::string& client_guid, |
| 142 const GURL& source_url, |
| 143 const GURL& referrer_url, |
| 144 const RenameCompletionCallback& callback) override; | 144 const RenameCompletionCallback& callback) override; |
| 145 | 145 |
| 146 private: | 146 private: |
| 147 static void RenameCallbackWrapper( | 147 static void RenameCallbackWrapper( |
| 148 const base::WeakPtr<DownloadFileWithDelayFactory>& factory, | 148 const base::WeakPtr<DownloadFileWithDelayFactory>& factory, |
| 149 const RenameCompletionCallback& original_callback, | 149 const RenameCompletionCallback& original_callback, |
| 150 DownloadInterruptReason reason, | 150 DownloadInterruptReason reason, |
| 151 const base::FilePath& path); | 151 const base::FilePath& path); |
| 152 | 152 |
| 153 // This variable may only be read on the FILE thread, and may only be | 153 // This variable may only be read on the FILE thread, and may only be |
| 154 // indirected through (e.g. methods on DownloadFileWithDelayFactory called) | 154 // indirected through (e.g. methods on DownloadFileWithDelayFactory called) |
| 155 // on the UI thread. This is because after construction, | 155 // on the UI thread. This is because after construction, |
| 156 // DownloadFileWithDelay lives on the file thread, but | 156 // DownloadFileWithDelay lives on the file thread, but |
| 157 // DownloadFileWithDelayFactory is purely a UI thread object. | 157 // DownloadFileWithDelayFactory is purely a UI thread object. |
| 158 base::WeakPtr<DownloadFileWithDelayFactory> owner_; | 158 base::WeakPtr<DownloadFileWithDelayFactory> owner_; |
| 159 | 159 |
| 160 DISALLOW_COPY_AND_ASSIGN(DownloadFileWithDelay); | 160 DISALLOW_COPY_AND_ASSIGN(DownloadFileWithDelay); |
| 161 }; | 161 }; |
| 162 | 162 |
| 163 // All routines on this class must be called on the UI thread. | 163 // All routines on this class must be called on the UI thread. |
| 164 class DownloadFileWithDelayFactory : public DownloadFileFactory { | 164 class DownloadFileWithDelayFactory : public DownloadFileFactory { |
| 165 public: | 165 public: |
| 166 DownloadFileWithDelayFactory(); | 166 DownloadFileWithDelayFactory(); |
| 167 ~DownloadFileWithDelayFactory() override; | 167 ~DownloadFileWithDelayFactory() override; |
| 168 | 168 |
| 169 // DownloadFileFactory interface. | 169 // DownloadFileFactory interface. |
| 170 DownloadFile* CreateFile( | 170 DownloadFile* CreateFile( |
| 171 const DownloadSaveInfo& save_info, | 171 scoped_ptr<DownloadSaveInfo> save_info, |
| 172 const base::FilePath& default_download_directory, | 172 const base::FilePath& default_download_directory, |
| 173 const GURL& url, | |
| 174 const GURL& referrer_url, | |
| 175 bool calculate_hash, | |
| 176 base::File file, | |
| 177 scoped_ptr<ByteStreamReader> stream, | 173 scoped_ptr<ByteStreamReader> stream, |
| 178 const net::BoundNetLog& bound_net_log, | 174 const net::BoundNetLog& bound_net_log, |
| 179 base::WeakPtr<DownloadDestinationObserver> observer) override; | 175 base::WeakPtr<DownloadDestinationObserver> observer) override; |
| 180 | 176 |
| 181 void AddRenameCallback(base::Closure callback); | 177 void AddRenameCallback(base::Closure callback); |
| 182 void GetAllRenameCallbacks(std::vector<base::Closure>* results); | 178 void GetAllRenameCallbacks(std::vector<base::Closure>* results); |
| 183 | 179 |
| 184 // Do not return until GetAllRenameCallbacks() will return a non-empty list. | 180 // Do not return until GetAllRenameCallbacks() will return a non-empty list. |
| 185 void WaitForSomeCallback(); | 181 void WaitForSomeCallback(); |
| 186 | 182 |
| 187 private: | 183 private: |
| 188 std::vector<base::Closure> rename_callbacks_; | 184 std::vector<base::Closure> rename_callbacks_; |
| 189 bool waiting_; | 185 bool waiting_; |
| 190 base::WeakPtrFactory<DownloadFileWithDelayFactory> weak_ptr_factory_; | 186 base::WeakPtrFactory<DownloadFileWithDelayFactory> weak_ptr_factory_; |
| 191 | 187 |
| 192 DISALLOW_COPY_AND_ASSIGN(DownloadFileWithDelayFactory); | 188 DISALLOW_COPY_AND_ASSIGN(DownloadFileWithDelayFactory); |
| 193 }; | 189 }; |
| 194 | 190 |
| 195 DownloadFileWithDelay::DownloadFileWithDelay( | 191 DownloadFileWithDelay::DownloadFileWithDelay( |
| 196 const DownloadSaveInfo& save_info, | 192 scoped_ptr<DownloadSaveInfo> save_info, |
| 197 const base::FilePath& default_download_directory, | 193 const base::FilePath& default_download_directory, |
| 198 const GURL& url, | |
| 199 const GURL& referrer_url, | |
| 200 bool calculate_hash, | |
| 201 base::File file, | |
| 202 scoped_ptr<ByteStreamReader> stream, | 194 scoped_ptr<ByteStreamReader> stream, |
| 203 const net::BoundNetLog& bound_net_log, | 195 const net::BoundNetLog& bound_net_log, |
| 204 scoped_ptr<PowerSaveBlocker> power_save_blocker, | 196 scoped_ptr<PowerSaveBlocker> power_save_blocker, |
| 205 base::WeakPtr<DownloadDestinationObserver> observer, | 197 base::WeakPtr<DownloadDestinationObserver> observer, |
| 206 base::WeakPtr<DownloadFileWithDelayFactory> owner) | 198 base::WeakPtr<DownloadFileWithDelayFactory> owner) |
| 207 : DownloadFileImpl(save_info, | 199 : DownloadFileImpl(std::move(save_info), |
| 208 default_download_directory, | 200 default_download_directory, |
| 209 url, | |
| 210 referrer_url, | |
| 211 calculate_hash, | |
| 212 std::move(file), | |
| 213 std::move(stream), | 201 std::move(stream), |
| 214 bound_net_log, | 202 bound_net_log, |
| 215 observer), | 203 observer), |
| 216 owner_(owner) {} | 204 owner_(owner) {} |
| 217 | 205 |
| 218 DownloadFileWithDelay::~DownloadFileWithDelay() {} | 206 DownloadFileWithDelay::~DownloadFileWithDelay() {} |
| 219 | 207 |
| 220 void DownloadFileWithDelay::RenameAndUniquify( | 208 void DownloadFileWithDelay::RenameAndUniquify( |
| 221 const base::FilePath& full_path, | 209 const base::FilePath& full_path, |
| 222 const RenameCompletionCallback& callback) { | 210 const RenameCompletionCallback& callback) { |
| 223 DCHECK_CURRENTLY_ON(BrowserThread::FILE); | 211 DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
| 224 DownloadFileImpl::RenameAndUniquify( | 212 DownloadFileImpl::RenameAndUniquify( |
| 225 full_path, base::Bind(DownloadFileWithDelay::RenameCallbackWrapper, | 213 full_path, base::Bind(DownloadFileWithDelay::RenameCallbackWrapper, |
| 226 owner_, callback)); | 214 owner_, callback)); |
| 227 } | 215 } |
| 228 | 216 |
| 229 void DownloadFileWithDelay::RenameAndAnnotate( | 217 void DownloadFileWithDelay::RenameAndAnnotate( |
| 230 const base::FilePath& full_path, const RenameCompletionCallback& callback) { | 218 const base::FilePath& full_path, |
| 219 const std::string& client_guid, |
| 220 const GURL& source_url, |
| 221 const GURL& referrer_url, |
| 222 const RenameCompletionCallback& callback) { |
| 231 DCHECK_CURRENTLY_ON(BrowserThread::FILE); | 223 DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
| 232 DownloadFileImpl::RenameAndAnnotate( | 224 DownloadFileImpl::RenameAndAnnotate( |
| 233 full_path, base::Bind(DownloadFileWithDelay::RenameCallbackWrapper, | 225 full_path, |
| 234 owner_, callback)); | 226 client_guid, |
| 227 source_url, |
| 228 referrer_url, |
| 229 base::Bind( |
| 230 DownloadFileWithDelay::RenameCallbackWrapper, owner_, callback)); |
| 235 } | 231 } |
| 236 | 232 |
| 237 // static | 233 // static |
| 238 void DownloadFileWithDelay::RenameCallbackWrapper( | 234 void DownloadFileWithDelay::RenameCallbackWrapper( |
| 239 const base::WeakPtr<DownloadFileWithDelayFactory>& factory, | 235 const base::WeakPtr<DownloadFileWithDelayFactory>& factory, |
| 240 const RenameCompletionCallback& original_callback, | 236 const RenameCompletionCallback& original_callback, |
| 241 DownloadInterruptReason reason, | 237 DownloadInterruptReason reason, |
| 242 const base::FilePath& path) { | 238 const base::FilePath& path) { |
| 243 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 239 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 244 if (!factory) | 240 if (!factory) |
| 245 return; | 241 return; |
| 246 factory->AddRenameCallback(base::Bind(original_callback, reason, path)); | 242 factory->AddRenameCallback(base::Bind(original_callback, reason, path)); |
| 247 } | 243 } |
| 248 | 244 |
| 249 DownloadFileWithDelayFactory::DownloadFileWithDelayFactory() | 245 DownloadFileWithDelayFactory::DownloadFileWithDelayFactory() |
| 250 : waiting_(false), | 246 : waiting_(false), |
| 251 weak_ptr_factory_(this) {} | 247 weak_ptr_factory_(this) {} |
| 252 | 248 |
| 253 DownloadFileWithDelayFactory::~DownloadFileWithDelayFactory() {} | 249 DownloadFileWithDelayFactory::~DownloadFileWithDelayFactory() {} |
| 254 | 250 |
| 255 DownloadFile* DownloadFileWithDelayFactory::CreateFile( | 251 DownloadFile* DownloadFileWithDelayFactory::CreateFile( |
| 256 const DownloadSaveInfo& save_info, | 252 scoped_ptr<DownloadSaveInfo> save_info, |
| 257 const base::FilePath& default_download_directory, | 253 const base::FilePath& default_download_directory, |
| 258 const GURL& url, | |
| 259 const GURL& referrer_url, | |
| 260 bool calculate_hash, | |
| 261 base::File file, | |
| 262 scoped_ptr<ByteStreamReader> stream, | 254 scoped_ptr<ByteStreamReader> stream, |
| 263 const net::BoundNetLog& bound_net_log, | 255 const net::BoundNetLog& bound_net_log, |
| 264 base::WeakPtr<DownloadDestinationObserver> observer) { | 256 base::WeakPtr<DownloadDestinationObserver> observer) { |
| 265 scoped_ptr<PowerSaveBlocker> psb(PowerSaveBlocker::Create( | 257 scoped_ptr<PowerSaveBlocker> psb(PowerSaveBlocker::Create( |
| 266 PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, | 258 PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, |
| 267 PowerSaveBlocker::kReasonOther, "Download in progress")); | 259 PowerSaveBlocker::kReasonOther, "Download in progress")); |
| 268 return new DownloadFileWithDelay( | 260 return new DownloadFileWithDelay(std::move(save_info), |
| 269 save_info, default_download_directory, url, referrer_url, calculate_hash, | 261 default_download_directory, |
| 270 std::move(file), std::move(stream), bound_net_log, std::move(psb), | 262 std::move(stream), |
| 271 observer, weak_ptr_factory_.GetWeakPtr()); | 263 bound_net_log, |
| 264 std::move(psb), |
| 265 observer, |
| 266 weak_ptr_factory_.GetWeakPtr()); |
| 272 } | 267 } |
| 273 | 268 |
| 274 void DownloadFileWithDelayFactory::AddRenameCallback(base::Closure callback) { | 269 void DownloadFileWithDelayFactory::AddRenameCallback(base::Closure callback) { |
| 275 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 270 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 276 rename_callbacks_.push_back(callback); | 271 rename_callbacks_.push_back(callback); |
| 277 if (waiting_) | 272 if (waiting_) |
| 278 base::MessageLoopForUI::current()->QuitWhenIdle(); | 273 base::MessageLoopForUI::current()->QuitWhenIdle(); |
| 279 } | 274 } |
| 280 | 275 |
| 281 void DownloadFileWithDelayFactory::GetAllRenameCallbacks( | 276 void DownloadFileWithDelayFactory::GetAllRenameCallbacks( |
| 282 std::vector<base::Closure>* results) { | 277 std::vector<base::Closure>* results) { |
| 283 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 278 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 284 results->swap(rename_callbacks_); | 279 results->swap(rename_callbacks_); |
| 285 } | 280 } |
| 286 | 281 |
| 287 void DownloadFileWithDelayFactory::WaitForSomeCallback() { | 282 void DownloadFileWithDelayFactory::WaitForSomeCallback() { |
| 288 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 283 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 289 | 284 |
| 290 if (rename_callbacks_.empty()) { | 285 if (rename_callbacks_.empty()) { |
| 291 waiting_ = true; | 286 waiting_ = true; |
| 292 RunMessageLoop(); | 287 RunMessageLoop(); |
| 293 waiting_ = false; | 288 waiting_ = false; |
| 294 } | 289 } |
| 295 } | 290 } |
| 296 | 291 |
| 297 class CountingDownloadFile : public DownloadFileImpl { | 292 class CountingDownloadFile : public DownloadFileImpl { |
| 298 public: | 293 public: |
| 299 CountingDownloadFile(const DownloadSaveInfo& save_info, | 294 CountingDownloadFile(scoped_ptr<DownloadSaveInfo> save_info, |
| 300 const base::FilePath& default_downloads_directory, | 295 const base::FilePath& default_downloads_directory, |
| 301 const GURL& url, | |
| 302 const GURL& referrer_url, | |
| 303 bool calculate_hash, | |
| 304 base::File file, | |
| 305 scoped_ptr<ByteStreamReader> stream, | 296 scoped_ptr<ByteStreamReader> stream, |
| 306 const net::BoundNetLog& bound_net_log, | 297 const net::BoundNetLog& bound_net_log, |
| 307 scoped_ptr<PowerSaveBlocker> power_save_blocker, | 298 scoped_ptr<PowerSaveBlocker> power_save_blocker, |
| 308 base::WeakPtr<DownloadDestinationObserver> observer) | 299 base::WeakPtr<DownloadDestinationObserver> observer) |
| 309 : DownloadFileImpl(save_info, | 300 : DownloadFileImpl(std::move(save_info), |
| 310 default_downloads_directory, | 301 default_downloads_directory, |
| 311 url, | |
| 312 referrer_url, | |
| 313 calculate_hash, | |
| 314 std::move(file), | |
| 315 std::move(stream), | 302 std::move(stream), |
| 316 bound_net_log, | 303 bound_net_log, |
| 317 observer) {} | 304 observer) {} |
| 318 | 305 |
| 319 ~CountingDownloadFile() override { | 306 ~CountingDownloadFile() override { |
| 320 DCHECK_CURRENTLY_ON(BrowserThread::FILE); | 307 DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
| 321 active_files_--; | 308 active_files_--; |
| 322 } | 309 } |
| 323 | 310 |
| 324 void Initialize(const InitializeCallback& callback) override { | 311 void Initialize(const InitializeCallback& callback) override { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 351 | 338 |
| 352 int CountingDownloadFile::active_files_ = 0; | 339 int CountingDownloadFile::active_files_ = 0; |
| 353 | 340 |
| 354 class CountingDownloadFileFactory : public DownloadFileFactory { | 341 class CountingDownloadFileFactory : public DownloadFileFactory { |
| 355 public: | 342 public: |
| 356 CountingDownloadFileFactory() {} | 343 CountingDownloadFileFactory() {} |
| 357 ~CountingDownloadFileFactory() override {} | 344 ~CountingDownloadFileFactory() override {} |
| 358 | 345 |
| 359 // DownloadFileFactory interface. | 346 // DownloadFileFactory interface. |
| 360 DownloadFile* CreateFile( | 347 DownloadFile* CreateFile( |
| 361 const DownloadSaveInfo& save_info, | 348 scoped_ptr<DownloadSaveInfo> save_info, |
| 362 const base::FilePath& default_downloads_directory, | 349 const base::FilePath& default_downloads_directory, |
| 363 const GURL& url, | |
| 364 const GURL& referrer_url, | |
| 365 bool calculate_hash, | |
| 366 base::File file, | |
| 367 scoped_ptr<ByteStreamReader> stream, | 350 scoped_ptr<ByteStreamReader> stream, |
| 368 const net::BoundNetLog& bound_net_log, | 351 const net::BoundNetLog& bound_net_log, |
| 369 base::WeakPtr<DownloadDestinationObserver> observer) override { | 352 base::WeakPtr<DownloadDestinationObserver> observer) override { |
| 370 scoped_ptr<PowerSaveBlocker> psb(PowerSaveBlocker::Create( | 353 scoped_ptr<PowerSaveBlocker> psb(PowerSaveBlocker::Create( |
| 371 PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, | 354 PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, |
| 372 PowerSaveBlocker::kReasonOther, "Download in progress")); | 355 PowerSaveBlocker::kReasonOther, "Download in progress")); |
| 373 return new CountingDownloadFile(save_info, default_downloads_directory, url, | 356 return new CountingDownloadFile(std::move(save_info), |
| 374 referrer_url, calculate_hash, | 357 default_downloads_directory, |
| 375 std::move(file), std::move(stream), | 358 std::move(stream), |
| 376 bound_net_log, std::move(psb), observer); | 359 bound_net_log, |
| 360 std::move(psb), |
| 361 observer); |
| 377 } | 362 } |
| 378 }; | 363 }; |
| 379 | 364 |
| 380 class TestShellDownloadManagerDelegate : public ShellDownloadManagerDelegate { | 365 class TestShellDownloadManagerDelegate : public ShellDownloadManagerDelegate { |
| 381 public: | 366 public: |
| 382 TestShellDownloadManagerDelegate() | 367 TestShellDownloadManagerDelegate() |
| 383 : delay_download_open_(false) {} | 368 : delay_download_open_(false) {} |
| 384 ~TestShellDownloadManagerDelegate() override {} | 369 ~TestShellDownloadManagerDelegate() override {} |
| 385 | 370 |
| 386 bool ShouldOpenDownload( | 371 bool ShouldOpenDownload( |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 585 BrowserThread::IO, FROM_HERE, | 570 BrowserThread::IO, FROM_HERE, |
| 586 base::Bind( | 571 base::Bind( |
| 587 &net::URLRequestMockHTTPJob::AddUrlHandlers, mock_base, | 572 &net::URLRequestMockHTTPJob::AddUrlHandlers, mock_base, |
| 588 make_scoped_refptr(content::BrowserThread::GetBlockingPool()))); | 573 make_scoped_refptr(content::BrowserThread::GetBlockingPool()))); |
| 589 } | 574 } |
| 590 | 575 |
| 591 TestShellDownloadManagerDelegate* GetDownloadManagerDelegate() { | 576 TestShellDownloadManagerDelegate* GetDownloadManagerDelegate() { |
| 592 return test_delegate_.get(); | 577 return test_delegate_.get(); |
| 593 } | 578 } |
| 594 | 579 |
| 580 const base::FilePath& GetDownloadDirectory() const { |
| 581 return downloads_directory_.path(); |
| 582 } |
| 583 |
| 595 // Create a DownloadTestObserverTerminal that will wait for the | 584 // Create a DownloadTestObserverTerminal that will wait for the |
| 596 // specified number of downloads to finish. | 585 // specified number of downloads to finish. |
| 597 DownloadTestObserver* CreateWaiter( | 586 DownloadTestObserver* CreateWaiter( |
| 598 Shell* shell, int num_downloads) { | 587 Shell* shell, int num_downloads) { |
| 599 DownloadManager* download_manager = DownloadManagerForShell(shell); | 588 DownloadManager* download_manager = DownloadManagerForShell(shell); |
| 600 return new DownloadTestObserverTerminal(download_manager, num_downloads, | 589 return new DownloadTestObserverTerminal(download_manager, num_downloads, |
| 601 DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL); | 590 DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL); |
| 602 } | 591 } |
| 603 | 592 |
| 604 void WaitForInterrupt(DownloadItem* download) { | 593 void WaitForInterrupt(DownloadItem* download) { |
| (...skipping 1200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1805 download->Cancel(true); | 1794 download->Cancel(true); |
| 1806 | 1795 |
| 1807 // The intermediate file should now be gone. | 1796 // The intermediate file should now be gone. |
| 1808 RunAllPendingInMessageLoop(BrowserThread::FILE); | 1797 RunAllPendingInMessageLoop(BrowserThread::FILE); |
| 1809 RunAllPendingInMessageLoop(); | 1798 RunAllPendingInMessageLoop(); |
| 1810 EXPECT_FALSE(base::PathExists(intermediate_path)); | 1799 EXPECT_FALSE(base::PathExists(intermediate_path)); |
| 1811 EXPECT_FALSE(base::PathExists(target_path)); | 1800 EXPECT_FALSE(base::PathExists(target_path)); |
| 1812 EXPECT_TRUE(EnsureNoPendingDownloads()); | 1801 EXPECT_TRUE(EnsureNoPendingDownloads()); |
| 1813 } | 1802 } |
| 1814 | 1803 |
| 1804 IN_PROC_BROWSER_TEST_F(DownloadContentTest, ResumeRestoredDownload_NoFile) { |
| 1805 TestDownloadRequestHandler request_handler; |
| 1806 TestDownloadRequestHandler::Parameters parameters; |
| 1807 request_handler.StartServing(parameters); |
| 1808 |
| 1809 base::FilePath intermediate_file_path = |
| 1810 GetDownloadDirectory().AppendASCII("intermediate"); |
| 1811 std::vector<GURL> url_chain; |
| 1812 |
| 1813 const int kIntermediateSize = 1331; |
| 1814 url_chain.push_back(request_handler.url()); |
| 1815 |
| 1816 DownloadItem* download = DownloadManagerForShell(shell())->CreateDownloadItem( |
| 1817 "F7FB1F59-7DE1-4845-AFDB-8A688F70F583", |
| 1818 1, |
| 1819 intermediate_file_path, |
| 1820 base::FilePath(), |
| 1821 url_chain, |
| 1822 GURL(), |
| 1823 "application/octet-stream", |
| 1824 "application/octet-stream", |
| 1825 base::Time::Now(), |
| 1826 base::Time(), |
| 1827 parameters.etag, |
| 1828 std::string(), |
| 1829 kIntermediateSize, |
| 1830 parameters.size, |
| 1831 std::string(), |
| 1832 DownloadItem::INTERRUPTED, |
| 1833 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 1834 DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, |
| 1835 false); |
| 1836 |
| 1837 download->Resume(); |
| 1838 WaitForCompletion(download); |
| 1839 |
| 1840 EXPECT_FALSE(base::PathExists(intermediate_file_path)); |
| 1841 ReadAndVerifyFileContents(parameters.pattern_generator_seed, |
| 1842 parameters.size, |
| 1843 download->GetTargetFilePath()); |
| 1844 |
| 1845 TestDownloadRequestHandler::CompletedRequests completed_requests; |
| 1846 request_handler.GetCompletedRequestInfo(&completed_requests); |
| 1847 |
| 1848 // There will be two requests. The first one is issued optimistically assuming |
| 1849 // that the intermediate file exists and matches the size expectations set |
| 1850 // forth in the download metadata (i.e. assuming that a 1331 byte file exists |
| 1851 // at |intermediate_file_path|. |
| 1852 // |
| 1853 // However, once the response is received, DownloadFile will report that the |
| 1854 // intermediate file doesn't exist and hence the download is marked |
| 1855 // interrupted again. |
| 1856 // |
| 1857 // The second request reads the entire entity. |
| 1858 // |
| 1859 // N.b. we can't make any assumptions about how many bytes are transferred by |
| 1860 // the first request since response data will be bufferred until DownloadFile |
| 1861 // is done initializing. |
| 1862 // |
| 1863 // TODO(asanka): Ideally we'll check that the intermediate file matches |
| 1864 // expectations prior to issuing the first resumption request. |
| 1865 ASSERT_EQ(2u, completed_requests.size()); |
| 1866 EXPECT_EQ(parameters.size, completed_requests[1].transferred_byte_count); |
| 1867 } |
| 1868 |
| 1869 IN_PROC_BROWSER_TEST_F(DownloadContentTest, ResumeRestoredDownload_NoHash) { |
| 1870 TestDownloadRequestHandler request_handler; |
| 1871 TestDownloadRequestHandler::Parameters parameters; |
| 1872 request_handler.StartServing(parameters); |
| 1873 |
| 1874 base::FilePath intermediate_file_path = |
| 1875 GetDownloadDirectory().AppendASCII("intermediate"); |
| 1876 std::vector<GURL> url_chain; |
| 1877 |
| 1878 const int kIntermediateSize = 1331; |
| 1879 std::vector<char> buffer(kIntermediateSize); |
| 1880 request_handler.GetPatternBytes( |
| 1881 parameters.pattern_generator_seed, 0, buffer.size(), buffer.data()); |
| 1882 ASSERT_EQ( |
| 1883 kIntermediateSize, |
| 1884 base::WriteFile(intermediate_file_path, buffer.data(), buffer.size())); |
| 1885 |
| 1886 url_chain.push_back(request_handler.url()); |
| 1887 |
| 1888 DownloadItem* download = DownloadManagerForShell(shell())->CreateDownloadItem( |
| 1889 "F7FB1F59-7DE1-4845-AFDB-8A688F70F583", |
| 1890 1, |
| 1891 intermediate_file_path, |
| 1892 base::FilePath(), |
| 1893 url_chain, |
| 1894 GURL(), |
| 1895 "application/octet-stream", |
| 1896 "application/octet-stream", |
| 1897 base::Time::Now(), |
| 1898 base::Time(), |
| 1899 parameters.etag, |
| 1900 std::string(), |
| 1901 kIntermediateSize, |
| 1902 parameters.size, |
| 1903 std::string(), |
| 1904 DownloadItem::INTERRUPTED, |
| 1905 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 1906 DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, |
| 1907 false); |
| 1908 |
| 1909 download->Resume(); |
| 1910 WaitForCompletion(download); |
| 1911 |
| 1912 EXPECT_FALSE(base::PathExists(intermediate_file_path)); |
| 1913 ReadAndVerifyFileContents(parameters.pattern_generator_seed, |
| 1914 parameters.size, |
| 1915 download->GetTargetFilePath()); |
| 1916 |
| 1917 TestDownloadRequestHandler::CompletedRequests completed_requests; |
| 1918 request_handler.GetCompletedRequestInfo(&completed_requests); |
| 1919 |
| 1920 // There's only one network request issued, and that is for the remainder of |
| 1921 // the file. |
| 1922 ASSERT_EQ(1u, completed_requests.size()); |
| 1923 EXPECT_EQ(parameters.size - kIntermediateSize, |
| 1924 completed_requests[0].transferred_byte_count); |
| 1925 } |
| 1926 |
| 1927 IN_PROC_BROWSER_TEST_F(DownloadContentTest, |
| 1928 ResumeRestoredDownload_EtagMismatch) { |
| 1929 TestDownloadRequestHandler request_handler; |
| 1930 TestDownloadRequestHandler::Parameters parameters; |
| 1931 request_handler.StartServing(parameters); |
| 1932 |
| 1933 base::FilePath intermediate_file_path = |
| 1934 GetDownloadDirectory().AppendASCII("intermediate"); |
| 1935 std::vector<GURL> url_chain; |
| 1936 |
| 1937 const int kIntermediateSize = 1331; |
| 1938 std::vector<char> buffer(kIntermediateSize); |
| 1939 request_handler.GetPatternBytes( |
| 1940 parameters.pattern_generator_seed + 1, 0, buffer.size(), buffer.data()); |
| 1941 ASSERT_EQ( |
| 1942 kIntermediateSize, |
| 1943 base::WriteFile(intermediate_file_path, buffer.data(), buffer.size())); |
| 1944 |
| 1945 url_chain.push_back(request_handler.url()); |
| 1946 |
| 1947 DownloadItem* download = DownloadManagerForShell(shell())->CreateDownloadItem( |
| 1948 "F7FB1F59-7DE1-4845-AFDB-8A688F70F583", |
| 1949 1, |
| 1950 intermediate_file_path, |
| 1951 base::FilePath(), |
| 1952 url_chain, |
| 1953 GURL(), |
| 1954 "application/octet-stream", |
| 1955 "application/octet-stream", |
| 1956 base::Time::Now(), |
| 1957 base::Time(), |
| 1958 "fake-etag", |
| 1959 std::string(), |
| 1960 kIntermediateSize, |
| 1961 parameters.size, |
| 1962 std::string(), |
| 1963 DownloadItem::INTERRUPTED, |
| 1964 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 1965 DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, |
| 1966 false); |
| 1967 |
| 1968 download->Resume(); |
| 1969 WaitForCompletion(download); |
| 1970 |
| 1971 EXPECT_FALSE(base::PathExists(intermediate_file_path)); |
| 1972 ReadAndVerifyFileContents(parameters.pattern_generator_seed, |
| 1973 parameters.size, |
| 1974 download->GetTargetFilePath()); |
| 1975 |
| 1976 TestDownloadRequestHandler::CompletedRequests completed_requests; |
| 1977 request_handler.GetCompletedRequestInfo(&completed_requests); |
| 1978 |
| 1979 // There's only one network request issued. The If-Range header allows the |
| 1980 // server to respond with the entire entity in one go. The existing contents |
| 1981 // of the file should be discarded, and overwritten by the new contents. |
| 1982 ASSERT_EQ(1u, completed_requests.size()); |
| 1983 EXPECT_EQ(parameters.size, completed_requests[0].transferred_byte_count); |
| 1984 } |
| 1985 |
| 1986 IN_PROC_BROWSER_TEST_F(DownloadContentTest, |
| 1987 ResumeRestoredDownload_CorrectHash) { |
| 1988 TestDownloadRequestHandler request_handler; |
| 1989 TestDownloadRequestHandler::Parameters parameters; |
| 1990 request_handler.StartServing(parameters); |
| 1991 |
| 1992 base::FilePath intermediate_file_path = |
| 1993 GetDownloadDirectory().AppendASCII("intermediate"); |
| 1994 std::vector<GURL> url_chain; |
| 1995 |
| 1996 const int kIntermediateSize = 1331; |
| 1997 std::vector<char> buffer(kIntermediateSize); |
| 1998 request_handler.GetPatternBytes( |
| 1999 parameters.pattern_generator_seed, 0, buffer.size(), buffer.data()); |
| 2000 ASSERT_EQ( |
| 2001 kIntermediateSize, |
| 2002 base::WriteFile(intermediate_file_path, buffer.data(), buffer.size())); |
| 2003 // SHA-256 hash of the pattern bytes in buffer. |
| 2004 static const uint8_t kPartialHash[] = { |
| 2005 0x77, 0x14, 0xfd, 0x83, 0x06, 0x15, 0x10, 0x7a, 0x47, 0x15, 0xd3, |
| 2006 0xcf, 0xdd, 0x46, 0xa2, 0x61, 0x96, 0xff, 0xc3, 0xbb, 0x49, 0x30, |
| 2007 0xaf, 0x31, 0x3a, 0x64, 0x0b, 0xd5, 0xfa, 0xb1, 0xe3, 0x81}; |
| 2008 |
| 2009 url_chain.push_back(request_handler.url()); |
| 2010 |
| 2011 DownloadItem* download = DownloadManagerForShell(shell())->CreateDownloadItem( |
| 2012 "F7FB1F59-7DE1-4845-AFDB-8A688F70F583", |
| 2013 1, |
| 2014 intermediate_file_path, |
| 2015 base::FilePath(), |
| 2016 url_chain, |
| 2017 GURL(), |
| 2018 "application/octet-stream", |
| 2019 "application/octet-stream", |
| 2020 base::Time::Now(), |
| 2021 base::Time(), |
| 2022 parameters.etag, |
| 2023 std::string(), |
| 2024 kIntermediateSize, |
| 2025 parameters.size, |
| 2026 std::string(std::begin(kPartialHash), std::end(kPartialHash)), |
| 2027 DownloadItem::INTERRUPTED, |
| 2028 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 2029 DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, |
| 2030 false); |
| 2031 |
| 2032 download->Resume(); |
| 2033 WaitForCompletion(download); |
| 2034 |
| 2035 EXPECT_FALSE(base::PathExists(intermediate_file_path)); |
| 2036 ReadAndVerifyFileContents(parameters.pattern_generator_seed, |
| 2037 parameters.size, |
| 2038 download->GetTargetFilePath()); |
| 2039 |
| 2040 TestDownloadRequestHandler::CompletedRequests completed_requests; |
| 2041 request_handler.GetCompletedRequestInfo(&completed_requests); |
| 2042 |
| 2043 // There's only one network request issued, and that is for the remainder of |
| 2044 // the file. |
| 2045 ASSERT_EQ(1u, completed_requests.size()); |
| 2046 EXPECT_EQ(parameters.size - kIntermediateSize, |
| 2047 completed_requests[0].transferred_byte_count); |
| 2048 |
| 2049 // SHA-256 hash of the entire 102400 bytes in the target file. |
| 2050 static const uint8_t kFullHash[] = { |
| 2051 0xa7, 0x44, 0x49, 0x86, 0x24, 0xc6, 0x84, 0x6c, 0x89, 0xdf, 0xd8, |
| 2052 0xec, 0xa0, 0xe0, 0x61, 0x12, 0xdc, 0x80, 0x13, 0xf2, 0x83, 0x49, |
| 2053 0xa9, 0x14, 0x52, 0x32, 0xf0, 0x95, 0x20, 0xca, 0x5b, 0x30}; |
| 2054 EXPECT_EQ(std::string(std::begin(kFullHash), std::end(kFullHash)), |
| 2055 download->GetHash()); |
| 2056 } |
| 2057 |
| 2058 IN_PROC_BROWSER_TEST_F(DownloadContentTest, ResumeRestoredDownload_WrongHash) { |
| 2059 TestDownloadRequestHandler request_handler; |
| 2060 TestDownloadRequestHandler::Parameters parameters; |
| 2061 request_handler.StartServing(parameters); |
| 2062 |
| 2063 base::FilePath intermediate_file_path = |
| 2064 GetDownloadDirectory().AppendASCII("intermediate"); |
| 2065 std::vector<GURL> url_chain; |
| 2066 |
| 2067 const int kIntermediateSize = 1331; |
| 2068 std::vector<char> buffer(kIntermediateSize); |
| 2069 ASSERT_EQ( |
| 2070 kIntermediateSize, |
| 2071 base::WriteFile(intermediate_file_path, buffer.data(), buffer.size())); |
| 2072 // SHA-256 hash of the expected pattern bytes in buffer. This doesn't match |
| 2073 // the current contents of the intermediate file which should all be 0. |
| 2074 static const uint8_t kPartialHash[] = { |
| 2075 0x77, 0x14, 0xfd, 0x83, 0x06, 0x15, 0x10, 0x7a, 0x47, 0x15, 0xd3, |
| 2076 0xcf, 0xdd, 0x46, 0xa2, 0x61, 0x96, 0xff, 0xc3, 0xbb, 0x49, 0x30, |
| 2077 0xaf, 0x31, 0x3a, 0x64, 0x0b, 0xd5, 0xfa, 0xb1, 0xe3, 0x81}; |
| 2078 |
| 2079 url_chain.push_back(request_handler.url()); |
| 2080 |
| 2081 DownloadItem* download = DownloadManagerForShell(shell())->CreateDownloadItem( |
| 2082 "F7FB1F59-7DE1-4845-AFDB-8A688F70F583", |
| 2083 1, |
| 2084 intermediate_file_path, |
| 2085 base::FilePath(), |
| 2086 url_chain, |
| 2087 GURL(), |
| 2088 "application/octet-stream", |
| 2089 "application/octet-stream", |
| 2090 base::Time::Now(), |
| 2091 base::Time(), |
| 2092 parameters.etag, |
| 2093 std::string(), |
| 2094 kIntermediateSize, |
| 2095 parameters.size, |
| 2096 std::string(std::begin(kPartialHash), std::end(kPartialHash)), |
| 2097 DownloadItem::INTERRUPTED, |
| 2098 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 2099 DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, |
| 2100 false); |
| 2101 |
| 2102 download->Resume(); |
| 2103 WaitForCompletion(download); |
| 2104 |
| 2105 EXPECT_FALSE(base::PathExists(intermediate_file_path)); |
| 2106 ReadAndVerifyFileContents(parameters.pattern_generator_seed, |
| 2107 parameters.size, |
| 2108 download->GetTargetFilePath()); |
| 2109 |
| 2110 TestDownloadRequestHandler::CompletedRequests completed_requests; |
| 2111 request_handler.GetCompletedRequestInfo(&completed_requests); |
| 2112 |
| 2113 // There will be two requests. The first one is issued optimistically assuming |
| 2114 // that the intermediate file exists and matches the size expectations set |
| 2115 // forth in the download metadata (i.e. assuming that a 1331 byte file exists |
| 2116 // at |intermediate_file_path|. |
| 2117 // |
| 2118 // However, once the response is received, DownloadFile will report that the |
| 2119 // intermediate file doesn't match the expected hash. |
| 2120 // |
| 2121 // The second request reads the entire entity. |
| 2122 // |
| 2123 // N.b. we can't make any assumptions about how many bytes are transferred by |
| 2124 // the first request since response data will be bufferred until DownloadFile |
| 2125 // is done initializing. |
| 2126 // |
| 2127 // TODO(asanka): Ideally we'll check that the intermediate file matches |
| 2128 // expectations prior to issuing the first resumption request. |
| 2129 ASSERT_EQ(2u, completed_requests.size()); |
| 2130 EXPECT_EQ(parameters.size, completed_requests[1].transferred_byte_count); |
| 2131 |
| 2132 // SHA-256 hash of the entire 102400 bytes in the target file. |
| 2133 static const uint8_t kFullHash[] = { |
| 2134 0xa7, 0x44, 0x49, 0x86, 0x24, 0xc6, 0x84, 0x6c, 0x89, 0xdf, 0xd8, |
| 2135 0xec, 0xa0, 0xe0, 0x61, 0x12, 0xdc, 0x80, 0x13, 0xf2, 0x83, 0x49, |
| 2136 0xa9, 0x14, 0x52, 0x32, 0xf0, 0x95, 0x20, 0xca, 0x5b, 0x30}; |
| 2137 EXPECT_EQ(std::string(std::begin(kFullHash), std::end(kFullHash)), |
| 2138 download->GetHash()); |
| 2139 } |
| 2140 |
| 2141 IN_PROC_BROWSER_TEST_F(DownloadContentTest, ResumeRestoredDownload_ShortFile) { |
| 2142 TestDownloadRequestHandler request_handler; |
| 2143 TestDownloadRequestHandler::Parameters parameters; |
| 2144 request_handler.StartServing(parameters); |
| 2145 |
| 2146 base::FilePath intermediate_file_path = |
| 2147 GetDownloadDirectory().AppendASCII("intermediate"); |
| 2148 std::vector<GURL> url_chain; |
| 2149 |
| 2150 const int kIntermediateSize = 1331; |
| 2151 // Size of file is slightly shorter than the size known to DownloadItem. |
| 2152 std::vector<char> buffer(kIntermediateSize - 100); |
| 2153 request_handler.GetPatternBytes( |
| 2154 parameters.pattern_generator_seed, 0, buffer.size(), buffer.data()); |
| 2155 ASSERT_EQ( |
| 2156 kIntermediateSize - 100, |
| 2157 base::WriteFile(intermediate_file_path, buffer.data(), buffer.size())); |
| 2158 url_chain.push_back(request_handler.url()); |
| 2159 |
| 2160 DownloadItem* download = DownloadManagerForShell(shell())->CreateDownloadItem( |
| 2161 "F7FB1F59-7DE1-4845-AFDB-8A688F70F583", |
| 2162 1, |
| 2163 intermediate_file_path, |
| 2164 base::FilePath(), |
| 2165 url_chain, |
| 2166 GURL(), |
| 2167 "application/octet-stream", |
| 2168 "application/octet-stream", |
| 2169 base::Time::Now(), |
| 2170 base::Time(), |
| 2171 parameters.etag, |
| 2172 std::string(), |
| 2173 kIntermediateSize, |
| 2174 parameters.size, |
| 2175 std::string(), |
| 2176 DownloadItem::INTERRUPTED, |
| 2177 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 2178 DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, |
| 2179 false); |
| 2180 |
| 2181 download->Resume(); |
| 2182 WaitForCompletion(download); |
| 2183 |
| 2184 EXPECT_FALSE(base::PathExists(intermediate_file_path)); |
| 2185 ReadAndVerifyFileContents(parameters.pattern_generator_seed, |
| 2186 parameters.size, |
| 2187 download->GetTargetFilePath()); |
| 2188 |
| 2189 TestDownloadRequestHandler::CompletedRequests completed_requests; |
| 2190 request_handler.GetCompletedRequestInfo(&completed_requests); |
| 2191 |
| 2192 // There will be two requests. The first one is issued optimistically assuming |
| 2193 // that the intermediate file exists and matches the size expectations set |
| 2194 // forth in the download metadata (i.e. assuming that a 1331 byte file exists |
| 2195 // at |intermediate_file_path|. |
| 2196 // |
| 2197 // However, once the response is received, DownloadFile will report that the |
| 2198 // intermediate file is too short and hence the download is marked interrupted |
| 2199 // again. |
| 2200 // |
| 2201 // The second request reads the entire entity. |
| 2202 // |
| 2203 // N.b. we can't make any assumptions about how many bytes are transferred by |
| 2204 // the first request since response data will be bufferred until DownloadFile |
| 2205 // is done initializing. |
| 2206 // |
| 2207 // TODO(asanka): Ideally we'll check that the intermediate file matches |
| 2208 // expectations prior to issuing the first resumption request. |
| 2209 ASSERT_EQ(2u, completed_requests.size()); |
| 2210 EXPECT_EQ(parameters.size, completed_requests[1].transferred_byte_count); |
| 2211 } |
| 2212 |
| 1815 // Check that the cookie policy is correctly updated when downloading a file | 2213 // Check that the cookie policy is correctly updated when downloading a file |
| 1816 // that redirects cross origin. | 2214 // that redirects cross origin. |
| 1817 IN_PROC_BROWSER_TEST_F(DownloadContentTest, CookiePolicy) { | 2215 IN_PROC_BROWSER_TEST_F(DownloadContentTest, CookiePolicy) { |
| 1818 net::EmbeddedTestServer origin_one; | 2216 net::EmbeddedTestServer origin_one; |
| 1819 net::EmbeddedTestServer origin_two; | 2217 net::EmbeddedTestServer origin_two; |
| 1820 ASSERT_TRUE(origin_one.Start()); | 2218 ASSERT_TRUE(origin_one.Start()); |
| 1821 ASSERT_TRUE(origin_two.Start()); | 2219 ASSERT_TRUE(origin_two.Start()); |
| 1822 | 2220 |
| 1823 // Block third-party cookies. | 2221 // Block third-party cookies. |
| 1824 ShellNetworkDelegate::SetAcceptAllCookies(false); | 2222 ShellNetworkDelegate::SetAcceptAllCookies(false); |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2044 | 2442 |
| 2045 std::vector<DownloadItem*> downloads; | 2443 std::vector<DownloadItem*> downloads; |
| 2046 DownloadManagerForShell(shell())->GetAllDownloads(&downloads); | 2444 DownloadManagerForShell(shell())->GetAllDownloads(&downloads); |
| 2047 ASSERT_EQ(1u, downloads.size()); | 2445 ASSERT_EQ(1u, downloads.size()); |
| 2048 | 2446 |
| 2049 EXPECT_EQ(FILE_PATH_LITERAL("Jumboshrimp.txt"), | 2447 EXPECT_EQ(FILE_PATH_LITERAL("Jumboshrimp.txt"), |
| 2050 downloads[0]->GetTargetFilePath().BaseName().value()); | 2448 downloads[0]->GetTargetFilePath().BaseName().value()); |
| 2051 } | 2449 } |
| 2052 | 2450 |
| 2053 } // namespace content | 2451 } // namespace content |
| OLD | NEW |