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