save_page_browsertest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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"
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"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/test/net/url_request_mock_http_job.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserContext;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadItem;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadManager;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::URLRequestMockHTTPJob;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Waits for an item record in the downloads database to match |filter|. See
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DownloadStoredProperly() below for an example filter.
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DownloadPersistedObserver : public DownloadHistory::Observer {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::Callback<bool(
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem* item,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const history::DownloadRow&)> PersistedFilter;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver(Profile* profile, const PersistedFilter& filter)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : profile_(profile),
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      filter_(filter),
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      waiting_(false),
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      persisted_(false) {
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    DownloadServiceFactory::GetForBrowserContext(profile_)->
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetDownloadHistory()->AddObserver(this);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DownloadPersistedObserver() {
71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    DownloadService* service = DownloadServiceFactory::GetForBrowserContext(
72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        profile_);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (service && service->GetDownloadHistory())
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      service->GetDownloadHistory()->RemoveObserver(this);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool WaitForPersisted() {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (persisted_)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    waiting_ = true;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RunMessageLoop();
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    waiting_ = false;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return persisted_;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDownloadStored(DownloadItem* item,
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const history::DownloadRow& info) OVERRIDE {
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    persisted_ = persisted_ || filter_.Run(item, info);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (persisted_ && waiting_)
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Profile* profile_;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PersistedFilter filter_;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool waiting_;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool persisted_;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadPersistedObserver);
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Waits for an item record to be removed from the downloads database.
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DownloadRemovedObserver : public DownloadPersistedObserver {
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadRemovedObserver(Profile* profile, int32 download_id)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : DownloadPersistedObserver(profile, PersistedFilter()),
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        removed_(false),
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        waiting_(false),
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        download_id_(download_id) {
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DownloadRemovedObserver() {}
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool WaitForRemoved() {
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (removed_)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    waiting_ = true;
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RunMessageLoop();
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    waiting_ = false;
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return removed_;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDownloadStored(DownloadItem* item,
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const history::DownloadRow& info) OVERRIDE {
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDownloadsRemoved(const DownloadHistory::IdSet& ids) OVERRIDE {
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    removed_ = ids.find(download_id_) != ids.end();
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (removed_ && waiting_)
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool removed_;
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool waiting_;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32 download_id_;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadRemovedObserver);
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DownloadStoredProperly(
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& expected_url,
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& expected_path,
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 num_files,
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadItem::DownloadState expected_state,
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadItem* item,
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const history::DownloadRow& info) {
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This function may be called multiple times for a given test. Returning
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // false doesn't necessarily mean that the test has failed or will fail, it
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // might just mean that the test hasn't passed yet.
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info.target_path != expected_path) {
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VLOG(20) << __FUNCTION__ << " " << info.target_path.value()
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             << " != " << expected_path.value();
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info.url_chain.size() != 1u) {
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VLOG(20) << __FUNCTION__ << " " << info.url_chain.size()
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             << " != 1";
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info.url_chain[0] != expected_url) {
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VLOG(20) << __FUNCTION__ << " " << info.url_chain[0].spec()
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             << " != " << expected_url.spec();
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((num_files >= 0) && (info.received_bytes != num_files)) {
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VLOG(20) << __FUNCTION__ << " " << num_files
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             << " != " << info.received_bytes;
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info.state != expected_state) {
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VLOG(20) << __FUNCTION__ << " " << info.state
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             << " != " << expected_state;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kTestDir[] = FILE_PATH_LITERAL("save_page");
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static const char kAppendedExtension[] =
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ".htm";
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ".html";
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Loosely based on logic in DownloadTestObserver.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadItemCreatedObserver : public DownloadManager::Observer {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit DownloadItemCreatedObserver(DownloadManager* manager)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : waiting_(false), manager_(manager) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager->AddObserver(this);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DownloadItemCreatedObserver() {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (manager_)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manager_->RemoveObserver(this);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the first download item created after object creation.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that this class provides no protection against the download
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // being destroyed between creation and return of WaitForNewDownloadItem();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the caller must guarantee that in some other fashion.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForDownloadItem(std::vector<DownloadItem*>* items_seen) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!manager_) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The manager went away before we were asked to wait; return
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // what we have, even if it's null.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *items_seen = items_seen_;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (items_seen_.empty()) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_ = true;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RunMessageLoop();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_ = false;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *items_seen = items_seen_;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DownloadManager::Observer
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadCreated(
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadManager* manager, DownloadItem* item) OVERRIDE {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_EQ(manager, manager_);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    items_seen_.push_back(item);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (waiting_)
23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ManagerGoingDown(DownloadManager* manager) OVERRIDE {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->RemoveObserver(this);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_ = NULL;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (waiting_)
23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* manager_;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> items_seen_;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadItemCreatedObserver);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SavePackageFinishedObserver : public content::DownloadManager::Observer {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver(content::DownloadManager* manager,
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const base::Closure& callback)
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : download_manager_(manager),
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        callback_(callback) {
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    download_manager_->AddObserver(this);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SavePackageFinishedObserver() {
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (download_manager_)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      download_manager_->RemoveObserver(this);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // DownloadManager::Observer:
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnSavePackageSuccessfullyFinished(
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::DownloadManager* manager, content::DownloadItem* item) OVERRIDE {
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    callback_.Run();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ManagerGoingDown(content::DownloadManager* manager) OVERRIDE {
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    download_manager_->RemoveObserver(this);
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    download_manager_ = NULL;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::DownloadManager* download_manager_;
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Closure callback_;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SavePackageFinishedObserver);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SavePageBrowserTest : public InProcessBrowserTest {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePageBrowserTest() {}
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SavePageBrowserTest();
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_dir_));
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(save_dir_.CreateUniqueTempDir());
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InProcessBrowserTest::SetUp();
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser()->profile()->GetPrefs()->SetFilePath(
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs::kDownloadDefaultDirectory, save_dir_.path());
293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    browser()->profile()->GetPrefs()->SetFilePath(
294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        prefs::kSaveFileDefaultDirectory, save_dir_.path());
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true));
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL NavigateToMockURL(const std::string& prefix) {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url = URLRequestMockHTTPJob::GetMockUrl(
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::FilePath(kTestDir).AppendASCII(prefix + ".htm"));
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser(), url);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return url;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns full paths of destination file and directory.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetDestinationPaths(const std::string& prefix,
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                base::FilePath* full_file_name,
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                base::FilePath* dir) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *full_file_name = save_dir_.path().AppendASCII(prefix + ".htm");
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *dir = save_dir_.path().AppendASCII(prefix + "_files");
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* GetCurrentTab(Browser* browser) const {
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContents* current_tab =
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser->tab_strip_model()->GetActiveWebContents();
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(current_tab);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return current_tab;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if and when there was a single download created, and its url
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is |expected_url|.
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool VerifySavePackageExpectations(
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Browser* browser,
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& expected_url) const {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Generally, there should only be one download item created
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // in all of these tests.  If it's already here, grab it; if not,
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // wait for it to show up.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<DownloadItem*> items;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadManager* manager(
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserContext::GetDownloadManager(browser->profile()));
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager->GetAllDownloads(&items);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (items.size() == 0u) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItemCreatedObserver(manager).WaitForDownloadItem(&items);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1u, items.size());
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (1u != items.size())
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadItem* download_item(items[0]);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return (expected_url == download_item->GetOriginalUrl());
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note on synchronization:
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For each Save Page As operation, we create a corresponding shell
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // DownloadItem to display progress to the user.  That DownloadItem goes
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // through its own state transitions, including being persisted out to the
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // history database, and the download shelf is not shown until after the
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // persistence occurs.  Save Package completion (and marking the DownloadItem
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // as completed) occurs asynchronously from persistence.  Thus if we want to
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // examine either UI state or DB state, we need to wait until both the save
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // package operation is complete and the relevant download item has been
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // persisted.
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* GetDownloadManager() const {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadManager* download_manager =
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserContext::GetDownloadManager(browser()->profile());
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(download_manager);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return download_manager;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Path to directory containing test data.
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath test_dir_;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporary directory we will save pages to.
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir save_dir_;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SavePageBrowserTest);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SavePageBrowserTest::~SavePageBrowserTest() {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveHTMLOnly DISABLED_SaveHTMLOnly
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveHTMLOnly SaveHTMLOnly
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_SaveHTMLOnly) {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, 1,
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
4037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(full_file_name));
4047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(dir));
4057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(test_dir_.Append(base::FilePath(
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTestDir)).Append(FILE_PATH_LITERAL("a.htm")), full_file_name));
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// http://crbug.com/162323
4107dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(SavePageBrowserTest, DISABLED_SaveHTMLOnlyCancel) {
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* manager(GetDownloadManager());
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> downloads;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->GetAllDownloads(&downloads);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, downloads.size());
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItemCreatedObserver creation_observer(manager);
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, -1,
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::CANCELLED));
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // -1 to disable number of files check; we don't update after cancel, and
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // we don't know when the single file completed in relationship to
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the cancel.
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> items;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  creation_observer.WaitForDownloadItem(&items);
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1UL, items.size());
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(url.spec(), items[0]->GetOriginalUrl().spec());
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  items[0]->Cancel(true);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(rdsmith): Fix DII::Cancel() to actually cancel the save package.
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Currently it's ignored.
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(benjhayden): Figure out how to safely wait for SavePackage's finished
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // notification, then expect the contents of the downloaded file.
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass DelayingDownloadManagerDelegate : public ChromeDownloadManagerDelegate {
4467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public:
4477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  explicit DelayingDownloadManagerDelegate(Profile* profile)
4487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : ChromeDownloadManagerDelegate(profile) {
4497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~DelayingDownloadManagerDelegate() {}
4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual bool ShouldCompleteDownload(
4537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      content::DownloadItem* item,
4547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const base::Closure& user_complete_callback) OVERRIDE {
4557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return false;
4567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
4577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private:
4597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(DelayingDownloadManagerDelegate);
4607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
4617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SaveHTMLOnlyTabDestroy) {
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<DelayingDownloadManagerDelegate> delaying_delegate(
4657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new DelayingDownloadManagerDelegate(browser()->profile()));
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delaying_delegate->GetDownloadIdReceiverCallback().Run(
4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::DownloadItem::kInvalidId + 1);
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DownloadServiceFactory::GetForBrowserContext(browser()->profile())->
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      SetDownloadManagerDelegateForTesting(
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          delaying_delegate.PassAs<ChromeDownloadManagerDelegate>());
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DownloadManager* manager(GetDownloadManager());
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> downloads;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->GetAllDownloads(&downloads);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, downloads.size());
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItemCreatedObserver creation_observer(manager);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> items;
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  creation_observer.WaitForDownloadItem(&items);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(items.size() == 1);
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the tab; does this cancel the download?
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetCurrentTab(browser())->Close();
48790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(DownloadItem::CANCELLED, items[0]->GetState());
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(full_file_name));
4907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(dir));
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveViewSourceHTMLOnly DISABLED_SaveViewSourceHTMLOnly
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveViewSourceHTMLOnly SaveViewSourceHTMLOnly
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_SaveViewSourceHTMLOnly) {
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath file_name(FILE_PATH_LITERAL("a.htm"));
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL view_source_url = URLRequestMockHTTPJob::GetMockViewSourceUrl(
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir).Append(file_name));
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL actual_page_url = URLRequestMockHTTPJob::GetMockUrl(
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir).Append(file_name));
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), view_source_url);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, actual_page_url, full_file_name, 1,
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), actual_page_url));
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(full_file_name));
5267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(dir));
5277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).Append(file_name),
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveCompleteHTML DISABLED_SaveCompleteHTML
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveCompleteHTML SaveCompleteHTML
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_SaveCompleteHTML) {
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("b");
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("b", &full_file_name, &dir);
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, 3,
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name, dir, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML));
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(full_file_name));
5607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(dir));
5617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::TextContentsEqual(
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("b.saved1.htm"),
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
5647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("1.png"),
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.png")));
5677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("1.css"),
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.css")));
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoke a save page during the initial navigation.
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (Regression test for http://crbug.com/156538).
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveDuringInitialNavigationIncognito DISABLED_SaveDuringInitialNavigationIncognito
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveDuringInitialNavigationIncognito SaveDuringInitialNavigationIncognito
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest,
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       MAYBE_SaveDuringInitialNavigationIncognito) {
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open an Incognito window.
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* incognito = CreateIncognitoBrowser();  // Waits.
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(incognito);
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a download item creation waiter on that window.
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItemCreatedObserver creation_observer(
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserContext::GetDownloadManager(incognito->profile()));
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate, unblocking with new tab.
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = URLRequestMockHTTPJob::GetMockUrl(
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir).AppendASCII("b.htm"));
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURLWithDisposition(incognito, url, NEW_FOREGROUND_TAB,
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Save the page before completion.
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("b", &full_file_name, &dir);
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(incognito->profile()),
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(incognito)->SavePage(
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name, dir, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML));
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(incognito, url));
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Confirm download shelf is visible.
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(incognito->window()->IsDownloadShelfVisible());
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We can't check more than this because SavePackage is racing with
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the page load.  If the page load won the race, then SavePackage
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // might have completed. If the page load lost the race, then
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SavePackage will cancel because there aren't any resources to
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // save.
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, NoSave) {
62190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(content::kAboutBlankURL));
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(chrome::CanSavePage(browser()));
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_FileNameFromPageTitle DISABLED_FileNameFromPageTitle
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_FileNameFromPageTitle FileNameFromPageTitle
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_FileNameFromPageTitle) {
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("b");
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name = save_dir_.path().AppendASCII(
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string("Test page for saving page feature") + kAppendedExtension);
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dir = save_dir_.path().AppendASCII(
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Test page for saving page feature_files");
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, 3,
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name, dir, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML));
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(full_file_name));
6567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(dir));
6577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::TextContentsEqual(
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("b.saved2.htm"),
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
6607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("1.png"),
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.png")));
6637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("1.css"),
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.css")));
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
6695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_RemoveFromList DISABLED_RemoveFromList
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_RemoveFromList RemoveFromList
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_RemoveFromList) {
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, 1,
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadManager* manager(GetDownloadManager());
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<DownloadItem*> downloads;
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->GetAllDownloads(&downloads);
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1UL, downloads.size());
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadRemovedObserver removed(browser()->profile(), downloads[0]->GetId());
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(manager->RemoveAllDownloads(), 1);
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  removed.WaitForRemoved();
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(full_file_name));
7077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(dir));
7087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(test_dir_.Append(base::FilePath(
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTestDir)).Append(FILE_PATH_LITERAL("a.htm")), full_file_name));
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests that a webpage with the title "test.exe" is saved as
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "test.exe.htm".
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We probably don't care to handle this on Linux or Mac.
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, CleanFilenameFromPageTitle) {
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath file_name(FILE_PATH_LITERAL("c.htm"));
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath download_dir =
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadPrefs::FromDownloadManager(GetDownloadManager())->
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          DownloadPath();
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name =
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_dir.AppendASCII(std::string("test.exe") + kAppendedExtension);
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dir = download_dir.AppendASCII("test.exe_files");
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(full_file_name));
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = URLRequestMockHTTPJob::GetMockUrl(
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir).Append(file_name));
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePackageFilePicker::SetShouldPromptUser(false);
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::SavePage(browser());
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(full_file_name));
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::DieFileDie(full_file_name, false));
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::DieFileDie(dir, true));
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SavePageAsMHTMLBrowserTest : public SavePageBrowserTest {
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePageAsMHTMLBrowserTest() {}
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SavePageAsMHTMLBrowserTest();
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kSavePageAsMHTML);
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SavePageAsMHTMLBrowserTest);
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SavePageAsMHTMLBrowserTest::~SavePageAsMHTMLBrowserTest() {
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageAsMHTMLBrowserTest, SavePageAsMHTML) {
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kFileSizeMin = 2758;
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("b");
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath download_dir = DownloadPrefs::FromDownloadManager(
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetDownloadManager())->DownloadPath();
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name = download_dir.AppendASCII(std::string(
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Test page for saving page feature.mhtml"));
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePackageFilePicker::SetShouldPromptUser(false);
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, -1,
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::SavePage(browser());
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(full_file_name));
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 actual_file_size = -1;
784a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(base::GetFileSize(full_file_name, &actual_file_size));
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(kFileSizeMin, actual_file_size);
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SavePageBrowserTest_NonMHTML) {
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFilePicker::SetShouldPromptUser(false);
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url("data:text/plain,foo");
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::SavePage(browser());
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath download_dir = DownloadPrefs::FromDownloadManager(
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetDownloadManager())->DownloadPath();
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath filename = download_dir.AppendASCII("dataurl.txt");
8027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(filename));
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string contents;
80458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(base::ReadFileToString(filename, &contents));
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("foo", contents);
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
810