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)#include <sstream> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/command_line.h" 10e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/files/file.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h" 20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/string_util.h" 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/sys_info.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_file_util.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/chrome_download_manager_delegate.h" 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/download/download_browsertest.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_crx_util.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_history.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/download/download_item_model.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_prefs.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_request_limiter.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/download/download_service.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/download/download_service_factory.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_shelf.h" 3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/download/download_target_determiner.h" 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/download/download_test_file_activity_observer.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_install_prompt.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/download_row.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/url_request_mock_util.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.h" 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_list.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/chrome_pages.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/host_desktop.h" 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/common/safe_browsing/csd.pb.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/test/base/test_switches.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/infobars/core/confirm_infobar_delegate.h" 680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/infobars/core/infobar.h" 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/download_interrupt_reasons.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_save_info.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_url_parameters.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/render_frame_host.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_context.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/common/content_switches.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/context_menu_params.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/download_test_observer.h" 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_file_error_injector.h" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_navigation_observer.h" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/test/net/url_request_slow_download_job.h" 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h" 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h" 88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/base/filename_util.h" 89b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h" 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/test/url_request/url_request_mock_http_job.h" 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/page_transition_types.h" 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(FULL_SAFE_BROWSING) 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/safe_browsing/download_feedback_service.h" 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/safe_browsing/download_protection_service.h" 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/safe_browsing/safe_browsing_database.h" 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/safe_browsing/safe_browsing_service.h" 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 101ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserContext; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadItem; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadManager; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadUrlParameters; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::URLRequestSlowDownloadJob; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::FeatureSwitch; 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing net::URLRequestMockHTTPJob; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CreatedObserver : public content::DownloadManager::Observer { 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit CreatedObserver(content::DownloadManager* manager) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : manager_(manager), 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_(false) { 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager->AddObserver(this); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~CreatedObserver() { 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (manager_) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager_->RemoveObserver(this); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Wait() { 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<DownloadItem*> downloads; 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager_->GetAllDownloads(&downloads); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!downloads.empty()) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_ = true; 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RunMessageLoop(); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_ = false; 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnDownloadCreated(content::DownloadManager* manager, 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::DownloadItem* item) OVERRIDE { 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(manager_, manager); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (waiting_) 14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DownloadManager* manager_; 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool waiting_; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CreatedObserver); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PercentWaiter : public content::DownloadItem::Observer { 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit PercentWaiter(DownloadItem* item) 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : item_(item), 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_(false), 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error_(false), 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prev_percent_(0) { 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item_->AddObserver(this); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~PercentWaiter() { 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (item_) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item_->RemoveObserver(this); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool WaitForFinished() { 16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (item_->GetState() == DownloadItem::COMPLETE) { 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return item_->PercentComplete() == 100; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_ = true; 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RunMessageLoop(); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_ = false; 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !error_; 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnDownloadUpdated(content::DownloadItem* item) OVERRIDE { 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(item_, item); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!error_ && 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ((prev_percent_ > item_->PercentComplete()) || 18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) (item_->GetState() == DownloadItem::COMPLETE && 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (item_->PercentComplete() != 100)))) { 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error_ = true; 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (waiting_) 18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (item_->GetState() == DownloadItem::COMPLETE && waiting_) 18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnDownloadDestroyed(content::DownloadItem* item) OVERRIDE { 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(item_, item); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item_->RemoveObserver(this); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item_ = NULL; 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DownloadItem* item_; 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool waiting_; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool error_; 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int prev_percent_; 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PercentWaiter); 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// DownloadTestObserver subclass that observes one download until it transitions 2057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// from a non-resumable state to a resumable state a specified number of 2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// times. Note that this observer can only observe a single download. 2077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass DownloadTestObserverResumable : public content::DownloadTestObserver { 2087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Construct a new observer. |transition_count| is the number of times the 2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // download should transition from a non-resumable state to a resumable state. 2117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DownloadTestObserverResumable(DownloadManager* download_manager, 2127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t transition_count) 2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : DownloadTestObserver(download_manager, 1, 2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ON_DANGEROUS_DOWNLOAD_FAIL), 2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch was_previously_resumable_(false), 2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch transitions_left_(transition_count) { 2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Init(); 2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual ~DownloadTestObserverResumable() {} 2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual bool IsDownloadInFinalState(DownloadItem* download) OVERRIDE { 2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool is_resumable_now = download->CanResume(); 2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!was_previously_resumable_ && is_resumable_now) 2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch --transitions_left_; 2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch was_previously_resumable_ = is_resumable_now; 2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return transitions_left_ == 0; 2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool was_previously_resumable_; 2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t transitions_left_; 2327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DISALLOW_COPY_AND_ASSIGN(DownloadTestObserverResumable); 2347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IDs and paths of CRX files used in tests. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kGoodCrxId[] = "ldnnhddmnhbkjipkidpdiheffobcpfmf"; 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath kGoodCrxPath(FILE_PATH_LITERAL("extensions/good.crx")); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLargeThemeCrxId[] = "pjpgmfcmabopnnfonnhmdjglfpjjfkbf"; 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath kLargeThemePath( 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FILE_PATH_LITERAL("extensions/theme2.crx")); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get History Information. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadsHistoryDataCollector { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit DownloadsHistoryDataCollector(Profile* profile) 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : profile_(profile), result_valid_(false) {} 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool WaitForDownloadInfo( 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<std::vector<history::DownloadRow> >* results) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryService* hs = HistoryServiceFactory::GetForProfile( 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_, Profile::EXPLICIT_ACCESS); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(hs); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hs->QueryDownloads( 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DownloadsHistoryDataCollector::OnQueryDownloadsComplete, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (result_valid_) { 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *results = results_.Pass(); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result_valid_; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnQueryDownloadsComplete( 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<std::vector<history::DownloadRow> > entries) { 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_valid_ = true; 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) results_ = entries.Pass(); 27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile_; 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<std::vector<history::DownloadRow> > results_; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result_valid_; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DownloadsHistoryDataCollector); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mock that simulates a permissions dialog where the user denies 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// permission to install. TODO(skerner): This could be shared with 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extensions tests. Find a common place for this class. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockAbortExtensionInstallPrompt : public ExtensionInstallPrompt { 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockAbortExtensionInstallPrompt() : 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionInstallPrompt(NULL) { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a user abort on an extension installation. 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ConfirmInstall( 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Delegate* delegate, 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* extension, 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ShowDialogCallback& show_dialog_callback) OVERRIDE { 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->InstallUIAbort(true); 29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnInstallSuccess(const Extension* extension, 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmap* icon) OVERRIDE { 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnInstallFailure( 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::CrxInstallerError& error) OVERRIDE { 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mock that simulates a permissions dialog where the user allows 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// installation. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockAutoConfirmExtensionInstallPrompt : public ExtensionInstallPrompt { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit MockAutoConfirmExtensionInstallPrompt( 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* web_contents) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ExtensionInstallPrompt(web_contents) {} 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Proceed without confirmation prompt. 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ConfirmInstall( 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Delegate* delegate, 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* extension, 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ShowDialogCallback& show_dialog_callback) OVERRIDE { 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->InstallUIProceed(); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnInstallSuccess(const Extension* extension, 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmap* icon) OVERRIDE { 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnInstallFailure( 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::CrxInstallerError& error) OVERRIDE { 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static DownloadManager* DownloadManagerForBrowser(Browser* browser) { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BrowserContext::GetDownloadManager(browser->profile()); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WasAutoOpened(DownloadItem* item) { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return item->GetAutoOpened(); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Called when a download starts. Marks the download as hidden. 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SetHiddenDownloadCallback(DownloadItem* item, 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::DownloadInterruptReason reason) { 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItemModel(item).SetShouldShowInShelf(false); 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Callback for HistoryObserver; used in DownloadHistoryCheck 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool HasDataAndName(const history::DownloadRow& row) { 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return row.received_bytes > 0 && !row.target_path.empty(); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DownloadTestObserverNotInProgress::DownloadTestObserverNotInProgress( 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DownloadManager* download_manager, 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t count) 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : DownloadTestObserver(download_manager, count, ON_DANGEROUS_DOWNLOAD_FAIL), 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) started_observing_(false) { 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Init(); 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DownloadTestObserverNotInProgress::~DownloadTestObserverNotInProgress() {} 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DownloadTestObserverNotInProgress::StartObserving() { 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) started_observing_ = true; 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DownloadTestObserverNotInProgress::IsDownloadInFinalState( 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DownloadItem* download) { 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return started_observing_ && 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) download->GetState() != DownloadItem::IN_PROGRESS; 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class HistoryObserver : public DownloadHistory::Observer { 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::Callback<bool(const history::DownloadRow&)> FilterCallback; 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit HistoryObserver(Profile* profile) 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : profile_(profile), 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_(false), 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) seen_stored_(false) { 380a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DownloadServiceFactory::GetForBrowserContext(profile_)-> 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDownloadHistory()->AddObserver(this); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~HistoryObserver() { 385a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DownloadService* service = DownloadServiceFactory::GetForBrowserContext( 386a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) profile_); 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (service && service->GetDownloadHistory()) 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) service->GetDownloadHistory()->RemoveObserver(this); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetFilterCallback(const FilterCallback& callback) { 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback_ = callback; 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnDownloadStored( 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DownloadItem* item, 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const history::DownloadRow& info) OVERRIDE { 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!callback_.is_null() && (!callback_.Run(info))) 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) seen_stored_ = true; 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (waiting_) 40390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnDownloadHistoryDestroyed() OVERRIDE { 407a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DownloadServiceFactory::GetForBrowserContext(profile_)-> 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDownloadHistory()->RemoveObserver(this); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void WaitForStored() { 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (seen_stored_) 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_ = true; 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RunMessageLoop(); 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_ = false; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile_; 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool waiting_; 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool seen_stored_; 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FilterCallback callback_; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(HistoryObserver); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadTest : public InProcessBrowserTest { 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Choice of navigation or direct fetch. Used by |DownloadFileCheckErrors()|. 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum DownloadMethod { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_NAVIGATE, 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_DIRECT 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Information passed in to |DownloadFileCheckErrors()|. 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct DownloadInfo { 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* url_name; // URL for the download. 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadMethod download_method; // Navigation or Direct. 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download interrupt reason (NONE is OK). 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadInterruptReason reason; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool show_download_item; // True if the download item appears on the shelf. 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_redirect_to_documents; // True if we save it in "My Documents". 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct FileErrorInjectInfo { 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadInfo download_info; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestFileErrorInjector::FileErrorInfo error_info; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadTest() {} 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true)); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(InitialSetup()); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void TearDownOnMainThread() OVERRIDE { 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Needs to be torn down on the main thread. file_activity_observer_ holds a 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reference to the ChromeDownloadManagerDelegate which should be destroyed 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on the UI thread. 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_activity_observer_.reset(); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 467ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 468ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch command_line->AppendSwitch(switches::kDisablePluginsDiscovery); 469ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 470ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returning false indicates a failure of the setup, and should be asserted 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the caller. 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool InitialSetup() { 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool have_test_dir = PathService::Get(chrome::DIR_TEST_DATA, &test_dir_); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(have_test_dir); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!have_test_dir) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sanity check default values for window / tab count and shelf visibility. 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int window_count = chrome::GetTotalBrowserCount(); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, window_count); 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up the temporary download folder. 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool created_downloads_dir = CreateAndSetDownloadsDirectory(browser()); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(created_downloads_dir); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!created_downloads_dir) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->profile()->GetPrefs()->SetBoolean( 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kPromptForDownload, false); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager* manager = DownloadManagerForBrowser(browser()); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadPrefs::FromDownloadManager(manager)->ResetAutoOpen(); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->RemoveAllDownloads(); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_activity_observer_.reset( 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DownloadTestFileActivityObserver(browser()->profile())); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum SizeTestType { 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SIZE_TEST_TYPE_KNOWN, 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SIZE_TEST_TYPE_UNKNOWN, 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath GetDownloadsDirectory() { 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return downloads_directory_.path(); 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Location of the file source (the place from which it is downloaded). 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath OriginFile(base::FilePath file) { 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return test_dir_.Append(file); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Location of the file destination (place to which it is downloaded). 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath DestinationFile(Browser* browser, base::FilePath file) { 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetDownloadDirectory(browser).Append(file.BaseName()); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be called after browser creation. Creates a temporary 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // directory for downloads that is auto-deleted on destruction. 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returning false indicates a failure of the function, and should be asserted 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the caller. 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool CreateAndSetDownloadsDirectory(Browser* browser) { 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!browser) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!downloads_directory_.CreateUniqueTempDir()) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser->profile()->GetPrefs()->SetFilePath( 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kDownloadDefaultDirectory, 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloads_directory_.path()); 537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) browser->profile()->GetPrefs()->SetFilePath( 538868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) prefs::kSaveFileDefaultDirectory, 539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) downloads_directory_.path()); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadPrefs* GetDownloadPrefs(Browser* browser) { 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DownloadPrefs::FromDownloadManager( 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManagerForBrowser(browser)); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath GetDownloadDirectory(Browser* browser) { 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetDownloadPrefs(browser)->DownloadPath(); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a DownloadTestObserverTerminal that will wait for the 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified number of downloads to finish. 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver* CreateWaiter( 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser, int num_downloads) { 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager* download_manager = DownloadManagerForBrowser(browser); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new content::DownloadTestObserverTerminal( 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_manager, num_downloads, 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a DownloadTestObserverInProgress that will wait for the 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified number of downloads to start. 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver* CreateInProgressWaiter( 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser, int num_downloads) { 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager* download_manager = DownloadManagerForBrowser(browser); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new content::DownloadTestObserverInProgress( 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_manager, num_downloads); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a DownloadTestObserverTerminal that will wait for the 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified number of downloads to finish, or for 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a dangerous download warning to be shown. 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver* DangerousDownloadWaiter( 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser, 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_downloads, 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver::DangerousDownloadAction 5791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dangerous_download_action) { 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager* download_manager = DownloadManagerForBrowser(browser); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new content::DownloadTestObserverTerminal( 5821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci download_manager, num_downloads, dangerous_download_action); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckDownloadStatesForBrowser(Browser* browser, 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t num, 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::DownloadState state) { 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<DownloadItem*> download_items; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDownloads(browser, &download_items); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(num, download_items.size()); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < download_items.size(); ++i) { 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(state, download_items[i]->GetState()) << " Item " << i; 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckDownloadStates(size_t num, DownloadItem::DownloadState state) { 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownloadStatesForBrowser(browser(), num, state); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download |url|, then wait for the download to finish. 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |disposition| indicates where the navigation occurs (current tab, new 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // foreground tab, etc). 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |browser_test_flags| indicate what to wait for, and is an OR of 0 or more 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // values in the ui_test_utils::BrowserTestWaitFlags enum. 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DownloadAndWaitWithDisposition(Browser* browser, 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int browser_test_flags) { 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup notification, navigate, and block. 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateWaiter(browser, 1)); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This call will block until the condition specified by 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |browser_test_flags|, but will not wait for the download to finish. 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition(browser, 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disposition, 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_test_flags); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits for the download to complete. 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't expect a file chooser to be shown. 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(DidShowFileChooser()); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download a file in the current tab, then wait for the download to finish. 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DownloadAndWait(Browser* browser, 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url) { 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadAndWaitWithDisposition( 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser, 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CURRENT_TAB, 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should only be called when the download is known to have finished 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (in error or not). 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returning false indicates a failure of the function, and should be asserted 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the caller. 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool CheckDownload(Browser* browser, 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& downloaded_filename, 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& origin_filename) { 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the path to which the data will be downloaded. 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath downloaded_file( 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DestinationFile(browser, downloaded_filename)); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the origin path (from which the data comes). 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath origin_file(OriginFile(origin_filename)); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CheckDownloadFullPaths(browser, downloaded_file, origin_file); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A version of CheckDownload that allows complete path specification. 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool CheckDownloadFullPaths(Browser* browser, 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& downloaded_file, 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& origin_file) { 6577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool origin_file_exists = base::PathExists(origin_file); 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(origin_file_exists) << origin_file.value(); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!origin_file_exists) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Confirm the downloaded data file exists. 6637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool downloaded_file_exists = base::PathExists(downloaded_file); 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(downloaded_file_exists) << downloaded_file.value(); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!downloaded_file_exists) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 origin_file_size = 0; 669a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(base::GetFileSize(origin_file, &origin_file_size)); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string original_file_contents; 67158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(base::ReadFileToString(origin_file, &original_file_contents)); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VerifyFile(downloaded_file, original_file_contents, origin_file_size)); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the downloaded copy of the file. 676a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool downloaded_file_deleted = base::DieFileDie(downloaded_file, false); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(downloaded_file_deleted); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return downloaded_file_deleted; 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DownloadTestObserver* CreateInProgressDownloadObserver( 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t download_count) { 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadManager* manager = DownloadManagerForBrowser(browser()); 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new content::DownloadTestObserverInProgress( 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager, download_count); 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* CreateSlowTestDownload() { 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateInProgressDownloadObserver(1)); 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL slow_download_url(URLRequestSlowDownloadJob::kUnknownSizeUrl); 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadManager* manager = DownloadManagerForBrowser(browser()); 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(0, manager->NonMaliciousInProgressCount()); 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, manager->InProgressCount()); 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (manager->InProgressCount() != 0) 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser(), slow_download_url, CURRENT_TAB, 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer->WaitForFinished(); 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS)); 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadManager::DownloadVector items; 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager->GetAllDownloads(&items); 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* new_item = NULL; 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (DownloadManager::DownloadVector::iterator iter = items.begin(); 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != items.end(); ++iter) { 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((*iter)->GetState() == DownloadItem::IN_PROGRESS) { 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // There should be only one IN_PROGRESS item. 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(NULL, new_item); 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_item = *iter; 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new_item; 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool RunSizeTest(Browser* browser, 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SizeTestType type, 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& partial_indication, 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& total_indication) { 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(type == SIZE_TEST_TYPE_UNKNOWN || type == SIZE_TEST_TYPE_KNOWN); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type != SIZE_TEST_TYPE_KNOWN && type != SIZE_TEST_TYPE_UNKNOWN) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(type == SIZE_TEST_TYPE_KNOWN ? 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestSlowDownloadJob::kKnownSizeUrl : 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestSlowDownloadJob::kUnknownSizeUrl); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(ahendrickson) -- |expected_title_in_progress| and 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |expected_title_finished| need to be checked. 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath filename; 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::FileURLToFilePath(url, &filename); 736a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 expected_title_in_progress( 7375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16(partial_indication) + filename.LossyDisplayName()); 738a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 expected_title_finished( 7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16(total_indication) + filename.LossyDisplayName()); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download a partial web page in a background tab and wait. 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The mock system will not complete until it gets a special URL. 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateWaiter(browser, 1)); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser, url); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(ahendrickson): check download status text before downloading. 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Need to: 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - Add a member function to the |DownloadShelf| interface class, that 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // indicates how many members it has. 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - Add a member function to |DownloadShelf| to get the status text 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of a given member (for example, via the name in |DownloadItemView|'s 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetAccessibleState() member function), by index. 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - Iterate over browser->window()->GetDownloadShelf()'s members 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to see if any match the status text we want. Start with the last one. 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow the request to finish. We do this by loading a second URL in a 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // separate tab. 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL finish_url(URLRequestSlowDownloadJob::kFinishDownloadUrl); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser, 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) finish_url, 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NEW_FOREGROUND_TAB, 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownloadStatesForBrowser(browser, 1, DownloadItem::COMPLETE); 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, browser->tab_strip_model()->count()); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(ahendrickson): check download status text after downloading. 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath basefilename(filename.BaseName()); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::FileURLToFilePath(url, &filename); 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath download_path = 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downloads_directory_.path().Append(basefilename); 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(browser->window()->IsDownloadShelfVisible()); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool downloaded_path_exists = base::PathExists(download_path); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(downloaded_path_exists); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!downloaded_path_exists) 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the file contents. 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t file_size = URLRequestSlowDownloadJob::kFirstDownloadSize + 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestSlowDownloadJob::kSecondDownloadSize; 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string expected_contents(file_size, '*'); 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(VerifyFile(download_path, expected_contents, file_size)); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the file we just downloaded. 791a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(base::DieFileDie(download_path, true)); 7927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(download_path)); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetDownloads(Browser* browser, std::vector<DownloadItem*>* downloads) { 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(downloads); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager* manager = DownloadManagerForBrowser(browser); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->GetAllDownloads(downloads); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ExpectWindowCountAfterDownload(size_t expected) { 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected, chrome::GetTotalBrowserCount()); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void EnableFileChooser(bool enable) { 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_activity_observer_->EnableFileChooser(enable); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool DidShowFileChooser() { 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return file_activity_observer_->TestAndResetDidShowFileChooser(); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checks that |path| is has |file_size| bytes, and matches the |value| 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // string. 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool VerifyFile(const base::FilePath& path, 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& value, 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int64 file_size) { 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string file_contents; 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool read = base::ReadFileToString(path, &file_contents); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(read) << "Failed reading file: " << path.value() << std::endl; 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!read) 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Couldn't read the file. 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: we don't handle really large files (more than size_t can hold) 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so we will fail in that case. 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t expected_size = static_cast<size_t>(file_size); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the size. 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_size, file_contents.size()); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_size != file_contents.size()) 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the contents. 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(value, file_contents); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (memcmp(file_contents.c_str(), value.c_str(), expected_size) != 0) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Attempts to download a file, based on information in |download_info|. 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a Select File dialog opens, will automatically choose the default. 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DownloadFilesCheckErrorsSetup() { 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<DownloadItem*> download_items; 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDownloads(browser(), &download_items); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(download_items.empty()); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnableFileChooser(true); 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DownloadFilesCheckErrorsLoopBody(const DownloadInfo& download_info, 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t i) { 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::stringstream s; 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s << " " << __FUNCTION__ << "()" 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " index = " << i 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " url = '" << download_info.url_name << "'" 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " method = " 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ((download_info.download_method == DOWNLOAD_DIRECT) ? 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "DOWNLOAD_DIRECT" : "DOWNLOAD_NAVIGATE") 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " show_item = " << download_info.show_download_item 8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << " reason = " << DownloadInterruptReasonToString(download_info.reason); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<DownloadItem*> download_items; 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDownloads(browser(), &download_items); 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t downloads_expected = download_items.size(); 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string server_path = "files/downloads/"; 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_path += download_info.url_name; 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL(server_path); 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(url.is_valid()) << s.str(); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager* download_manager = DownloadManagerForBrowser(browser()); 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(web_contents) << s.str(); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new content::DownloadTestObserverTerminal( 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_manager, 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (download_info.download_method == DOWNLOAD_DIRECT) { 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Go directly to download. Don't wait for navigation. 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<content::DownloadTestItemCreationObserver> 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) creation_observer(new content::DownloadTestItemCreationObserver); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DownloadUrlParameters> params( 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadUrlParameters::FromWebContents(web_contents, url)); 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->set_callback(creation_observer->callback()); 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManagerForBrowser(browser())->DownloadUrl(params.Pass()); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait until the item is created, or we have determined that it 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // won't be. 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) creation_observer->WaitForDownloadItemCreation(); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(download_info.show_download_item, 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) creation_observer->succeeded()); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (download_info.show_download_item) { 9045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(content::DOWNLOAD_INTERRUPT_REASON_NONE, 9055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) creation_observer->interrupt_reason()); 9067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_NE(content::DownloadItem::kInvalidId, 9077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch creation_observer->download_id()); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_NE(content::DOWNLOAD_INTERRUPT_REASON_NONE, 9105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) creation_observer->interrupt_reason()); 9117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(content::DownloadItem::kInvalidId, 9127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch creation_observer->download_id()); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to URL normally, wait until done. 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(), 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (download_info.show_download_item) { 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloads_expected++; 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::DownloadState final_state = 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (download_info.reason == content::DOWNLOAD_INTERRUPT_REASON_NONE) ? 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::COMPLETE : 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::INTERRUPTED; 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(final_state)); 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait till the |DownloadFile|s are destroyed. 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(content::BrowserThread::FILE); 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(content::BrowserThread::UI); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Validate that the correct files were downloaded. 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_items.clear(); 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDownloads(browser(), &download_items); 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(downloads_expected, download_items.size()) << s.str(); 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (download_info.show_download_item) { 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the last download item. 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item = download_items[0]; 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t d = 1; d < downloads_expected; ++d) { 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (download_items[d]->GetStartTime() > item->GetStartTime()) 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item = download_items[d]; 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(url, item->GetOriginalUrl()) << s.str(); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(download_info.reason, item->GetLastReason()) << s.str(); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (item->GetState() == content::DownloadItem::COMPLETE) { 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clean up the file, in case it ended up in the My Documents folder. 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath destination_folder = GetDownloadDirectory(browser()); 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath my_downloaded_file = item->GetTargetFilePath(); 9567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(my_downloaded_file)); 9577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::DeleteFile(my_downloaded_file, false)); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(download_info.should_redirect_to_documents ? 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string::npos : 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0u, 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) my_downloaded_file.value().find(destination_folder.value())); 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (download_info.should_redirect_to_documents) { 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If it's not where we asked it to be, it should be in the 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // My Documents folder. 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath my_docs_folder; 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PathService::Get(chrome::DIR_USER_DOCUMENTS, 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &my_docs_folder)); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) my_downloaded_file.value().find(my_docs_folder.value())); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Attempts to download a set of files, based on information in the 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |download_info| array. |count| is the number of files. 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a Select File dialog appears, it will choose the default and return 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // immediately. 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DownloadFilesCheckErrors(size_t count, DownloadInfo* download_info) { 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadFilesCheckErrorsSetup(); 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadFilesCheckErrorsLoopBody(download_info[i], i); 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DownloadInsertFilesErrorCheckErrorsLoopBody( 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<content::TestFileErrorInjector> injector, 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileErrorInjectInfo& info, 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t i) { 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::stringstream s; 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s << " " << __FUNCTION__ << "()" 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " index = " << i 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " url = " << info.error_info.url 9965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << " operation code = " 9975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << content::TestFileErrorInjector::DebugString(info.error_info.code) 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " instance = " << info.error_info.operation_instance 9995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << " error = " 10005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << content::DownloadInterruptReasonToString(info.error_info.error); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) injector->ClearErrors(); 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) injector->AddError(info.error_info); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) injector->InjectErrors(); 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadFilesCheckErrorsLoopBody(info.download_info, i); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t expected_successes = info.download_info.show_download_item ? 1u : 0u; 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_successes, injector->TotalFileCount()) << s.str(); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, injector->CurrentFileCount()) << s.str(); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (info.download_info.show_download_item) 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(injector->HadFile(GURL(info.error_info.url))) << s.str(); 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DownloadInsertFilesErrorCheckErrors(size_t count, 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileErrorInjectInfo* info) { 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadFilesCheckErrorsSetup(); 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up file failures. 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<content::TestFileErrorInjector> injector( 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestFileErrorInjector::Create( 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManagerForBrowser(browser()))); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up the full URL, for download file tracking. 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string server_path = "files/downloads/"; 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_path += info[i].download_info.url_name; 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL(server_path); 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info[i].error_info.url = url.spec(); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadInsertFilesErrorCheckErrorsLoopBody(injector, info[i], i); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Attempts to download a file to a read-only folder, based on information 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in |download_info|. 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DownloadFilesToReadonlyFolder(size_t count, 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadInfo* download_info) { 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadFilesCheckErrorsSetup(); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make the test folder unwritable. 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath destination_folder = GetDownloadDirectory(browser()); 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << " " << __FUNCTION__ << "()" 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " folder = '" << destination_folder.value() << "'"; 10476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::FilePermissionRestorer permission_restorer(destination_folder); 10486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_TRUE(base::MakeFileUnwritable(destination_folder)); 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadFilesCheckErrorsLoopBody(download_info[i], i); 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A mock install prompt that simulates the user allowing an install request. 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetAllowMockInstallPrompt() { 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_crx_util::SetMockInstallPromptForTesting( 1058ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<ExtensionInstallPrompt>( 1059ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new MockAutoConfirmExtensionInstallPrompt( 1060ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch browser()->tab_strip_model()->GetActiveWebContents()))); 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // This method: 10647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // * Starts a mock download by navigating browser() to a URLRequestMockHTTPJob 10657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // mock URL. 10667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // * Injects |error| on the first write using |error_injector|. 10677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // * Waits for the download to be interrupted. 10687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // * Clears the errors on |error_injector|. 10697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // * Returns the resulting interrupted download. 10707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DownloadItem* StartMockDownloadAndInjectError( 10717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::TestFileErrorInjector* error_injector, 10727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::DownloadInterruptReason error) { 10737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::FilePath file_path(FILE_PATH_LITERAL("download-test1.lib")); 10747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GURL url = URLRequestMockHTTPJob::GetMockUrl(file_path); 10757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 10767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::TestFileErrorInjector::FileErrorInfo error_info; 10777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_info.url = url.spec(); 10787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_info.code = content::TestFileErrorInjector::FILE_OPERATION_WRITE; 10797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_info.operation_instance = 0; 10807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_info.error = error; 10817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_injector->ClearErrors(); 10827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_injector->AddError(error_info); 10837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_injector->InjectErrors(); 10847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 10857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<content::DownloadTestObserver> observer( 10867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch new DownloadTestObserverResumable( 10877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DownloadManagerForBrowser(browser()), 1)); 10887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui_test_utils::NavigateToURL(browser(), url); 10897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch observer->WaitForFinished(); 10907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 10917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::DownloadManager::DownloadVector downloads; 10927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DownloadManagerForBrowser(browser())->GetAllDownloads(&downloads); 10937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(1u, downloads.size()); 10947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 10957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (downloads.size() != 1) 10967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return NULL; 10977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 10987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_injector->ClearErrors(); 10997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_injector->InjectErrors(); 11007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DownloadItem* download = downloads[0]; 11017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(DownloadItem::INTERRUPTED, download->GetState()); 11027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(error, download->GetLastReason()); 11037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return download; 11047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 11057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void EnsureNoPendingDownloadJobsOnIO(bool* result) { 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URLRequestSlowDownloadJob::NumberOutstandingRequests()) 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = false; 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 111190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) BrowserThread::UI, FROM_HERE, base::MessageLoop::QuitClosure()); 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Location of the test data. 11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_dir_; 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Location of the downloads directory for these tests 11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir downloads_directory_; 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DownloadTestFileActivityObserver> file_activity_observer_; 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTES: 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Files for these tests are found in DIR_TEST_DATA (currently 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "chrome\test\data\", see chrome_paths.cc). 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mock responses have extension .mock-http-headers appended to the file name. 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Download a file due to the associated MIME type. 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadMimeType) { 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download the file and wait. We do not expect the Select File dialog. 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadAndWait(browser(), url); 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check state. 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownload(browser(), file, file); 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Download a file and confirm that the zone identifier (on windows) 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is set to internet. 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, CheckInternetZone) { 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download the file and wait. We do not expect the Select File dialog. 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadAndWait(browser(), url); 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check state. Special file state must be checked before CheckDownload, 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as CheckDownload will delete the output file. 11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath downloaded_file(DestinationFile(browser(), file)); 1157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (base::VolumeSupportsADS(downloaded_file)) 1158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(base::HasInternetZoneIdentifier(downloaded_file)); 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownload(browser(), file, file); 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Put up a Select File dialog when the file is downloaded, due to 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// downloads preferences settings. 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadMimeTypeSelect) { 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Re-enable prompting. 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->profile()->GetPrefs()->SetBoolean( 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kPromptForDownload, true); 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnableFileChooser(true); 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download the file and wait. We expect the Select File dialog to appear 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // due to the MIME type, but we still wait until the download completes. 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new content::DownloadTestObserverTerminal( 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManagerForBrowser(browser()), 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), url, CURRENT_TAB, 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownloadStates(1, DownloadItem::COMPLETE); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidShowFileChooser()); 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check state. 11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownload(browser(), file, file); 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Access a file with a viewable mime-type, verify that a download 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// did not initiate. 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, NoDownload) { 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test2.html")); 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path(DestinationFile(browser(), file)); 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open a web page and wait. 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that we did not download the web page. 12077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(file_path)); 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check state. 12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, MimeTypesToShowNotDownload) { 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These files should all be displayed in the browser. 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* mime_types[] = { 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is unclear whether to display text/css or download it. 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Firefox 3: Display 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Internet Explorer 7: Download 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Safari 3.2: Download 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We choose to match Firefox due to the lot of complains 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the users if css files are downloaded: 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://code.google.com/p/chromium/issues/detail?id=7192 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "text/css", 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "text/javascript", 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "text/plain", 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "application/x-javascript", 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "text/html", 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "text/xml", 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "text/xsl", 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "application/xhtml+xml", 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "image/png", 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "image/gif", 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "image/jpeg", 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "image/bmp", 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(mime_types); ++i) { 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* mime_type = mime_types[i]; 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string path("contenttype?"); 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server()->GetURL(path + mime_type)); 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check state. 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that when the DownloadResourceThrottle cancels a download, the 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download never makes it to the downloads system. 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadResourceThrottleCancels) { 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to a page with the same domain as the file to download. We can't 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigate directly to the file we don't want to download because cross-site 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigations reset the TabDownloadState. 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath same_site_path(FILE_PATH_LITERAL("download_script.html")); 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL same_site_url(URLRequestMockHTTPJob::GetMockUrl(same_site_path)); 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), same_site_url); 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the initial navigation didn't trigger a download. 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<content::DownloadItem*> items; 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManagerForBrowser(browser())->GetAllDownloads(&items); 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, items.size()); 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable downloads for the tab. 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadRequestLimiter::TabDownloadState* tab_download_state = 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_browser_process->download_request_limiter()->GetDownloadState( 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents, web_contents, true); 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(tab_download_state); 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_download_state->set_download_status( 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED); 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to start the download via Javascript and wait for the corresponding 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // load stop event. 1278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::TestNavigationObserver observer(web_contents); 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool download_assempted; 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(), 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(startDownload());", 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &download_assempted)); 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(download_assempted); 12854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) observer.Wait(); 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that we did not download the file. 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path(DestinationFile(browser(), file)); 12907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(file_path)); 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check state. 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that there's no pending download. The resource throttle 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should have deleted it before it created a download item, so it 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // shouldn't be available as a cancelled download either. 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManagerForBrowser(browser())->GetAllDownloads(&items); 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, items.size()); 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Download a 0-size file with a content-disposition header, verify that the 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download tab opened and the file exists as the filename specified in the 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// header. This also ensures we properly handle empty file downloads. 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The download shelf should be visible in the current tab. 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, ContentDisposition) { 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test3.gif")); 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath download_file( 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FILE_PATH_LITERAL("download-test3-attachment.gif")); 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download a file and wait. 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadAndWait(browser(), url); 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownload(browser(), download_file, file); 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check state. 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the download shelf is per-window by starting a download in one 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tab, opening a second tab, closing the shelf, going back to the first tab, 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and checking that the shelf is closed. 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, PerWindowShelf) { 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test3.gif")); 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath download_file( 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FILE_PATH_LITERAL("download-test3-attachment.gif")); 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download a file and wait. 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadAndWait(browser(), url); 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownload(browser(), download_file, file); 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check state. 13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open a second tab and wait. 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(static_cast<WebContents*>(NULL), 1343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) chrome::AddSelectedTabWithURL(browser(), 1344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GURL(url::kAboutBlankURL), 13451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_TYPED)); 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, browser()->tab_strip_model()->count()); 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hide the download shelf. 1350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser()->window()->GetDownloadShelf()->Close(DownloadShelf::AUTOMATIC); 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Go to the first tab. 13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->ActivateTabAt(0, true); 13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, browser()->tab_strip_model()->count()); 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The download shelf should not be visible. 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check whether the downloads shelf is closed when the downloads tab is 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// invoked. 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, CloseShelfOnDownloadsTab) { 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download the file and wait. We do not expect the Select File dialog. 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadAndWait(browser(), url); 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check state. 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open the downloads tab. 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::ShowDownloads(browser()); 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The shelf should now be closed. 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UnknownSize and KnownSize are tests which depend on 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLRequestSlowDownloadJob to serve content in a certain way. Data will be 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sent in two chunks where the first chunk is 35K and the second chunk is 10K. 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The test will first attempt to download a file; but the server will "pause" 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the middle until the server receives a second request for 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "download-finish". At that time, the download will finish. 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These tests don't currently test much due to holes in |RunSizeTest()|. See 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// comments in that routine for details. 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, UnknownSize) { 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(RunSizeTest(browser(), SIZE_TEST_TYPE_UNKNOWN, 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "32.0 KB - ", "100% - ")); 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, KnownSize) { 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(RunSizeTest(browser(), SIZE_TEST_TYPE_KNOWN, 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "71% - ", "100% - ")); 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when downloading an item in Incognito mode, we don't crash when 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// closing the last Incognito window (http://crbug.com/13983). 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Also check that the download shelf is not visible after closing the 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Incognito window. 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, IncognitoDownload) { 14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* incognito = CreateIncognitoBrowser(); 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(incognito); 14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int window_count = chrome::GetTotalBrowserCount(); 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, window_count); 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download a file in the Incognito window and wait. 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateAndSetDownloadsDirectory(incognito); 14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since |incognito| is a separate browser, we have to set it up explicitly. 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) incognito->profile()->GetPrefs()->SetBoolean(prefs::kPromptForDownload, 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadAndWait(incognito, url); 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should still have 2 windows. 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectWindowCountAfterDownload(2); 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the download shelf is showing for the Incognito window. 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(incognito->window()->IsDownloadShelfVisible()); 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Mac OS X, the UI window close is delayed until the outermost 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message loop runs. So it isn't possible to get a BROWSER_CLOSED 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notification inside of a test. 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver signal( 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_BROWSER_CLOSED, 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Browser>(incognito)); 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the Incognito window and don't crash. 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::CloseWindow(incognito); 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) signal.Wait(); 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectWindowCountAfterDownload(1); 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the regular window does not have a download shelf. 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On ChromeOS, the download panel is common to both profiles, so 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it is still visible. 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownload(browser(), file, file); 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Download one file on-record, then download the same file off-record, and test 14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// that the filename is deduplicated. The previous test tests for a specific 14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// bug; this next test tests that filename deduplication happens independently 14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of DownloadManager/CDMD. 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadTest_IncognitoRegular) { 14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url(test_server()->GetURL("files/downloads/a_zip_file.zip")); 14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Read the origin file now so that we can compare the downloaded files to it 14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // later. 14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath origin(OriginFile(base::FilePath(FILE_PATH_LITERAL( 14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "downloads/a_zip_file.zip")))); 14607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(origin)); 14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 origin_file_size = 0; 1462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(base::GetFileSize(origin, &origin_file_size)); 14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string original_contents; 146458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(base::ReadFileToString(origin, &original_contents)); 14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<DownloadItem*> download_items; 14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDownloads(browser(), &download_items); 14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(download_items.empty()); 14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Download a file in the on-record browser and check that it was downloaded 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // correctly. 14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadAndWaitWithDisposition(browser(), 14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url, 14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CURRENT_TAB, 14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDownloads(browser(), &download_items); 14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1UL, download_items.size()); 14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(base::FilePath(FILE_PATH_LITERAL("a_zip_file.zip")), 1480b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) download_items[0]->GetTargetFilePath().BaseName()); 14817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(download_items[0]->GetTargetFilePath())); 1482b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(VerifyFile(download_items[0]->GetTargetFilePath(), 14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) original_contents, origin_file_size)); 14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Setup an incognito window. 14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* incognito = CreateIncognitoBrowser(); 14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(incognito); 14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int window_count = BrowserList::GetInstance( 14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->host_desktop_type())->size(); 14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, window_count); 14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) incognito->profile()->GetPrefs()->SetFilePath( 14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kDownloadDefaultDirectory, 14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDownloadsDirectory()); 1494868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) incognito->profile()->GetPrefs()->SetFilePath( 1495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) prefs::kSaveFileDefaultDirectory, 1496868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetDownloadsDirectory()); 14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_items.clear(); 14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDownloads(incognito, &download_items); 15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(download_items.empty()); 15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Download a file in the incognito browser and check that it was downloaded 15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // correctly. 15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadAndWaitWithDisposition(incognito, 15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url, 15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CURRENT_TAB, 15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(incognito->window()->IsDownloadShelfVisible()); 15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDownloads(incognito, &download_items); 15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1UL, download_items.size()); 15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(base::FilePath(FILE_PATH_LITERAL("a_zip_file (1).zip")), 1512b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) download_items[0]->GetTargetFilePath().BaseName()); 15137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(download_items[0]->GetTargetFilePath())); 1514b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(VerifyFile(download_items[0]->GetTargetFilePath(), 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) original_contents, origin_file_size)); 15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Navigate to a new background page, but don't download. Confirm that the 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download shelf is not visible and that we have two tabs. 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DontCloseNewTab1) { 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because it's an HTML link, it should open a web page rather than 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // downloading. 15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file1(FILE_PATH_LITERAL("download-test2.html")); 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(URLRequestMockHTTPJob::GetMockUrl(file1)); 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open a web page and wait. 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NEW_BACKGROUND_TAB, 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should have two tabs now. 15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, browser()->tab_strip_model()->count()); 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Download a file in a background tab. Verify that the tab is closed 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// automatically, and that the download shelf is visible in the current tab. 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, CloseNewTab1) { 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download a file in a new background tab and wait. The tab is automatically 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // closed when the download begins. 15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadAndWaitWithDisposition( 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NEW_BACKGROUND_TAB, 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0); 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the download finishes, we should still have one tab. 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownload(browser(), file, file); 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Open a web page in the current tab, then download a file in another tab via 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a Javascript call. 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we have 2 tabs, and the download shelf is visible in the current 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tab. 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The download_page1.html page contains an openNew() function that opens a 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tab and then downloads download-test1.lib. 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DontCloseNewTab2) { 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because it's an HTML link, it should open a web page rather than 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // downloading. 15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file1(FILE_PATH_LITERAL("download_page1.html")); 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(URLRequestMockHTTPJob::GetMockUrl(file1)); 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open a web page and wait. 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download a file in a new tab and wait (via Javascript). 15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadAndWaitWithDisposition(browser(), 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("javascript:openNew()"), 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CURRENT_TAB, 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the download finishes, we should have two tabs. 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, browser()->tab_strip_model()->count()); 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownload(browser(), file, file); 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Open a web page in the current tab, open another tab via a Javascript call, 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// then download a file in the new tab. 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we have 2 tabs, and the download shelf is visible in the current 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tab. 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The download_page2.html page contains an openNew() function that opens a 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tab. 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DontCloseNewTab3) { 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because it's an HTML link, it should open a web page rather than 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // downloading. 15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file1(FILE_PATH_LITERAL("download_page2.html")); 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url1(URLRequestMockHTTPJob::GetMockUrl(file1)); 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open a web page and wait. 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url1); 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open a new tab and wait. 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("javascript:openNew()"), 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CURRENT_TAB, 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, browser()->tab_strip_model()->count()); 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download a file and wait. 16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadAndWaitWithDisposition(browser(), 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CURRENT_TAB, 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the download finishes, we should have two tabs. 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, browser()->tab_strip_model()->count()); 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownload(browser(), file, file); 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Open a web page in the current tab, then download a file via Javascript, 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// which will do so in a temporary tab. 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we have 1 tab, and the download shelf is visible. 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The download_page3.html page contains an openNew() function that opens a 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tab with download-test1.lib in the URL. When the URL is determined to be 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a download, the tab is closed automatically. 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, CloseNewTab2) { 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because it's an HTML link, it should open a web page rather than 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // downloading. 16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file1(FILE_PATH_LITERAL("download_page3.html")); 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(URLRequestMockHTTPJob::GetMockUrl(file1)); 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open a web page and wait. 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download a file and wait. 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The file to download is "download-test1.lib". 16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadAndWaitWithDisposition(browser(), 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("javascript:openNew()"), 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CURRENT_TAB, 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the download finishes, we should still have one tab. 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownload(browser(), file, file); 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Open a web page in the current tab, then call Javascript via a button to 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download a file in a new tab, which is closed automatically when the 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download begins. 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we have 1 tab, and the download shelf is visible. 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The download_page4.html page contains a form with download-test1.lib as the 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// action. 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, CloseNewTab3) { 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because it's an HTML link, it should open a web page rather than 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // downloading. 16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file1(FILE_PATH_LITERAL("download_page4.html")); 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(URLRequestMockHTTPJob::GetMockUrl(file1)); 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open a web page and wait. 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download a file in a new tab and wait. The tab will automatically close 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when the download begins. 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The file to download is "download-test1.lib". 16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadAndWaitWithDisposition( 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("javascript:document.getElementById('form').submit()"), 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CURRENT_TAB, 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the download finishes, we should still have one tab. 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownload(browser(), file, file); 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Download a file in a new window. 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we have 2 windows, and the download shelf is not visible in the 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// first window, but is visible in the second window. 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Close the new window. 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we have 1 window, and the download shelf is not visible. 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Regression test for http://crbug.com/44454 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, NewWindow) { 17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See below. 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* first_browser = browser(); 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download a file in a new window and wait. 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadAndWaitWithDisposition(browser(), 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NEW_WINDOW, 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the download finishes, the download shelf SHOULD NOT be visible in 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the first window. 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectWindowCountAfterDownload(2); 17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download shelf should close. Download panel stays open on ChromeOS. 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The download shelf SHOULD be visible in the second window. 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<Browser*> original_browsers; 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_browsers.insert(browser()); 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* download_browser = 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::GetBrowserNotInSet(original_browsers); 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(download_browser != NULL); 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(download_browser, browser()); 17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, download_browser->tab_strip_model()->count()); 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(download_browser->window()->IsDownloadShelfVisible()); 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Mac OS X, the UI window close is delayed until the outermost 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message loop runs. So it isn't possible to get a BROWSER_CLOSED 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notification inside of a test. 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver signal( 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_BROWSER_CLOSED, 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Browser>(download_browser)); 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the new window. 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::CloseWindow(download_browser); 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) signal.Wait(); 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(first_browser, browser()); 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectWindowCountAfterDownload(1); 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download shelf should close. Download panel stays open on ChromeOS. 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownload(browser(), file, file); 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadHistoryCheck) { 17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL download_url(URLRequestSlowDownloadJob::kKnownSizeUrl); 1757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath file(net::GenerateFileName(download_url, 1758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 1759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 1761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 1762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string())); 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We use the server so that we can get a redirect and test url_chain 17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // persistence. 17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL redirect_url = test_server()->GetURL( 17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "server-redirect?" + download_url.spec()); 17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Download the url and wait until the object has been stored. 17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time start(base::Time::Now()); 17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HistoryObserver observer(browser()->profile()); 17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer.SetFilterCallback(base::Bind(&HasDataAndName)); 17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::NavigateToURL(browser(), redirect_url); 17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer.WaitForStored(); 17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get the details on what was stored into the history. 17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<std::vector<history::DownloadRow> > downloads_in_database; 17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(DownloadsHistoryDataCollector( 17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile()).WaitForDownloadInfo(&downloads_in_database)); 17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, downloads_in_database->size()); 17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Confirm history storage is what you expect for a partially completed 17842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // slow download job. 17852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) history::DownloadRow& row(downloads_in_database->at(0)); 17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(DestinationFile(browser(), file), row.target_path); 178790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(DownloadTargetDeterminer::GetCrDownloadPath( 178890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DestinationFile(browser(), file)), 17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) row.current_path); 17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2u, row.url_chain.size()); 17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(redirect_url.spec(), row.url_chain[0].spec()); 17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(download_url.spec(), row.url_chain[1].spec()); 17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, row.danger_type); 17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LE(start, row.start_time); 17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(URLRequestSlowDownloadJob::kFirstDownloadSize, row.received_bytes); 17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(URLRequestSlowDownloadJob::kFirstDownloadSize 17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) + URLRequestSlowDownloadJob::kSecondDownloadSize, row.total_bytes); 17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(content::DownloadItem::IN_PROGRESS, row.state); 17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(row.opened); 18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Finish the download. We're ok relying on the history to be flushed 18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // at this point as our queries will be behind the history updates 18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // invoked by completion. 18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<content::DownloadTestObserver> download_observer( 18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateWaiter(browser(), 1)); 18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::NavigateToURL(browser(), 18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL(URLRequestSlowDownloadJob::kErrorDownloadUrl)); 18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_observer->WaitForFinished(); 18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, download_observer->NumDownloadsSeenInState( 18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem::INTERRUPTED)); 18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time end(base::Time::Now()); 18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get what was stored in the history. 18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(DownloadsHistoryDataCollector( 18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile()).WaitForDownloadInfo(&downloads_in_database)); 18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, downloads_in_database->size()); 18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1818a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Confirm history storage is what you expect for an interrupted slow download 1819a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // job. The download isn't continuable, so there's no intermediate file. 18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) history::DownloadRow& row1(downloads_in_database->at(0)); 18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(DestinationFile(browser(), file), row1.target_path); 1822a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(row1.current_path.empty()); 18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2u, row1.url_chain.size()); 18242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(redirect_url.spec(), row1.url_chain[0].spec()); 18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(download_url.spec(), row1.url_chain[1].spec()); 18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, row1.danger_type); 18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LE(start, row1.start_time); 18282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_GE(end, row1.end_time); 18292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(URLRequestSlowDownloadJob::kFirstDownloadSize, 18302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) row1.received_bytes); 18312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(URLRequestSlowDownloadJob::kFirstDownloadSize 18322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) + URLRequestSlowDownloadJob::kSecondDownloadSize, row1.total_bytes); 18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(content::DownloadItem::INTERRUPTED, row1.state); 18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(content::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, 18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) row1.interrupt_reason); 18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(row1.opened); 18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure a dangerous file shows up properly in the history. 18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadHistoryDangerCheck) { 1841558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH) 1842558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Disable this test in Metro+Ash for now (http://crbug.com/262796). 1843a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 1844558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return; 1845558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif 1846558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // .swf file so that it's dangerous on all platforms (including CrOS). 18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("downloads/dangerous/dangerous.swf")); 18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL download_url(URLRequestMockHTTPJob::GetMockUrl(file)); 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Download the url and wait until the object has been stored. 18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<content::DownloadTestObserver> download_observer( 18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new content::DownloadTestObserverTerminal( 18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadManagerForBrowser(browser()), 1, 18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_IGNORE)); 18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time start(base::Time::Now()); 18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HistoryObserver observer(browser()->profile()); 18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer.SetFilterCallback(base::Bind(&HasDataAndName)); 18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::NavigateToURL(browser(), download_url); 18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer.WaitForStored(); 18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get the details on what was stored into the history. 18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<std::vector<history::DownloadRow> > downloads_in_database; 18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(DownloadsHistoryDataCollector( 18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile()).WaitForDownloadInfo(&downloads_in_database)); 18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, downloads_in_database->size()); 18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Confirm history storage is what you expect for an unvalidated 18692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // dangerous file. 18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) history::DownloadRow& row(downloads_in_database->at(0)); 18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(DestinationFile(browser(), file), row.target_path); 187290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_NE(DownloadTargetDeterminer::GetCrDownloadPath( 187390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DestinationFile(browser(), file)), 18742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) row.current_path); 18752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, row.danger_type); 18762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LE(start, row.start_time); 18772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(content::DownloadItem::IN_PROGRESS, row.state); 18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(row.opened); 18792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Validate the download and wait for it to finish. 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<DownloadItem*> downloads; 18822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadManagerForBrowser(browser())->GetAllDownloads(&downloads); 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, downloads.size()); 1884868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) downloads[0]->ValidateDangerousDownload(); 18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_observer->WaitForFinished(); 18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get history details and confirm it's what you expect. 18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downloads_in_database->clear(); 18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(DownloadsHistoryDataCollector( 18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile()).WaitForDownloadInfo(&downloads_in_database)); 18912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, downloads_in_database->size()); 18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) history::DownloadRow& row1(downloads_in_database->at(0)); 18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(DestinationFile(browser(), file), row1.target_path); 18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(DestinationFile(browser(), file), row1.current_path); 18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(content::DOWNLOAD_DANGER_TYPE_USER_VALIDATED, row1.danger_type); 18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LE(start, row1.start_time); 18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(content::DownloadItem::COMPLETE, row1.state); 18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(row1.opened); 18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Not checking file size--not relevant to the point of the test, and 19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the file size is actually different on Windows and other platforms, 19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // because for source control simplicity it's actually a text file, and 19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // there are CRLF transformations for those files. 19032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, PRE_DownloadTest_History) { 19062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Download a file and wait for it to be stored. 19072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); 19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL download_url(URLRequestMockHTTPJob::GetMockUrl(file)); 19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HistoryObserver observer(browser()->profile()); 19102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadAndWait(browser(), download_url); 19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer.WaitForStored(); 19127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HistoryServiceFactory::GetForProfile( 19137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch browser()->profile(), Profile::IMPLICIT_ACCESS)->FlushForTest( 19147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(&base::MessageLoop::Quit, 1915ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Unretained(base::MessageLoop::current()->current()))); 19167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::RunMessageLoop(); 19172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS) 19201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Times out on ChromeOS: http://crbug.com/217810 19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DownloadTest_History DISABLED_DownloadTest_History 19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 19232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DownloadTest_History DownloadTest_History 19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, MAYBE_DownloadTest_History) { 19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This starts up right after PRE_DownloadTest_History and shares the same 19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // profile directory. 19282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); 19292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL download_url(URLRequestMockHTTPJob::GetMockUrl(file)); 19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<DownloadItem*> downloads; 19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DownloadManager* manager = DownloadManagerForBrowser(browser()); 19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for the history to be loaded with a single DownloadItem. Check that 19342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // it's the file that was downloaded in PRE_DownloadTest_History. 19352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreatedObserver created_observer(manager); 19362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) created_observer.Wait(); 19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager->GetAllDownloads(&downloads); 19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1UL, downloads.size()); 19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* item = downloads[0]; 1940ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(file.value(), item->GetFullPath().BaseName().value()); 1941ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(file.value(), item->GetTargetFilePath().BaseName().value()); 1942ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(download_url, item->GetURL()); 1943ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // The following are set by download-test1.lib.mock-http-headers. 1944ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string etag = item->GetETag(); 1945a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TrimWhitespaceASCII(etag, base::TRIM_ALL, &etag); 1946ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("abracadabra", etag); 1947ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1948ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string last_modified = item->GetLastModifiedTime(); 1949a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TrimWhitespaceASCII(last_modified, base::TRIM_ALL, &last_modified); 1950ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("Mon, 13 Nov 2006 20:31:09 GMT", last_modified); 1951cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1952cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Downloads that were restored from history shouldn't cause the download 1953cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // shelf to be displayed. 1954cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/14505. This tests that chrome:// urls are still functional 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// after download of a file while viewing another chrome://. 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, ChromeURLAfterDownload) { 19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL download_url(URLRequestMockHTTPJob::GetMockUrl(file)); 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL flags_url(chrome::kChromeUIFlagsURL); 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL extensions_url(chrome::kChromeUIExtensionsFrameURL); 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), flags_url); 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadAndWait(browser(), download_url); 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), extensions_url); 19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* contents = 19692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(contents); 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool webui_responded = false; 19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(content::ExecuteScriptAndExtractBool( 19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents, 19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(window.webuiResponded);", 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &webui_responded)); 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(webui_responded); 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/12745. This tests that if a download is initiated from 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a chrome:// page that has registered and onunload handler, the browser 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// will be able to close. 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, BrowserCloseAfterDownload) { 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL downloads_url(chrome::kChromeUIFlagsURL); 19842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL download_url(URLRequestMockHTTPJob::GetMockUrl(file)); 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), downloads_url); 19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(contents); 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = false; 19912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(content::ExecuteScriptAndExtractBool( 19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents, 19932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.onunload = function() { var do_nothing = 0; }; " 19942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(true);", 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result)); 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(result); 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadAndWait(browser(), download_url); 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver signal( 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_BROWSER_CLOSED, 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Browser>(browser())); 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::CloseWindow(browser()); 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) signal.Wait(); 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test to make sure the 'download' attribute in anchor tag is respected. 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, AnchorDownloadTag) { 20092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-anchor-attrib.html")); 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a download, wait until it's complete, and confirm 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we're in the expected state. 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateWaiter(browser(), 1)); 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownloadStates(1, DownloadItem::COMPLETE); 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Confirm the downloaded data exists. 20222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath downloaded_file = GetDownloadDirectory(browser()); 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloaded_file = downloaded_file.Append(FILE_PATH_LITERAL("a_red_dot.png")); 20247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(downloaded_file)); 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test to make sure auto-open works. 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, AutoOpen) { 20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-autoopen.txt")); 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE( 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDownloadPrefs(browser())->EnableAutoOpenBasedOnExtension(file)); 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadAndWait(browser(), url); 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the download and confirm it was opened. 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<DownloadItem*> downloads; 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManagerForBrowser(browser())->GetAllDownloads(&downloads); 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, downloads.size()); 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(DownloadItem::COMPLETE, downloads[0]->GetState()); 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unfortunately, this will block forever, causing a timeout, if 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the download is never opened. 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadUpdatedObserver( 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloads[0], base::Bind(&WasAutoOpened)).WaitForEvent(); 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(downloads[0]->GetOpened()); // Confirm it anyway. 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // As long as we're here, confirmed everything else is good. 20502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownload(browser(), file, file); 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download shelf should close. Download panel stays open on ChromeOS. 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Download an extension. Expect a dangerous download warning. 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Deny the download. 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, CrxDenyInstall) { 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FeatureSwitch::ScopedOverride enable_easy_off_store_install( 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FeatureSwitch::easy_off_store_install(), true); 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL extension_url(URLRequestMockHTTPJob::GetMockUrl(kGoodCrxPath)); 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DangerousDownloadWaiter( 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), 1, 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_DENY)); 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), extension_url); 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::CANCELLED)); 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDangerousDownloadsSeen()); 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download shelf should close. 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the CRX is not installed. 20782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service = extensions::ExtensionSystem::Get( 20792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile())->extension_service(); 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(extension_service->GetExtensionById(kGoodCrxId, false)); 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Download an extension. Expect a dangerous download warning. 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Allow the download, deny the install. 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, CrxInstallDenysPermissions) { 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FeatureSwitch::ScopedOverride enable_easy_off_store_install( 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FeatureSwitch::easy_off_store_install(), true); 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL extension_url(URLRequestMockHTTPJob::GetMockUrl(kGoodCrxPath)); 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install a mock install UI that simulates a user denying permission to 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // finish the install. 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_crx_util::SetMockInstallPromptForTesting( 2094ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<ExtensionInstallPrompt>( 2095ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new MockAbortExtensionInstallPrompt())); 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DangerousDownloadWaiter( 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), 1, 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_ACCEPT)); 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), extension_url); 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownloadStates(1, DownloadItem::COMPLETE); 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDangerousDownloadsSeen()); 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download shelf should close from auto-open. 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadManager::DownloadVector downloads; 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManagerForBrowser(browser())->GetAllDownloads(&downloads); 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, downloads.size()); 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadUpdatedObserver( 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloads[0], base::Bind(&WasAutoOpened)).WaitForEvent(); 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the extension was not installed. 21172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service = extensions::ExtensionSystem::Get( 21182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile())->extension_service(); 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(extension_service->GetExtensionById(kGoodCrxId, false)); 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Download an extension. Expect a dangerous download warning. 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Allow the download, and the install. 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, CrxInstallAcceptPermissions) { 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FeatureSwitch::ScopedOverride enable_easy_off_store_install( 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FeatureSwitch::easy_off_store_install(), true); 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL extension_url(URLRequestMockHTTPJob::GetMockUrl(kGoodCrxPath)); 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install a mock install UI that simulates a user allowing permission to 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // finish the install. 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAllowMockInstallPrompt(); 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DangerousDownloadWaiter( 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), 1, 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_ACCEPT)); 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), extension_url); 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownloadStates(1, DownloadItem::COMPLETE); 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDangerousDownloadsSeen()); 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download shelf should close from auto-open. 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadManager::DownloadVector downloads; 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManagerForBrowser(browser())->GetAllDownloads(&downloads); 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, downloads.size()); 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadUpdatedObserver( 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloads[0], base::Bind(&WasAutoOpened)).WaitForEvent(); 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the extension was installed. 21542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service = extensions::ExtensionSystem::Get( 21552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile())->extension_service(); 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension_service->GetExtensionById(kGoodCrxId, false)); 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test installing a CRX that fails integrity checks. 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, CrxInvalid) { 21612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("extensions/bad_signature.crx")); 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL extension_url(URLRequestMockHTTPJob::GetMockUrl(file)); 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install a mock install UI that simulates a user allowing permission to 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // finish the install, and dismisses any error message. We check that the 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // install failed below. 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAllowMockInstallPrompt(); 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DangerousDownloadWaiter( 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), 1, 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_ACCEPT)); 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), extension_url); 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownloadStates(1, DownloadItem::COMPLETE); 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the extension was not installed. 21802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service = extensions::ExtensionSystem::Get( 21812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile())->extension_service(); 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(extension_service->GetExtensionById(kGoodCrxId, false)); 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Install a large (100kb) theme. 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, CrxLargeTheme) { 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FeatureSwitch::ScopedOverride enable_easy_off_store_install( 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FeatureSwitch::easy_off_store_install(), true); 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL extension_url(URLRequestMockHTTPJob::GetMockUrl(kLargeThemePath)); 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install a mock install UI that simulates a user allowing permission to 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // finish the install. 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAllowMockInstallPrompt(); 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DangerousDownloadWaiter( 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), 1, 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_ACCEPT)); 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), extension_url); 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownloadStates(1, DownloadItem::COMPLETE); 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDangerousDownloadsSeen()); 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download shelf should close from auto-open. 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadManager::DownloadVector downloads; 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManagerForBrowser(browser())->GetAllDownloads(&downloads); 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, downloads.size()); 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadUpdatedObserver( 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloads[0], base::Bind(&WasAutoOpened)).WaitForEvent(); 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the extension was installed. 22162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service = extensions::ExtensionSystem::Get( 22172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile())->extension_service(); 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension_service->GetExtensionById(kLargeThemeCrxId, false)); 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests for download initiation functions. 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadUrl) { 22232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DownloadUrl always prompts; return acceptance of whatever it prompts. 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnableFileChooser(true); 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 22302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(web_contents); 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver* observer( 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new content::DownloadTestObserverTerminal( 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManagerForBrowser(browser()), 1, 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DownloadUrlParameters> params( 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadUrlParameters::FromWebContents(web_contents, url)); 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->set_prompt(true); 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManagerForBrowser(browser())->DownloadUrl(params.Pass()); 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownloadStates(1, DownloadItem::COMPLETE); 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidShowFileChooser()); 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check state. 22472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CheckDownload(browser(), file, file)); 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadUrlToPath) { 22532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 22572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(web_contents); 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir other_directory; 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(other_directory.CreateUniqueTempDir()); 22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath target_file_full_path 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) = other_directory.path().Append(file.BaseName()); 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver* observer(CreateWaiter(browser(), 1)); 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DownloadUrlParameters> params( 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadUrlParameters::FromWebContents(web_contents, url)); 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->set_file_path(target_file_full_path); 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManagerForBrowser(browser())->DownloadUrl(params.Pass()); 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check state. 22732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CheckDownloadFullPaths(browser(), 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_file_full_path, 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OriginFile(file))); 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Temporary are treated as auto-opened, and after that open won't be 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // visible; wait for auto-open and confirm not visible. 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<DownloadItem*> downloads; 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManagerForBrowser(browser())->GetAllDownloads(&downloads); 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, downloads.size()); 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadUpdatedObserver( 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloads[0], base::Bind(&WasAutoOpened)).WaitForEvent(); 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, SavePageNonHTMLViaGet) { 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do initial setup. 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnableFileChooser(true); 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<DownloadItem*> download_items; 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDownloads(browser(), &download_items); 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(download_items.empty()); 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to a non-HTML resource. The resource also has 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cache-Control: no-cache set, which normally requires revalidation 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // each time. 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL("files/downloads/image.jpg"); 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(url.is_valid()); 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stop the test server, and then try to save the page. If cache validation 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is not bypassed then this will fail since the server is no longer 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reachable. 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server()->Stop()); 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> waiter( 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new content::DownloadTestObserverTerminal( 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManagerForBrowser(browser()), 1, 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::SavePage(browser()); 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiter->WaitForFinished(); 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, waiter->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownloadStates(1, DownloadItem::COMPLETE); 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Validate that the correct file was downloaded. 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDownloads(browser(), &download_items); 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidShowFileChooser()); 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, download_items.size()); 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(url, download_items[0]->GetOriginalUrl()); 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to download it via a context menu. 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> waiter_context_menu( 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new content::DownloadTestObserverTerminal( 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManagerForBrowser(browser()), 1, 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ContextMenuParams context_menu_params; 2328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) context_menu_params.media_type = blink::WebContextMenuData::MediaTypeImage; 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_menu_params.src_url = url; 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_menu_params.page_url = url; 23312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestRenderViewContextMenu menu( 23325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame(), 23332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context_menu_params); 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu.Init(); 23352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) menu.ExecuteCommand(IDC_CONTENT_CONTEXT_SAVEIMAGEAS, 0); 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiter_context_menu->WaitForFinished(); 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1u, waiter_context_menu->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownloadStates(2, DownloadItem::COMPLETE); 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Validate that the correct file was downloaded via the context menu. 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_items.clear(); 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDownloads(browser(), &download_items); 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidShowFileChooser()); 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, download_items.size()); 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(url, download_items[0]->GetOriginalUrl()); 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(url, download_items[1]->GetOriginalUrl()); 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, SavePageNonHTMLViaPost) { 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do initial setup. 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnableFileChooser(true); 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<DownloadItem*> download_items; 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDownloads(browser(), &download_items); 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(download_items.empty()); 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to a form page. 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL form_url = test_server()->GetURL( 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/downloads/form_page_to_post.html"); 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(form_url.is_valid()); 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), form_url); 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Submit the form. This will send a POST reqeuest, and the response is a 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // JPEG image. The resource also has Cache-Control: no-cache set, 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which normally requires revalidation each time. 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL jpeg_url = test_server()->GetURL("files/post/downloads/image.jpg"); 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(jpeg_url.is_valid()); 23692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 23702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(web_contents != NULL); 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver observer( 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_NAV_ENTRY_COMMITTED, 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<content::NavigationController>( 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_contents->GetController())); 2376a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::RenderFrameHost* render_frame_host = web_contents->GetMainFrame(); 2377a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(render_frame_host != NULL); 2378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_frame_host->ExecuteJavaScript(base::ASCIIToUTF16("SubmitForm()")); 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(jpeg_url, web_contents->GetURL()); 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stop the test server, and then try to save the page. If cache validation 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is not bypassed then this will fail since the server is no longer 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reachable. This will also fail if it tries to be retrieved via "GET" 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rather than "POST". 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server()->Stop()); 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> waiter( 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new content::DownloadTestObserverTerminal( 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManagerForBrowser(browser()), 1, 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::SavePage(browser()); 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiter->WaitForFinished(); 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, waiter->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownloadStates(1, DownloadItem::COMPLETE); 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Validate that the correct file was downloaded. 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDownloads(browser(), &download_items); 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidShowFileChooser()); 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, download_items.size()); 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(jpeg_url, download_items[0]->GetOriginalUrl()); 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to download it via a context menu. 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> waiter_context_menu( 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new content::DownloadTestObserverTerminal( 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManagerForBrowser(browser()), 1, 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ContextMenuParams context_menu_params; 2408f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) context_menu_params.media_type = blink::WebContextMenuData::MediaTypeImage; 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_menu_params.src_url = jpeg_url; 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_menu_params.page_url = jpeg_url; 24115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestRenderViewContextMenu menu(web_contents->GetMainFrame(), 24125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context_menu_params); 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu.Init(); 24142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) menu.ExecuteCommand(IDC_CONTENT_CONTEXT_SAVEIMAGEAS, 0); 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiter_context_menu->WaitForFinished(); 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1u, waiter_context_menu->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownloadStates(2, DownloadItem::COMPLETE); 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Validate that the correct file was downloaded via the context menu. 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_items.clear(); 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDownloads(browser(), &download_items); 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidShowFileChooser()); 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, download_items.size()); 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(jpeg_url, download_items[0]->GetOriginalUrl()); 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(jpeg_url, download_items[1]->GetOriginalUrl()); 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsServer) { 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadInfo download_info[] = { 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Normal navigated download. 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a_zip_file.zip", 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_NAVIGATE, 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_NONE, 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Normal direct download. 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a_zip_file.zip", 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_DIRECT, 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_NONE, 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Direct download with 404 error. 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "there_IS_no_spoon.zip", 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_DIRECT, 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Navigated download with 404 error. 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "there_IS_no_spoon.zip", 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_NAVIGATE, 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Direct download with 400 error. 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "zip_file_not_found.zip", 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_DIRECT, 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Navigated download with 400 error. 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "zip_file_not_found.zip", 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_NAVIGATE, 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadFilesCheckErrors(ARRAYSIZE_UNSAFE(download_info), download_info); 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsFile) { 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileErrorInjectInfo error_info[] = { 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Navigated download with injected "Disk full" error in Initialize(). 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "a_zip_file.zip", 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_NAVIGATE, 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Direct download with injected "Disk full" error in Initialize(). 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "a_zip_file.zip", 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_DIRECT, 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Navigated download with injected "Disk full" error in Write(). 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "a_zip_file.zip", 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_NAVIGATE, 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestFileErrorInjector::FILE_OPERATION_WRITE, 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Direct download with injected "Disk full" error in Write(). 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "a_zip_file.zip", 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_DIRECT, 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestFileErrorInjector::FILE_OPERATION_WRITE, 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Navigated download with injected "Failed" error in Initialize(). 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "a_zip_file.zip", 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_NAVIGATE, 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Direct download with injected "Failed" error in Initialize(). 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "a_zip_file.zip", 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_DIRECT, 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Navigated download with injected "Failed" error in Write(). 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "a_zip_file.zip", 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_NAVIGATE, 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestFileErrorInjector::FILE_OPERATION_WRITE, 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Direct download with injected "Failed" error in Write(). 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "a_zip_file.zip", 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_DIRECT, 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestFileErrorInjector::FILE_OPERATION_WRITE, 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Navigated download with injected "Name too long" error in 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize(). 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "a_zip_file.zip", 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_NAVIGATE, 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG, 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG, 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Direct download with injected "Name too long" error in Initialize(). 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "a_zip_file.zip", 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_DIRECT, 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG, 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG, 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Navigated download with injected "Name too long" error in Write(). 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "a_zip_file.zip", 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_NAVIGATE, 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestFileErrorInjector::FILE_OPERATION_WRITE, 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Direct download with injected "Name too long" error in Write(). 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "a_zip_file.zip", 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_DIRECT, 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestFileErrorInjector::FILE_OPERATION_WRITE, 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Direct download with injected "Disk full" error in 2nd Write(). 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "06bESSE21Evolution.ppt", 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_DIRECT, 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestFileErrorInjector::FILE_OPERATION_WRITE, 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadInsertFilesErrorCheckErrors(ARRAYSIZE_UNSAFE(error_info), error_info); 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorReadonlyFolder) { 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadInfo download_info[] = { 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a_zip_file.zip", 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_DIRECT, 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This passes because we switch to the My Documents folder. 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_NONE, 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a_zip_file.zip", 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_NAVIGATE, 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This passes because we switch to the My Documents folder. 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DOWNLOAD_INTERRUPT_REASON_NONE, 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadFilesToReadonlyFolder(ARRAYSIZE_UNSAFE(download_info), download_info); 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we show a dangerous downloads warning for a dangerous file 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// downloaded through a blob: URL. 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadDangerousBlobData) { 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Windows, if SafeBrowsing is enabled, certain file types (.exe, .cab, 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // .msi) will be handled by the DownloadProtectionService. However, if the URL 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is non-standard (e.g. blob:) then those files won't be handled by the 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DPS. We should be showing the dangerous download warning for any file 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // considered dangerous and isn't handled by the DPS. 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFilename[] = "foo.exe"; 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 26892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kFilename[] = "foo.swf"; 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string path("files/downloads/download-dangerous-blob.html?filename="); 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path += kFilename; 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Need to use http urls because the blob js doesn't work on file urls for 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // security reasons. 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server()->GetURL(path)); 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver* observer(DangerousDownloadWaiter( 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), 1, 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_ACCEPT)); 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, observer->NumDangerousDownloadsSeen()); 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, LoadURLExternallyReferrerPolicy) { 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do initial setup. 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnableFileChooser(true); 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<DownloadItem*> download_items; 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDownloads(browser(), &download_items); 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(download_items.empty()); 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to a page with a referrer policy and a link on it. The link points 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to testserver's /echoheader. 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL("files/downloads/referrer_policy.html"); 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(url.is_valid()); 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> waiter( 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new content::DownloadTestObserverTerminal( 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManagerForBrowser(browser()), 1, 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Click on the link with the alt key pressed. This will download the link 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // target. 27312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 2732f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMouseEvent mouse_event; 2733f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mouse_event.type = blink::WebInputEvent::MouseDown; 2734f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mouse_event.button = blink::WebMouseEvent::ButtonLeft; 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.x = 15; 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.y = 15; 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.clickCount = 1; 2738f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mouse_event.modifiers = blink::WebInputEvent::AltKey; 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event); 2740f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mouse_event.type = blink::WebInputEvent::MouseUp; 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event); 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiter->WaitForFinished(); 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, waiter->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckDownloadStates(1, DownloadItem::COMPLETE); 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Validate that the correct file was downloaded. 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDownloads(browser(), &download_items); 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, download_items.size()); 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(test_server()->GetURL("echoheader?Referer"), 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_items[0]->GetOriginalUrl()); 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the file contains the expected referrer. 2754b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::FilePath file(download_items[0]->GetTargetFilePath()); 2755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string expected_contents = test_server()->GetURL(std::string()).spec(); 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(VerifyFile(file, expected_contents, expected_contents.length())); 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// This test ensures that the Referer header is properly sanitized when 27605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Save Link As is chosen from the context menu. 27615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, SaveLinkAsReferrerPolicyOrigin) { 27625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Do initial setup. 27635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 27645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::SpawnedTestServer ssl_test_server( 27655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 27665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 27675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data/referrer_policy"))); 27685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(ssl_test_server.Start()); 27695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EnableFileChooser(true); 27705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::vector<DownloadItem*> download_items; 27715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDownloads(browser(), &download_items); 27725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(download_items.empty()); 27735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 27745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Navigate to the initial page, where Save Link As will be executed. 27755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL url = ssl_test_server.GetURL( 27765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string("files/referrer-policy-start.html?policy=origin") + 27775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "&port=" + base::IntToString(test_server()->host_port_pair().port()) + 27785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "&ssl_port=" + 27795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::IntToString(ssl_test_server.host_port_pair().port()) + 27805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "&redirect=echoheader&link=true&target="); 27815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(url.is_valid()); 27825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 27835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 27845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<content::DownloadTestObserver> waiter( 27855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new content::DownloadTestObserverTerminal( 27865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DownloadManagerForBrowser(browser()), 1, 27875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); 27885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 27895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Right-click on the link and choose Save Link As. This will download the 27905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // link target. 27915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ContextMenuNotificationObserver context_menu_observer( 27925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) IDC_CONTENT_CONTEXT_SAVELINKAS); 27935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 27945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 27955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) blink::WebMouseEvent mouse_event; 27965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mouse_event.type = blink::WebInputEvent::MouseDown; 27975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mouse_event.button = blink::WebMouseEvent::ButtonRight; 27985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mouse_event.x = 15; 27995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mouse_event.y = 15; 28005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mouse_event.clickCount = 1; 28015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event); 28025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mouse_event.type = blink::WebInputEvent::MouseUp; 28035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event); 28045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 28055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) waiter->WaitForFinished(); 28065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1u, waiter->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 28075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CheckDownloadStates(1, DownloadItem::COMPLETE); 28085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 28095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Validate that the correct file was downloaded. 28105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDownloads(browser(), &download_items); 28115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1u, download_items.size()); 28125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(test_server()->GetURL("echoheader?Referer"), 28135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) download_items[0]->GetOriginalUrl()); 28145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 28155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Check that the file contains the expected referrer. 28165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath file(download_items[0]->GetTargetFilePath()); 28175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string expected_contents = ssl_test_server.GetURL(std::string()).spec(); 28185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(VerifyFile(file, expected_contents, expected_contents.length())); 28195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 28205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 28215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// This test ensures that the Referer header is properly sanitized when 28225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Save Image As is chosen from the context menu. The test succeeds if 28235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// it doesn't crash. 28245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, SaveImageAsReferrerPolicyDefault) { 28255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Do initial setup. 28265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 28275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::SpawnedTestServer ssl_test_server( 28285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 28295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 28305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data/"))); 28315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(ssl_test_server.Start()); 28325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EnableFileChooser(true); 28335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::vector<DownloadItem*> download_items; 28345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDownloads(browser(), &download_items); 28355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(download_items.empty()); 28365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 28375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL url = ssl_test_server.GetURL("files/title1.html"); 28385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL img_url = test_server()->GetURL("files/downloads/image.jpg"); 28395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(url.is_valid()); 28405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 28415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 28425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Try to download an image via a context menu. 28435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<content::DownloadTestObserver> waiter_context_menu( 28445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new content::DownloadTestObserverTerminal( 28455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DownloadManagerForBrowser(browser()), 1, 28465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); 28475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::ContextMenuParams context_menu_params; 28485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) context_menu_params.media_type = blink::WebContextMenuData::MediaTypeImage; 28495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) context_menu_params.page_url = url; 28505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) context_menu_params.src_url = img_url; 28515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestRenderViewContextMenu menu( 28525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame(), 28535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) context_menu_params); 28545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) menu.Init(); 28555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) menu.ExecuteCommand(IDC_CONTENT_CONTEXT_SAVEIMAGEAS, 0); 28565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) waiter_context_menu->WaitForFinished(); 28575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ( 28585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1u, waiter_context_menu->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 28595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CheckDownloadStates(1, DownloadItem::COMPLETE); 28605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 28615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Validate that the correct file was downloaded via the context menu. 28625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) download_items.clear(); 28635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDownloads(browser(), &download_items); 28645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(DidShowFileChooser()); 28655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1u, download_items.size()); 28665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(img_url, download_items[0]->GetOriginalUrl()); 28675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 28685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, HiddenDownload) { 28702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 287390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DownloadManager* download_manager = DownloadManagerForBrowser(browser()); 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new content::DownloadTestObserverTerminal( 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_manager, 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Download and set IsHiddenDownload to true. 28812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 28822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DownloadUrlParameters> params( 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadUrlParameters::FromWebContents(web_contents, url)); 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->set_callback(base::Bind(&SetHiddenDownloadCallback)); 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_manager->DownloadUrl(params.Pass()); 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->WaitForFinished(); 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that download shelf is not shown. 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify the multiple downloads infobar. 28942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, TestMultipleDownloadsInfobar) { 2895ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH) 2896ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Disable this test in Metro+Ash for now (http://crbug.com/262796). 2897a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 2898ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 2899ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 2900ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 29012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 29022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a downloads observer. 29042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<content::DownloadTestObserver> downloads_observer( 29052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateWaiter(browser(), 2)); 29062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create an infobar observer. 29082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WindowedNotificationObserver infobar_added_1( 29092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_ADDED, 29102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NotificationService::AllSources()); 29112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::NavigateToURL( 29122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser(), 29132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_server()->GetURL("files/downloads/download-a_zip_file.html")); 29142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) infobar_added_1.Wait(); 29152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InfoBarService* infobar_service = InfoBarService::FromWebContents( 29172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()); 29182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that there is only one infobar. 2919a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_EQ(1u, infobar_service->infobar_count()); 29202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get the infobar at index 0. 29220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBar* infobar = infobar_service->infobar_at(0); 2923a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConfirmInfoBarDelegate* confirm_infobar = 2924a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) infobar->delegate()->AsConfirmInfoBarDelegate(); 2925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(confirm_infobar != NULL); 29262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify multi download warning infobar message. 29282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(confirm_infobar->GetMessageText(), 29292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_MULTI_DOWNLOAD_WARNING)); 29302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Click on the "Allow" button to allow multiple downloads. 29322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (confirm_infobar->Accept()) 2933a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch infobar_service->RemoveInfoBar(infobar); 29342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that there are no more infobars. 2935a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0u, infobar_service->infobar_count()); 29362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Waits for the download to complete. 29382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downloads_observer->WaitForFinished(); 29392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, downloads_observer->NumDownloadsSeenInState( 29402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem::COMPLETE)); 29412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadTest_Renaming) { 29442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 29452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url(test_server()->GetURL("files/downloads/a_zip_file.zip")); 29462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DownloadManager* manager = DownloadManagerForBrowser(browser()); 29472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath origin_file(OriginFile(base::FilePath(FILE_PATH_LITERAL( 29482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "downloads/a_zip_file.zip")))); 29497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(origin_file)); 29502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string origin_contents; 295158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(base::ReadFileToString(origin_file, &origin_contents)); 29522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Download the same url several times and expect that all downloaded files 29542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // after the zero-th contain a deduplication counter. 29552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int index = 0; index < 5; ++index) { 29562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadAndWait(browser(), url); 29572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 29587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::DownloadItem* item = manager->GetDownload( 29597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::DownloadItem::kInvalidId + 1 + index); 29602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(item); 296190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(DownloadItem::COMPLETE, item->GetState()); 2962b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::FilePath target_path(item->GetTargetFilePath()); 29632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(std::string("a_zip_file") + 29642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (index == 0 ? std::string(".zip") : 29652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf(" (%d).zip", index)), 2966b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) target_path.BaseName().AsUTF8Unsafe()); 29677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(target_path)); 2968b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_TRUE(VerifyFile(target_path, origin_contents, 2969b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) origin_contents.size())); 29702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that the entire download pipeline handles unicode correctly. 29742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadTest_CrazyFilenames) { 29752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const wchar_t* kCrazyFilenames[] = { 29762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"a_file_name.zip", 29772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"\u89c6\u9891\u76f4\u64ad\u56fe\u7247.zip", // chinese chars 29782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"\u0412\u043e \u0424\u043b\u043e\u0440\u0438\u0434\u0435\u043e\u0431\u044a" 29792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"\u044f\u0432\u043b\u0435\u043d\u0440\u0435\u0436\u0438\u043c \u0427" 29802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"\u041f \u0438\u0437-\u0437\u0430 \u0443\u0442\u0435\u0447\u043a\u0438 " 29812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"\u043d\u0435\u0444\u0442\u0438.zip", // russian 29822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"Desocupa\xe7\xe3o est\xe1vel.zip", 29832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // arabic: 29842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"\u0638\u2026\u0638\u02c6\u0637\xa7\u0638\u201a\u0637\xb9 \u0638\u201e" 29852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"\u0638\u201e\u0637\xb2\u0638\u0679\u0637\xa7\u0637\xb1\u0637\xa9.zip", 29862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"\u05d4\u05e2\u05d3\u05e4\u05d5\u05ea.zip", // hebrew 29872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"\u092d\u093e\u0930\u0924.zip", // hindi 29882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"d\xe9stabilis\xe9.zip", // french 29892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // korean 29902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"\u97d3-\u4e2d \uc815\uc0c1, \ucc9c\uc548\ud568 \uc758\uacac.zip", 29912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"jiho....tiho...miho.zip", 29922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"jiho!@#$tiho$%^&-()_+=miho copy.zip", // special chars 29932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"Wohoo-to hoo+I.zip", 29942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"Picture 1.zip", 29952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"This is a very very long english sentence with spaces and , and +.zip", 29962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 29972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<DownloadItem*> download_items; 29992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath origin(FILE_PATH_LITERAL("origin")); 3000a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(DestinationFile(browser(), origin))); 30012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t index = 0; index < arraysize(kCrazyFilenames); ++index) { 3003a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 crazy16; 30042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string crazy8; 30052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const wchar_t* crazy_w = kCrazyFilenames[index]; 30065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(base::WideToUTF8(crazy_w, wcslen(crazy_w), &crazy8)); 30075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(base::WideToUTF16(crazy_w, wcslen(crazy_w), &crazy16)); 30082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path(DestinationFile(browser(), origin.Append( 30092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 30102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) crazy16 30112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_POSIX) 30122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) crazy8 30132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 30142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ))); 30152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create the file. 30172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(static_cast<int>(crazy8.size()), 3018e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch base::WriteFile(file_path, crazy8.c_str(), crazy8.size())); 30192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL file_url(net::FilePathToFileURL(file_path)); 30202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Download the file and check that the filename is correct. 30222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadAndWait(browser(), file_url); 30232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 30242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDownloads(browser(), &download_items); 30252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1UL, download_items.size()); 3026b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::FilePath downloaded(download_items[0]->GetTargetFilePath()); 30272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_items[0]->Remove(); 30282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_items.clear(); 30292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(CheckDownloadFullPaths( 30302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser(), 30312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downloaded, 30322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_path)); 30332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 30342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadTest_Remove) { 30372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 30382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url(test_server()->GetURL("files/downloads/a_zip_file.zip")); 30392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<DownloadItem*> download_items; 30402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDownloads(browser(), &download_items); 30412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(download_items.empty()); 30422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Download a file. 30442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadAndWaitWithDisposition(browser(), 30452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url, 30462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CURRENT_TAB, 30472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 30482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 30492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDownloads(browser(), &download_items); 30502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1UL, download_items.size()); 3051b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::FilePath downloaded(download_items[0]->GetTargetFilePath()); 30522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Remove the DownloadItem but not the file, then check that the file still 30542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // exists. 30552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_items[0]->Remove(); 30562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_items.clear(); 30572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDownloads(browser(), &download_items); 30582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(0UL, download_items.size()); 30592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(CheckDownloadFullPaths( 30602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser(), downloaded, OriginFile(base::FilePath( 30612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FILE_PATH_LITERAL("downloads/a_zip_file.zip"))))); 30622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadTest_PauseResumeCancel) { 30662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* download_item = CreateSlowTestDownload(); 30672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(download_item); 30682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(download_item->GetTargetFilePath().empty()); 30692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(download_item->IsPaused()); 307090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_NE(DownloadItem::CANCELLED, download_item->GetState()); 30712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_item->Pause(); 30722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(download_item->IsPaused()); 30732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_item->Resume(); 30742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(download_item->IsPaused()); 307590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_NE(DownloadItem::CANCELLED, download_item->GetState()); 30762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_item->Cancel(true); 307790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(DownloadItem::CANCELLED, download_item->GetState()); 30782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The Mac downloaded files quarantine feature is implemented by the 30812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Contents/Info.plist file in cocoa apps. browser_tests cannot test 30822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// quarantining files on Mac because it is not a cocoa app. 30832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(benjhayden) test the equivalents on other platforms. 30842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3085b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) 3086b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Timing out on ARM linux: http://crbug.com/238459 3087b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#define MAYBE_DownloadTest_PercentComplete DISABLED_DownloadTest_PercentComplete 3088b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#elif defined(OS_MACOSX) 3089b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Disable on mac: http://crbug.com/238831 3090b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#define MAYBE_DownloadTest_PercentComplete DISABLED_DownloadTest_PercentComplete 3091b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#else 3092b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#define MAYBE_DownloadTest_PercentComplete DownloadTest_PercentComplete 3093b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif 3094b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, MAYBE_DownloadTest_PercentComplete) { 30952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Write a huge file. 30962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path(DestinationFile( 30972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser(), base::FilePath(FILE_PATH_LITERAL("DownloadTest_BigZip.zip")))); 3098e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch base::File file(file_path, base::File::FLAG_CREATE | base::File::FLAG_WRITE); 3099e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ASSERT_TRUE(file.IsValid()); 3100e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch int64 size = 1 << 25; 3101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_EQ(1, file.Write(size, "a", 1)); 3102e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch file.Close(); 3103e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 31042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_POSIX) 31052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make it readable by chronos on chromeos 3106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::SetPosixFilePermissions(file_path, 0755); 31072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 31082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure that we have enough disk space. 31102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 free_space = base::SysInfo::AmountOfFreeDiskSpace( 31112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDownloadDirectory(browser())); 31122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_LE(size, free_space) << "Not enough disk space to download. Got " 31132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << free_space; 31142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL file_url(net::FilePathToFileURL(file_path)); 31152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<content::DownloadTestObserver> progress_waiter( 31162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateInProgressWaiter(browser(), 1)); 31172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading a file, wait for it to be created. 31192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 31202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser(), file_url, CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE); 31212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) progress_waiter->WaitForFinished(); 31222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, progress_waiter->NumDownloadsSeenInState( 31232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem::IN_PROGRESS)); 31242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<DownloadItem*> download_items; 31252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDownloads(browser(), &download_items); 31262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1UL, download_items.size()); 31272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for the download to complete, checking along the way that the 31292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PercentComplete() never regresses. 31302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PercentWaiter waiter(download_items[0]); 31312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(waiter.WaitForFinished()); 31322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(DownloadItem::COMPLETE, download_items[0]->GetState()); 31332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(100, download_items[0]->PercentComplete()); 31342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 31352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check that the file downloaded correctly. 31377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(download_items[0]->GetTargetFilePath())); 31382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 downloaded_size = 0; 3139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::GetFileSize( 3140b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) download_items[0]->GetTargetFilePath(), &downloaded_size)); 31412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(size + 1, downloaded_size); 3142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(base::DieFileDie(file_path, false)); 3143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(base::DieFileDie(download_items[0]->GetTargetFilePath(), false)); 31442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadTest_DenyDanger) { 31472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 31482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url(test_server()->GetURL("files/downloads/dangerous/dangerous.crx")); 31492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<content::DownloadTestObserver> observer( 31502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DangerousDownloadWaiter( 31512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser(), 1, 31522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_DENY)); 31532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 31542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer->WaitForFinished(); 31552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::CANCELLED)); 31562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, observer->NumDangerousDownloadsSeen()); 31572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); 31582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadPrefs_SaveFilePath) { 3161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DownloadPrefs* on_prefs = DownloadServiceFactory::GetForBrowserContext( 3162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) browser()->profile())->GetDownloadManagerDelegate()->download_prefs(); 3163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DownloadPrefs* off_prefs = DownloadServiceFactory::GetForBrowserContext( 3164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) browser()->profile()->GetOffTheRecordProfile()) 3165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ->GetDownloadManagerDelegate()->download_prefs(); 3166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath dir(on_prefs->SaveFilePath()); 3167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(dir.value(), off_prefs->SaveFilePath().value()); 3168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) on_prefs->SetSaveFilePath(dir.AppendASCII("on")); 3170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(dir.AppendASCII("on").value(), on_prefs->SaveFilePath().value()); 3171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(dir.AppendASCII("on").value(), off_prefs->SaveFilePath().value()); 3172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) on_prefs->SetSaveFilePath(dir); 3174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(dir.value(), on_prefs->SaveFilePath().value()); 3175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(dir.value(), off_prefs->SaveFilePath().value()); 3176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) off_prefs->SetSaveFilePath(dir.AppendASCII("off")); 3178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(dir.value(), on_prefs->SaveFilePath().value()); 3179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(dir.AppendASCII("off").value(), off_prefs->SaveFilePath().value()); 3180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) on_prefs->SetSaveFilePath(dir.AppendASCII("on")); 3182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(dir.AppendASCII("on").value(), on_prefs->SaveFilePath().value()); 3183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(dir.AppendASCII("off").value(), off_prefs->SaveFilePath().value()); 3184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 31857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// A download that is interrupted due to a file error should be able to be 31877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// resumed. 31887dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(DownloadTest, Resumption_NoPrompt) { 31897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CommandLine::ForCurrentProcess()->AppendSwitch( 31907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switches::kEnableDownloadResumption); 31917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<content::TestFileErrorInjector> error_injector( 31927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::TestFileErrorInjector::Create( 31937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DownloadManagerForBrowser(browser()))); 31947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<content::DownloadTestObserver> completion_observer( 31957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CreateWaiter(browser(), 1)); 31967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EnableFileChooser(true); 31977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 31987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DownloadItem* download = StartMockDownloadAndInjectError( 31991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci error_injector.get(), content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); 32007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(download); 32017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch download->Resume(); 32037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch completion_observer->WaitForFinished(); 32047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ( 32067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1u, completion_observer->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 32077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(DidShowFileChooser()); 32087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 32097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// A download that's interrupted due to a reason that indicates that the target 32117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// path is invalid or unusable should cause a prompt to be displayed on 32127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// resumption. 32137dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(DownloadTest, Resumption_WithPrompt) { 32147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CommandLine::ForCurrentProcess()->AppendSwitch( 32157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switches::kEnableDownloadResumption); 32167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<content::TestFileErrorInjector> error_injector( 32177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::TestFileErrorInjector::Create( 32187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DownloadManagerForBrowser(browser()))); 32197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<content::DownloadTestObserver> completion_observer( 32207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CreateWaiter(browser(), 1)); 32217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EnableFileChooser(true); 32227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DownloadItem* download = StartMockDownloadAndInjectError( 32241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci error_injector.get(), content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE); 32257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(download); 32267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch download->Resume(); 32287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch completion_observer->WaitForFinished(); 32297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ( 32317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1u, completion_observer->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 32327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(DidShowFileChooser()); 32337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 32347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// The user shouldn't be prompted on a resumed download unless a prompt is 32367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// necessary due to the interrupt reason. 32377dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(DownloadTest, Resumption_WithPromptAlways) { 32387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CommandLine::ForCurrentProcess()->AppendSwitch( 32397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switches::kEnableDownloadResumption); 32407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch browser()->profile()->GetPrefs()->SetBoolean( 32417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch prefs::kPromptForDownload, true); 32427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<content::TestFileErrorInjector> error_injector( 32437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::TestFileErrorInjector::Create( 32447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DownloadManagerForBrowser(browser()))); 32457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<content::DownloadTestObserver> completion_observer( 32467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CreateWaiter(browser(), 1)); 32477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EnableFileChooser(true); 32487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DownloadItem* download = StartMockDownloadAndInjectError( 32501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci error_injector.get(), content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); 32517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(download); 32527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Prompts the user initially because of the kPromptForDownload preference. 32547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(DidShowFileChooser()); 32557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch download->Resume(); 32577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch completion_observer->WaitForFinished(); 32587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ( 32607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1u, completion_observer->NumDownloadsSeenInState(DownloadItem::COMPLETE)); 32617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Shouldn't prompt for resumption. 32627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(DidShowFileChooser()); 32637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 32647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// A download that is interrupted due to a transient error should be resumed 32667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// automatically. 32677dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(DownloadTest, Resumption_Automatic) { 32687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CommandLine::ForCurrentProcess()->AppendSwitch( 32697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switches::kEnableDownloadResumption); 32707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<content::TestFileErrorInjector> error_injector( 32717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::TestFileErrorInjector::Create( 32727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DownloadManagerForBrowser(browser()))); 32737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DownloadItem* download = StartMockDownloadAndInjectError( 32751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci error_injector.get(), 32767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR); 32777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(download); 32787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The number of times this the download is resumed automatically is defined 32807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // in DownloadItemImpl::kMaxAutoResumeAttempts. The number of DownloadFiles 32817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // created should be that number + 1 (for the original download request). We 32827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // only care that it is greater than 1. 32837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_GT(1u, error_injector->TotalFileCount()); 32847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 32857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// An interrupting download should be resumable multiple times. 32877dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(DownloadTest, Resumption_MultipleAttempts) { 32887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CommandLine::ForCurrentProcess()->AppendSwitch( 32897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switches::kEnableDownloadResumption); 32907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<content::TestFileErrorInjector> error_injector( 32917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::TestFileErrorInjector::Create( 32927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DownloadManagerForBrowser(browser()))); 32937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<DownloadTestObserverNotInProgress> completion_observer( 32947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch new DownloadTestObserverNotInProgress( 32957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DownloadManagerForBrowser(browser()), 1)); 32967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Wait for two transitions to a resumable state 32977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<content::DownloadTestObserver> resumable_observer( 32987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch new DownloadTestObserverResumable( 32997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DownloadManagerForBrowser(browser()), 2)); 33007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EnableFileChooser(true); 33027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DownloadItem* download = StartMockDownloadAndInjectError( 33031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci error_injector.get(), content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); 33047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(download); 33057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::TestFileErrorInjector::FileErrorInfo error_info; 33077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_info.url = download->GetOriginalUrl().spec(); 33087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_info.code = content::TestFileErrorInjector::FILE_OPERATION_WRITE; 33097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_info.operation_instance = 0; 33107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_info.error = content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED; 33117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_injector->AddError(error_info); 33127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_injector->InjectErrors(); 33137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Resuming should cause the download to be interrupted again due to the 33157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // errors we are injecting. 33167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch download->Resume(); 33177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch resumable_observer->WaitForFinished(); 33187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_EQ(DownloadItem::INTERRUPTED, download->GetState()); 33197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_EQ(content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 33207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch download->GetLastReason()); 33217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_injector->ClearErrors(); 33237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_injector->InjectErrors(); 33247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // No errors this time. The download should complete successfully. 33267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(completion_observer->IsFinished()); 33277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch completion_observer->StartObserving(); 33287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch download->Resume(); 33297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch completion_observer->WaitForFinished(); 33307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(DownloadItem::COMPLETE, download->GetState()); 33317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(DidShowFileChooser()); 33337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 3334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// The file empty.bin is served with a MIME type of application/octet-stream. 3336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// The content body is empty. Make sure this case is handled properly and we 3337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// don't regress on http://crbug.com/320394. 3338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadTest_GZipWithNoContent) { 3339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 3340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL url(test_server()->GetURL("files/downloads/empty.bin")); 3341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Downloading the same URL twice causes the second request to be served from 3342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // cached (with a high probability). This test verifies that that doesn't 3343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // happen regardless of whether the request is served via the cache or from 3344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // the network. 3345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DownloadAndWait(browser(), url); 3346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DownloadAndWait(browser(), url); 3347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3348f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3349f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 33501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 33511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The following two tests are only meaningful on OS_WIN since that's the only 33521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// platform where client download checks are currently performed. 33531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// TODO(asanka): Relax this restriction as other platforms are added. 33541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_WIN) 33551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace { 33561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 33571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This is a custom DownloadTestObserver for 33581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// DangerousFileWithSBDisabledBeforeCompletion test that disables the 33591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// SafeBrowsing service when a single download is IN_PROGRESS and has a target 33601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// path assigned. DownloadItemImpl is expected to call MaybeCompleteDownload 33611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// soon afterwards and we want to disable the service before then. 33621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass DisableSafeBrowsingOnInProgressDownload 33631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : public content::DownloadTestObserver { 33641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 33651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci explicit DisableSafeBrowsingOnInProgressDownload(Browser* browser) 33661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : DownloadTestObserver(DownloadManagerForBrowser(browser), 33671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1, 33681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ON_DANGEROUS_DOWNLOAD_QUIT), 33691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser_(browser), 33701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci final_state_seen_(false) { 33711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Init(); 33721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 33731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~DisableSafeBrowsingOnInProgressDownload() {} 33741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 33751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool IsDownloadInFinalState(DownloadItem* download) OVERRIDE { 33761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (download->GetState() != DownloadItem::IN_PROGRESS || 33771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci download->GetTargetFilePath().empty()) 33781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 33791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 33801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (final_state_seen_) 33811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 33821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 33831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci final_state_seen_ = true; 33841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser_->profile()->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnabled, 33851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false); 33861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT, 33871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci download->GetDangerType()); 33881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(download->IsDangerous()); 33891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(DownloadItemModel(download).IsDangerousFileBasedOnType()); 33901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 33911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 33921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 33931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 33941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Browser* browser_; 33951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool final_state_seen_; 33961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 33971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 33981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace 33991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 34001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(DownloadTest, 34011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DangerousFileWithSBDisabledBeforeCompletion) { 34021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser()->profile()->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnabled, 34031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true); 34041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(test_server()->Start()); 34051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL download_url( 34061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test_server()->GetURL("files/downloads/dangerous/dangerous.exe")); 34071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<content::DownloadTestObserver> dangerous_observer( 34081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DangerousDownloadWaiter( 34091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser(), 34101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1, 34111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_QUIT)); 34121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<content::DownloadTestObserver> in_progress_observer( 34131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new DisableSafeBrowsingOnInProgressDownload(browser())); 34141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui_test_utils::NavigateToURLWithDisposition(browser(), 34151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci download_url, 34161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NEW_BACKGROUND_TAB, 34171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui_test_utils::BROWSER_TEST_NONE); 34181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci in_progress_observer->WaitForFinished(); 34191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 34201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // SafeBrowsing should have been disabled by our observer. 34211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_FALSE(browser()->profile()->GetPrefs()->GetBoolean( 34221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs::kSafeBrowsingEnabled)); 34231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 34241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<DownloadItem*> downloads; 34251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DownloadManagerForBrowser(browser())->GetAllDownloads(&downloads); 34261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_EQ(1u, downloads.size()); 34271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DownloadItem* download = downloads[0]; 34281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 34291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dangerous_observer->WaitForFinished(); 34301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 34311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(download->IsDangerous()); 34321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, 34331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci download->GetDangerType()); 34341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci download->Cancel(true); 34351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 34361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 34371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(DownloadTest, DangerousFileWithSBDisabledBeforeStart) { 34381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Disable SafeBrowsing 34391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser()->profile()->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnabled, 34401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false); 34411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 34421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(test_server()->Start()); 34431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL download_url( 34441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test_server()->GetURL("files/downloads/dangerous/dangerous.exe")); 34451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<content::DownloadTestObserver> dangerous_observer( 34461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DangerousDownloadWaiter( 34471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser(), 34481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1, 34491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_QUIT)); 34501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui_test_utils::NavigateToURLWithDisposition(browser(), 34511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci download_url, 34521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NEW_BACKGROUND_TAB, 34531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui_test_utils::BROWSER_TEST_NONE); 34541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dangerous_observer->WaitForFinished(); 34551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 34561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<DownloadItem*> downloads; 34571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DownloadManagerForBrowser(browser())->GetAllDownloads(&downloads); 34581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_EQ(1u, downloads.size()); 34591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 34601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DownloadItem* download = downloads[0]; 34611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(download->IsDangerous()); 34621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, 34631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci download->GetDangerType()); 34641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 34651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci download->Cancel(true); 34661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 34671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 34681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(DownloadTest, SafeSupportedFile) { 34691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(test_server()->Start()); 34701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL download_url(test_server()->GetURL("files/downloads/a_zip_file.zip")); 34711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DownloadAndWait(browser(), download_url); 34721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 34731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<DownloadItem*> downloads; 34741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DownloadManagerForBrowser(browser())->GetAllDownloads(&downloads); 34751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_EQ(1u, downloads.size()); 34761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 34771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DownloadItem* download = downloads[0]; 34781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(download->IsDangerous()); 34791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT, 34801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci download->GetDangerType()); 34811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 34821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci download->Cancel(true); 34831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 34841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 34851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // OS_WIN 34861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3487f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DownloadTest, FeedbackService) { 3488f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Make a dangerous file. 3489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL("downloads/dangerous/dangerous.swf")); 34901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL download_url(net::URLRequestMockHTTPJob::GetMockUrl(file)); 3491f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<content::DownloadTestObserverInterrupted> observer( 3492f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new content::DownloadTestObserverInterrupted( 3493f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DownloadManagerForBrowser(browser()), 1, 3494f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_QUIT)); 3495f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 3496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) browser(), 3497f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GURL(download_url), 3498f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NEW_BACKGROUND_TAB, 3499f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 3500f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) observer->WaitForFinished(); 3501f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3502f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Get the download from the DownloadManager. 3503f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<DownloadItem*> downloads; 3504f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DownloadManagerForBrowser(browser())->GetAllDownloads(&downloads); 3505f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, downloads.size()); 3506f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(downloads[0]->IsDangerous()); 3507f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3508f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Save fake pings for the download. 3509f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) safe_browsing::ClientDownloadReport fake_metadata; 3510f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) fake_metadata.mutable_download_request()->set_url("http://test"); 3511f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) fake_metadata.mutable_download_request()->set_length(1); 3512f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) fake_metadata.mutable_download_request()->mutable_digests()->set_sha1("hi"); 3513f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) fake_metadata.mutable_download_response()->set_verdict( 3514f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) safe_browsing::ClientDownloadResponse::UNCOMMON); 3515f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string ping_request( 3516f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) fake_metadata.download_request().SerializeAsString()); 3517f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string ping_response( 3518f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) fake_metadata.download_response().SerializeAsString()); 3519f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SafeBrowsingService* sb_service = g_browser_process->safe_browsing_service(); 3520f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) safe_browsing::DownloadProtectionService* download_protection_service = 3521f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) sb_service->download_protection_service(); 3522f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) download_protection_service->feedback_service()->MaybeStorePingsForDownload( 3523f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) safe_browsing::DownloadProtectionService::UNCOMMON, 3524f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) downloads[0], 3525f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ping_request, 3526f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ping_response); 3527f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(safe_browsing::DownloadFeedbackService::IsEnabledForDownload( 3528f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *(downloads[0]))); 3529f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3530f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Begin feedback and check that the file is "stolen". 3531f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) download_protection_service->feedback_service()->BeginFeedbackForDownload( 3532f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) downloads[0]); 3533f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<DownloadItem*> updated_downloads; 3534f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetDownloads(browser(), &updated_downloads); 3535f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(updated_downloads.empty()); 3536f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 3537f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 3538