save_page_browsertest.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
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"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.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"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/download_row.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/url_request_mock_util.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/test/net/url_request_mock_http_job.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/save_package_file_picker_chromeos.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/save_package_file_picker.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserContext;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadItem;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadManager;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::URLRequestMockHTTPJob;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Waits for an item record in the downloads database to match |filter|. See
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DownloadStoredProperly() below for an example filter.
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DownloadPersistedObserver : public DownloadHistory::Observer {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::Callback<bool(
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem* item,
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const history::DownloadRow&)> PersistedFilter;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver(Profile* profile, const PersistedFilter& filter)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : profile_(profile),
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      filter_(filter) {
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadServiceFactory::GetForProfile(profile_)->
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetDownloadHistory()->AddObserver(this);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DownloadPersistedObserver() {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadService* service = DownloadServiceFactory::GetForProfile(profile_);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (service && service->GetDownloadHistory())
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      service->GetDownloadHistory()->RemoveObserver(this);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool WaitForPersisted() {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (persisted_)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    waiting_ = true;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RunMessageLoop();
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    waiting_ = false;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return persisted_;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDownloadStored(DownloadItem* item,
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const history::DownloadRow& info) OVERRIDE {
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    persisted_ = filter_.Run(item, info);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (persisted_ && waiting_)
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Profile* profile_;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item_;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PersistedFilter filter_;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool waiting_;
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool persisted_;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadPersistedObserver);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Waits for an item record to be removed from the downloads database.
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DownloadRemovedObserver : public DownloadPersistedObserver {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadRemovedObserver(Profile* profile, int32 download_id)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : DownloadPersistedObserver(profile, PersistedFilter()),
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        removed_(false),
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        waiting_(false),
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        download_id_(download_id) {
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DownloadRemovedObserver() {}
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool WaitForRemoved() {
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (removed_)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    waiting_ = true;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RunMessageLoop();
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    waiting_ = false;
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return removed_;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDownloadStored(DownloadItem* item,
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const history::DownloadRow& info) OVERRIDE {
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDownloadsRemoved(const DownloadHistory::IdSet& ids) OVERRIDE {
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    removed_ = ids.find(download_id_) != ids.end();
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (removed_ && waiting_)
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool removed_;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool waiting_;
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32 download_id_;
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadRemovedObserver);
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DownloadStoredProperly(
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& expected_url,
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& expected_path,
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 num_files,
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadItem::DownloadState expected_state,
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadItem* item,
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const history::DownloadRow& info) {
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This function may be called multiple times for a given test. Returning
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // false doesn't necessarily mean that the test has failed or will fail, it
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // might just mean that the test hasn't passed yet.
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info.target_path != expected_path) {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VLOG(20) << __FUNCTION__ << " " << info.target_path.value()
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             << " != " << expected_path.value();
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info.url_chain.size() != 1u) {
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VLOG(20) << __FUNCTION__ << " " << info.url_chain.size()
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             << " != 1";
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info.url_chain[0] != expected_url) {
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VLOG(20) << __FUNCTION__ << " " << info.url_chain[0].spec()
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             << " != " << expected_url.spec();
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((num_files >= 0) && (info.received_bytes != num_files)) {
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VLOG(20) << __FUNCTION__ << " " << num_files
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             << " != " << info.received_bytes;
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info.state != expected_state) {
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VLOG(20) << __FUNCTION__ << " " << info.state
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             << " != " << expected_state;
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kTestDir[] = FILE_PATH_LITERAL("save_page");
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static const char kAppendedExtension[] =
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ".htm";
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ".html";
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Loosely based on logic in DownloadTestObserver.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadItemCreatedObserver : public DownloadManager::Observer {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit DownloadItemCreatedObserver(DownloadManager* manager)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : waiting_(false), manager_(manager) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager->AddObserver(this);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DownloadItemCreatedObserver() {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (manager_)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manager_->RemoveObserver(this);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the first download item created after object creation.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that this class provides no protection against the download
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // being destroyed between creation and return of WaitForNewDownloadItem();
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the caller must guarantee that in some other fashion.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForDownloadItem(std::vector<DownloadItem*>* items_seen) {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!manager_) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The manager went away before we were asked to wait; return
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // what we have, even if it's null.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *items_seen = items_seen_;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (items_seen_.empty()) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_ = true;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RunMessageLoop();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_ = false;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *items_seen = items_seen_;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DownloadManager::Observer
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadCreated(
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadManager* manager, DownloadItem* item) OVERRIDE {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_EQ(manager, manager_);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    items_seen_.push_back(item);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (waiting_)
23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ManagerGoingDown(DownloadManager* manager) OVERRIDE {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->RemoveObserver(this);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_ = NULL;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (waiting_)
24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* manager_;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> items_seen_;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadItemCreatedObserver);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SavePackageFinishedObserver : public content::DownloadManager::Observer {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver(content::DownloadManager* manager,
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const base::Closure& callback)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : download_manager_(manager),
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        callback_(callback) {
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    download_manager_->AddObserver(this);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SavePackageFinishedObserver() {
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (download_manager_)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      download_manager_->RemoveObserver(this);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // DownloadManager::Observer:
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnSavePackageSuccessfullyFinished(
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::DownloadManager* manager, content::DownloadItem* item) OVERRIDE {
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    callback_.Run();
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ManagerGoingDown(content::DownloadManager* manager) OVERRIDE {
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    download_manager_->RemoveObserver(this);
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    download_manager_ = NULL;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::DownloadManager* download_manager_;
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Closure callback_;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SavePackageFinishedObserver);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SavePageBrowserTest : public InProcessBrowserTest {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePageBrowserTest() {}
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SavePageBrowserTest();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_dir_));
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(save_dir_.CreateUniqueTempDir());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InProcessBrowserTest::SetUp();
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser()->profile()->GetPrefs()->SetFilePath(
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs::kDownloadDefaultDirectory, save_dir_.path());
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true));
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL NavigateToMockURL(const std::string& prefix) {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url = URLRequestMockHTTPJob::GetMockUrl(
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::FilePath(kTestDir).AppendASCII(prefix + ".htm"));
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser(), url);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return url;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns full paths of destination file and directory.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetDestinationPaths(const std::string& prefix,
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                base::FilePath* full_file_name,
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                base::FilePath* dir) {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *full_file_name = save_dir_.path().AppendASCII(prefix + ".htm");
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *dir = save_dir_.path().AppendASCII(prefix + "_files");
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* GetCurrentTab(Browser* browser) const {
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContents* current_tab =
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser->tab_strip_model()->GetActiveWebContents();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(current_tab);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return current_tab;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if and when there was a single download created, and its url
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is |expected_url|.
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool VerifySavePackageExpectations(
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Browser* browser,
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& expected_url) const {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Generally, there should only be one download item created
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // in all of these tests.  If it's already here, grab it; if not,
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // wait for it to show up.
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<DownloadItem*> items;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadManager* manager(
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserContext::GetDownloadManager(browser->profile()));
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager->GetAllDownloads(&items);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (items.size() == 0u) {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItemCreatedObserver(manager).WaitForDownloadItem(&items);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1u, items.size());
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (1u != items.size())
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadItem* download_item(items[0]);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return (expected_url == download_item->GetOriginalUrl());
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note on synchronization:
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For each Save Page As operation, we create a corresponding shell
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // DownloadItem to display progress to the user.  That DownloadItem goes
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // through its own state transitions, including being persisted out to the
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // history database, and the download shelf is not shown until after the
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // persistence occurs.  Save Package completion (and marking the DownloadItem
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // as completed) occurs asynchronously from persistence.  Thus if we want to
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // examine either UI state or DB state, we need to wait until both the save
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // package operation is complete and the relevant download item has been
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // persisted.
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* GetDownloadManager() const {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadManager* download_manager =
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserContext::GetDownloadManager(browser()->profile());
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(download_manager);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return download_manager;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Path to directory containing test data.
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath test_dir_;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporary directory we will save pages to.
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir save_dir_;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SavePageBrowserTest);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SavePageBrowserTest::~SavePageBrowserTest() {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveHTMLOnly DISABLED_SaveHTMLOnly
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveHTMLOnly SaveHTMLOnly
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_SaveHTMLOnly) {
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, 1,
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_util::PathExists(dir));
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(test_dir_.Append(base::FilePath(
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTestDir)).Append(FILE_PATH_LITERAL("a.htm")), full_file_name));
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveHTMLOnlyCancel DISABLED_SaveHTMLOnlyCancel
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveHTMLOnlyCancel SaveHTMLOnlyCancel
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_SaveHTMLOnlyCancel) {
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* manager(GetDownloadManager());
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> downloads;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->GetAllDownloads(&downloads);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, downloads.size());
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItemCreatedObserver creation_observer(manager);
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, -1,
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::CANCELLED));
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // -1 to disable number of files check; we don't update after cancel, and
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // we don't know when the single file completed in relationship to
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the cancel.
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> items;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  creation_observer.WaitForDownloadItem(&items);
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1UL, items.size());
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(url.spec(), items[0]->GetOriginalUrl().spec());
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  items[0]->Cancel(true);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(rdsmith): Fix DII::Cancel() to actually cancel the save package.
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Currently it's ignored.
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(benjhayden): Figure out how to safely wait for SavePackage's finished
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // notification, then expect the contents of the downloaded file.
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SaveHTMLOnlyTabDestroy) {
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* manager(GetDownloadManager());
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> downloads;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->GetAllDownloads(&downloads);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, downloads.size());
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItemCreatedObserver creation_observer(manager);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> items;
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  creation_observer.WaitForDownloadItem(&items);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(items.size() == 1);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the tab; does this cancel the download?
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetCurrentTab(browser())->Close();
47190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(DownloadItem::CANCELLED, items[0]->GetState());
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_util::PathExists(full_file_name));
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_util::PathExists(dir));
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveViewSourceHTMLOnly DISABLED_SaveViewSourceHTMLOnly
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveViewSourceHTMLOnly SaveViewSourceHTMLOnly
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_SaveViewSourceHTMLOnly) {
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath file_name(FILE_PATH_LITERAL("a.htm"));
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL view_source_url = URLRequestMockHTTPJob::GetMockViewSourceUrl(
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir).Append(file_name));
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL actual_page_url = URLRequestMockHTTPJob::GetMockUrl(
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir).Append(file_name));
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), view_source_url);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, actual_page_url, full_file_name, 1,
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), actual_page_url));
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_util::PathExists(dir));
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).Append(file_name),
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveCompleteHTML DISABLED_SaveCompleteHTML
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveCompleteHTML SaveCompleteHTML
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_SaveCompleteHTML) {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("b");
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("b", &full_file_name, &dir);
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, 3,
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name, dir, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML));
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(dir));
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::TextContentsEqual(
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("b.saved1.htm"),
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("1.png"),
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.png")));
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("1.css"),
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.css")));
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoke a save page during the initial navigation.
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (Regression test for http://crbug.com/156538).
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveDuringInitialNavigationIncognito DISABLED_SaveDuringInitialNavigationIncognito
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveDuringInitialNavigationIncognito SaveDuringInitialNavigationIncognito
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest,
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       MAYBE_SaveDuringInitialNavigationIncognito) {
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open an Incognito window.
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* incognito = CreateIncognitoBrowser();  // Waits.
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(incognito);
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a download item creation waiter on that window.
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItemCreatedObserver creation_observer(
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserContext::GetDownloadManager(incognito->profile()));
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate, unblocking with new tab.
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = URLRequestMockHTTPJob::GetMockUrl(
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir).AppendASCII("b.htm"));
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURLWithDisposition(incognito, url, NEW_FOREGROUND_TAB,
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Save the page before completion.
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("b", &full_file_name, &dir);
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(incognito->profile()),
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(incognito)->SavePage(
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name, dir, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML));
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(incognito, url));
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Confirm download shelf is visible.
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(incognito->window()->IsDownloadShelfVisible());
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We can't check more than this because SavePackage is racing with
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the page load.  If the page load won the race, then SavePackage
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // might have completed. If the page load lost the race, then
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SavePackage will cancel because there aren't any resources to
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // save.
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, NoSave) {
60890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(content::kAboutBlankURL));
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(chrome::CanSavePage(browser()));
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_FileNameFromPageTitle DISABLED_FileNameFromPageTitle
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_FileNameFromPageTitle FileNameFromPageTitle
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_FileNameFromPageTitle) {
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("b");
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name = save_dir_.path().AppendASCII(
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string("Test page for saving page feature") + kAppendedExtension);
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dir = save_dir_.path().AppendASCII(
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Test page for saving page feature_files");
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, 3,
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name, dir, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML));
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(dir));
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::TextContentsEqual(
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("b.saved2.htm"),
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("1.png"),
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.png")));
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("1.css"),
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.css")));
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_RemoveFromList DISABLED_RemoveFromList
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_RemoveFromList RemoveFromList
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_RemoveFromList) {
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, 1,
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadManager* manager(GetDownloadManager());
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<DownloadItem*> downloads;
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->GetAllDownloads(&downloads);
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1UL, downloads.size());
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadRemovedObserver removed(browser()->profile(), downloads[0]->GetId());
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(manager->RemoveAllDownloads(), 1);
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  removed.WaitForRemoved();
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_util::PathExists(dir));
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(test_dir_.Append(base::FilePath(
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTestDir)).Append(FILE_PATH_LITERAL("a.htm")), full_file_name));
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests that a webpage with the title "test.exe" is saved as
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "test.exe.htm".
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We probably don't care to handle this on Linux or Mac.
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, CleanFilenameFromPageTitle) {
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath file_name(FILE_PATH_LITERAL("c.htm"));
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath download_dir =
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadPrefs::FromDownloadManager(GetDownloadManager())->
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          DownloadPath();
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name =
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_dir.AppendASCII(std::string("test.exe") + kAppendedExtension);
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dir = download_dir.AppendASCII("test.exe_files");
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_util::PathExists(full_file_name));
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = URLRequestMockHTTPJob::GetMockUrl(
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir).Append(file_name));
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePackageFilePicker::SetShouldPromptUser(false);
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::SavePage(browser());
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::DieFileDie(full_file_name, false));
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::DieFileDie(dir, true));
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SavePageAsMHTMLBrowserTest : public SavePageBrowserTest {
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePageAsMHTMLBrowserTest() {}
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SavePageAsMHTMLBrowserTest();
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kSavePageAsMHTML);
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SavePageAsMHTMLBrowserTest);
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SavePageAsMHTMLBrowserTest::~SavePageAsMHTMLBrowserTest() {
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageAsMHTMLBrowserTest, SavePageAsMHTML) {
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kFileSizeMin = 2758;
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("b");
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath download_dir = DownloadPrefs::FromDownloadManager(
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetDownloadManager())->DownloadPath();
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name = download_dir.AppendASCII(std::string(
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Test page for saving page feature.mhtml"));
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePackageFilePickerChromeOS::SetShouldPromptUser(false);
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePackageFilePicker::SetShouldPromptUser(false);
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, -1,
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::SavePage(browser());
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 actual_file_size = -1;
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::GetFileSize(full_file_name, &actual_file_size));
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(kFileSizeMin, actual_file_size);
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SavePageBrowserTest_NonMHTML) {
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFilePickerChromeOS::SetShouldPromptUser(false);
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFilePicker::SetShouldPromptUser(false);
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url("data:text/plain,foo");
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::SavePage(browser());
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath download_dir = DownloadPrefs::FromDownloadManager(
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetDownloadManager())->DownloadPath();
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath filename = download_dir.AppendASCII("dataurl.txt");
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(filename));
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string contents;
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(file_util::ReadFileToString(filename, &contents));
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("foo", contents);
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
807