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 "base/bind.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_member.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_file_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/chrome_download_manager_delegate.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_history.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_prefs.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service_factory.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/download/save_package_file_picker.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/download_row.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/url_request_mock_util.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/common/url_constants.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h"
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/test/url_request/url_request_mock_http_job.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserContext;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadItem;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadManager;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing net::URLRequestMockHTTPJob;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Waits for an item record in the downloads database to match |filter|. See
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DownloadStoredProperly() below for an example filter.
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DownloadPersistedObserver : public DownloadHistory::Observer {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::Callback<bool(
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem* item,
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const history::DownloadRow&)> PersistedFilter;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver(Profile* profile, const PersistedFilter& filter)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : profile_(profile),
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      filter_(filter),
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      waiting_(false),
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      persisted_(false) {
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    DownloadServiceFactory::GetForBrowserContext(profile_)->
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetDownloadHistory()->AddObserver(this);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DownloadPersistedObserver() {
72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    DownloadService* service = DownloadServiceFactory::GetForBrowserContext(
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        profile_);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (service && service->GetDownloadHistory())
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      service->GetDownloadHistory()->RemoveObserver(this);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool WaitForPersisted() {
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (persisted_)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    waiting_ = true;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RunMessageLoop();
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    waiting_ = false;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return persisted_;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDownloadStored(DownloadItem* item,
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const history::DownloadRow& info) OVERRIDE {
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    persisted_ = persisted_ || filter_.Run(item, info);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (persisted_ && waiting_)
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Profile* profile_;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PersistedFilter filter_;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool waiting_;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool persisted_;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadPersistedObserver);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Waits for an item record to be removed from the downloads database.
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DownloadRemovedObserver : public DownloadPersistedObserver {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadRemovedObserver(Profile* profile, int32 download_id)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : DownloadPersistedObserver(profile, PersistedFilter()),
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        removed_(false),
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        waiting_(false),
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        download_id_(download_id) {
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DownloadRemovedObserver() {}
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool WaitForRemoved() {
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (removed_)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    waiting_ = true;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RunMessageLoop();
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    waiting_ = false;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return removed_;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDownloadStored(DownloadItem* item,
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const history::DownloadRow& info) OVERRIDE {
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDownloadsRemoved(const DownloadHistory::IdSet& ids) OVERRIDE {
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    removed_ = ids.find(download_id_) != ids.end();
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (removed_ && waiting_)
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool removed_;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool waiting_;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32 download_id_;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadRemovedObserver);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DownloadStoredProperly(
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& expected_url,
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& expected_path,
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 num_files,
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadItem::DownloadState expected_state,
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadItem* item,
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const history::DownloadRow& info) {
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This function may be called multiple times for a given test. Returning
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // false doesn't necessarily mean that the test has failed or will fail, it
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // might just mean that the test hasn't passed yet.
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info.target_path != expected_path) {
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VLOG(20) << __FUNCTION__ << " " << info.target_path.value()
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             << " != " << expected_path.value();
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info.url_chain.size() != 1u) {
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VLOG(20) << __FUNCTION__ << " " << info.url_chain.size()
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             << " != 1";
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info.url_chain[0] != expected_url) {
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VLOG(20) << __FUNCTION__ << " " << info.url_chain[0].spec()
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             << " != " << expected_url.spec();
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((num_files >= 0) && (info.received_bytes != num_files)) {
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VLOG(20) << __FUNCTION__ << " " << num_files
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             << " != " << info.received_bytes;
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info.state != expected_state) {
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VLOG(20) << __FUNCTION__ << " " << info.state
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             << " != " << expected_state;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kTestDir[] = FILE_PATH_LITERAL("save_page");
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstatic const char kAppendedExtension[] = ".html";
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Loosely based on logic in DownloadTestObserver.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadItemCreatedObserver : public DownloadManager::Observer {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit DownloadItemCreatedObserver(DownloadManager* manager)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : waiting_(false), manager_(manager) {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager->AddObserver(this);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DownloadItemCreatedObserver() {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (manager_)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manager_->RemoveObserver(this);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the first download item created after object creation.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that this class provides no protection against the download
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // being destroyed between creation and return of WaitForNewDownloadItem();
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the caller must guarantee that in some other fashion.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForDownloadItem(std::vector<DownloadItem*>* items_seen) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!manager_) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The manager went away before we were asked to wait; return
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // what we have, even if it's null.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *items_seen = items_seen_;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (items_seen_.empty()) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_ = true;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RunMessageLoop();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_ = false;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *items_seen = items_seen_;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DownloadManager::Observer
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadCreated(
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadManager* manager, DownloadItem* item) OVERRIDE {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_EQ(manager, manager_);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    items_seen_.push_back(item);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (waiting_)
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ManagerGoingDown(DownloadManager* manager) OVERRIDE {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->RemoveObserver(this);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_ = NULL;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (waiting_)
23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* manager_;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> items_seen_;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadItemCreatedObserver);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SavePackageFinishedObserver : public content::DownloadManager::Observer {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver(content::DownloadManager* manager,
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const base::Closure& callback)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : download_manager_(manager),
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        callback_(callback) {
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    download_manager_->AddObserver(this);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SavePackageFinishedObserver() {
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (download_manager_)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      download_manager_->RemoveObserver(this);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // DownloadManager::Observer:
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnSavePackageSuccessfullyFinished(
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::DownloadManager* manager, content::DownloadItem* item) OVERRIDE {
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    callback_.Run();
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ManagerGoingDown(content::DownloadManager* manager) OVERRIDE {
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    download_manager_->RemoveObserver(this);
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    download_manager_ = NULL;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::DownloadManager* download_manager_;
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Closure callback_;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SavePackageFinishedObserver);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SavePageBrowserTest : public InProcessBrowserTest {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePageBrowserTest() {}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SavePageBrowserTest();
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_dir_));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(save_dir_.CreateUniqueTempDir());
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InProcessBrowserTest::SetUp();
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser()->profile()->GetPrefs()->SetFilePath(
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs::kDownloadDefaultDirectory, save_dir_.path());
289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    browser()->profile()->GetPrefs()->SetFilePath(
290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        prefs::kSaveFileDefaultDirectory, save_dir_.path());
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL NavigateToMockURL(const std::string& prefix) {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url = URLRequestMockHTTPJob::GetMockUrl(
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::FilePath(kTestDir).AppendASCII(prefix + ".htm"));
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser(), url);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return url;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns full paths of destination file and directory.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetDestinationPaths(const std::string& prefix,
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                base::FilePath* full_file_name,
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                base::FilePath* dir) {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *full_file_name = save_dir_.path().AppendASCII(prefix + ".htm");
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *dir = save_dir_.path().AppendASCII(prefix + "_files");
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* GetCurrentTab(Browser* browser) const {
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContents* current_tab =
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser->tab_strip_model()->GetActiveWebContents();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(current_tab);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return current_tab;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if and when there was a single download created, and its url
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is |expected_url|.
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool VerifySavePackageExpectations(
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Browser* browser,
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& expected_url) const {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Generally, there should only be one download item created
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // in all of these tests.  If it's already here, grab it; if not,
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // wait for it to show up.
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<DownloadItem*> items;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadManager* manager(
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserContext::GetDownloadManager(browser->profile()));
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager->GetAllDownloads(&items);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (items.size() == 0u) {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItemCreatedObserver(manager).WaitForDownloadItem(&items);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1u, items.size());
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (1u != items.size())
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadItem* download_item(items[0]);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return (expected_url == download_item->GetOriginalUrl());
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note on synchronization:
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For each Save Page As operation, we create a corresponding shell
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // DownloadItem to display progress to the user.  That DownloadItem goes
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // through its own state transitions, including being persisted out to the
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // history database, and the download shelf is not shown until after the
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // persistence occurs.  Save Package completion (and marking the DownloadItem
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // as completed) occurs asynchronously from persistence.  Thus if we want to
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // examine either UI state or DB state, we need to wait until both the save
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // package operation is complete and the relevant download item has been
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // persisted.
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* GetDownloadManager() const {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadManager* download_manager =
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserContext::GetDownloadManager(browser()->profile());
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(download_manager);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return download_manager;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Path to directory containing test data.
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath test_dir_;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporary directory we will save pages to.
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir save_dir_;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SavePageBrowserTest);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SavePageBrowserTest::~SavePageBrowserTest() {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveHTMLOnly DISABLED_SaveHTMLOnly
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveHTMLOnly SaveHTMLOnly
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_SaveHTMLOnly) {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, 1,
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
3997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(full_file_name));
4007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(dir));
4017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(test_dir_.Append(base::FilePath(
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTestDir)).Append(FILE_PATH_LITERAL("a.htm")), full_file_name));
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// http://crbug.com/162323
4067dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(SavePageBrowserTest, DISABLED_SaveHTMLOnlyCancel) {
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* manager(GetDownloadManager());
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> downloads;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->GetAllDownloads(&downloads);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, downloads.size());
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItemCreatedObserver creation_observer(manager);
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, -1,
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::CANCELLED));
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // -1 to disable number of files check; we don't update after cancel, and
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // we don't know when the single file completed in relationship to
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the cancel.
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> items;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  creation_observer.WaitForDownloadItem(&items);
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1UL, items.size());
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(url.spec(), items[0]->GetOriginalUrl().spec());
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  items[0]->Cancel(true);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(rdsmith): Fix DII::Cancel() to actually cancel the save package.
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Currently it's ignored.
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(benjhayden): Figure out how to safely wait for SavePackage's finished
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // notification, then expect the contents of the downloaded file.
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass DelayingDownloadManagerDelegate : public ChromeDownloadManagerDelegate {
4427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public:
4437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  explicit DelayingDownloadManagerDelegate(Profile* profile)
4447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : ChromeDownloadManagerDelegate(profile) {
4457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~DelayingDownloadManagerDelegate() {}
4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual bool ShouldCompleteDownload(
4497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      content::DownloadItem* item,
4507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const base::Closure& user_complete_callback) OVERRIDE {
4517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return false;
4527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
4537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private:
4557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(DelayingDownloadManagerDelegate);
4567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
4577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
458a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Disabled on Windows due to flakiness. http://crbug.com/162323
459a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_WIN)
460a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define MAYBE_SaveHTMLOnlyTabDestroy DISABLED_SaveHTMLOnlyTabDestroy
461a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#else
462a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define MAYBE_SaveHTMLOnlyTabDestroy SaveHTMLOnlyTabDestroy
463a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif
464a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochIN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_SaveHTMLOnlyTabDestroy) {
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<DelayingDownloadManagerDelegate> delaying_delegate(
4677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new DelayingDownloadManagerDelegate(browser()->profile()));
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delaying_delegate->GetDownloadIdReceiverCallback().Run(
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::DownloadItem::kInvalidId + 1);
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DownloadServiceFactory::GetForBrowserContext(browser()->profile())->
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      SetDownloadManagerDelegateForTesting(
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          delaying_delegate.PassAs<ChromeDownloadManagerDelegate>());
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DownloadManager* manager(GetDownloadManager());
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> downloads;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->GetAllDownloads(&downloads);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, downloads.size());
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItemCreatedObserver creation_observer(manager);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> items;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  creation_observer.WaitForDownloadItem(&items);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(items.size() == 1);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the tab; does this cancel the download?
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetCurrentTab(browser())->Close();
48990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(DownloadItem::CANCELLED, items[0]->GetState());
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(full_file_name));
4927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(dir));
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveViewSourceHTMLOnly DISABLED_SaveViewSourceHTMLOnly
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveViewSourceHTMLOnly SaveViewSourceHTMLOnly
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_SaveViewSourceHTMLOnly) {
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath file_name(FILE_PATH_LITERAL("a.htm"));
5031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GURL mock_url = URLRequestMockHTTPJob::GetMockUrl(
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir).Append(file_name));
5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GURL view_source_url =
5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GURL(content::kViewSourceScheme + std::string(":") + mock_url.spec());
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL actual_page_url = URLRequestMockHTTPJob::GetMockUrl(
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir).Append(file_name));
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), view_source_url);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, actual_page_url, full_file_name, 1,
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), actual_page_url));
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(full_file_name));
5307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(dir));
5317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).Append(file_name),
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveCompleteHTML DISABLED_SaveCompleteHTML
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveCompleteHTML SaveCompleteHTML
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_SaveCompleteHTML) {
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("b");
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("b", &full_file_name, &dir);
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, 3,
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name, dir, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML));
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(full_file_name));
5647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(dir));
5657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::TextContentsEqual(
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("b.saved1.htm"),
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
5687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("1.png"),
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.png")));
5717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("1.css"),
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.css")));
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoke a save page during the initial navigation.
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (Regression test for http://crbug.com/156538).
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveDuringInitialNavigationIncognito DISABLED_SaveDuringInitialNavigationIncognito
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveDuringInitialNavigationIncognito SaveDuringInitialNavigationIncognito
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest,
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       MAYBE_SaveDuringInitialNavigationIncognito) {
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open an Incognito window.
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* incognito = CreateIncognitoBrowser();  // Waits.
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(incognito);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a download item creation waiter on that window.
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItemCreatedObserver creation_observer(
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserContext::GetDownloadManager(incognito->profile()));
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate, unblocking with new tab.
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = URLRequestMockHTTPJob::GetMockUrl(
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir).AppendASCII("b.htm"));
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURLWithDisposition(incognito, url, NEW_FOREGROUND_TAB,
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Save the page before completion.
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("b", &full_file_name, &dir);
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(incognito->profile()),
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(incognito)->SavePage(
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name, dir, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML));
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(incognito, url));
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Confirm download shelf is visible.
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(incognito->window()->IsDownloadShelfVisible());
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We can't check more than this because SavePackage is racing with
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the page load.  If the page load won the race, then SavePackage
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // might have completed. If the page load lost the race, then
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SavePackage will cancel because there aren't any resources to
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // save.
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, NoSave) {
625f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL));
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(chrome::CanSavePage(browser()));
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_FileNameFromPageTitle DISABLED_FileNameFromPageTitle
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_FileNameFromPageTitle FileNameFromPageTitle
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_FileNameFromPageTitle) {
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("b");
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name = save_dir_.path().AppendASCII(
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string("Test page for saving page feature") + kAppendedExtension);
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dir = save_dir_.path().AppendASCII(
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Test page for saving page feature_files");
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, 3,
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name, dir, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML));
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(full_file_name));
6607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(dir));
6617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::TextContentsEqual(
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("b.saved2.htm"),
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
6647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("1.png"),
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.png")));
6677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("1.css"),
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.css")));
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_RemoveFromList DISABLED_RemoveFromList
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_RemoveFromList RemoveFromList
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_RemoveFromList) {
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, 1,
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadManager* manager(GetDownloadManager());
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<DownloadItem*> downloads;
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->GetAllDownloads(&downloads);
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1UL, downloads.size());
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadRemovedObserver removed(browser()->profile(), downloads[0]->GetId());
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(manager->RemoveAllDownloads(), 1);
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  removed.WaitForRemoved();
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(full_file_name));
7117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(dir));
7127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(test_dir_.Append(base::FilePath(
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTestDir)).Append(FILE_PATH_LITERAL("a.htm")), full_file_name));
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests that a webpage with the title "test.exe" is saved as
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "test.exe.htm".
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We probably don't care to handle this on Linux or Mac.
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, CleanFilenameFromPageTitle) {
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath file_name(FILE_PATH_LITERAL("c.htm"));
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath download_dir =
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadPrefs::FromDownloadManager(GetDownloadManager())->
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          DownloadPath();
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name =
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_dir.AppendASCII(std::string("test.exe") + kAppendedExtension);
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dir = download_dir.AppendASCII("test.exe_files");
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(full_file_name));
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = URLRequestMockHTTPJob::GetMockUrl(
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir).Append(file_name));
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePackageFilePicker::SetShouldPromptUser(false);
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::SavePage(browser());
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(full_file_name));
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(base::DieFileDie(full_file_name, false));
746a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(base::DieFileDie(dir, true));
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SavePageAsMHTMLBrowserTest : public SavePageBrowserTest {
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePageAsMHTMLBrowserTest() {}
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SavePageAsMHTMLBrowserTest();
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kSavePageAsMHTML);
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SavePageAsMHTMLBrowserTest);
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SavePageAsMHTMLBrowserTest::~SavePageAsMHTMLBrowserTest() {
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageAsMHTMLBrowserTest, SavePageAsMHTML) {
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kFileSizeMin = 2758;
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("b");
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath download_dir = DownloadPrefs::FromDownloadManager(
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetDownloadManager())->DownloadPath();
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name = download_dir.AppendASCII(std::string(
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Test page for saving page feature.mhtml"));
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePackageFilePicker::SetShouldPromptUser(false);
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, -1,
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::SavePage(browser());
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(full_file_name));
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 actual_file_size = -1;
788a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(base::GetFileSize(full_file_name, &actual_file_size));
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(kFileSizeMin, actual_file_size);
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SavePageBrowserTest_NonMHTML) {
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFilePicker::SetShouldPromptUser(false);
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url("data:text/plain,foo");
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::SavePage(browser());
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath download_dir = DownloadPrefs::FromDownloadManager(
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetDownloadManager())->DownloadPath();
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath filename = download_dir.AppendASCII("dataurl.txt");
8067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(filename));
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string contents;
80858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(base::ReadFileToString(filename, &contents));
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("foo", contents);
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
813