save_page_browsertest.cc revision 868fa2fe829687343ffae624259930155e16dbd8
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) {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadServiceFactory::GetForProfile(profile_)->
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetDownloadHistory()->AddObserver(this);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DownloadPersistedObserver() {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadService* service = DownloadServiceFactory::GetForProfile(profile_);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (service && service->GetDownloadHistory())
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      service->GetDownloadHistory()->RemoveObserver(this);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool WaitForPersisted() {
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (persisted_)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    waiting_ = true;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RunMessageLoop();
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    waiting_ = false;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return persisted_;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDownloadStored(DownloadItem* item,
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const history::DownloadRow& info) OVERRIDE {
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    persisted_ = persisted_ || filter_.Run(item, info);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (persisted_ && waiting_)
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Profile* profile_;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItem* item_;
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
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveHTMLOnly DISABLED_SaveHTMLOnly
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveHTMLOnly SaveHTMLOnly
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_SaveHTMLOnly) {
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, 1,
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_util::PathExists(dir));
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(test_dir_.Append(base::FilePath(
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTestDir)).Append(FILE_PATH_LITERAL("a.htm")), full_file_name));
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveHTMLOnlyCancel DISABLED_SaveHTMLOnlyCancel
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveHTMLOnlyCancel SaveHTMLOnlyCancel
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_SaveHTMLOnlyCancel) {
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* manager(GetDownloadManager());
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> downloads;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->GetAllDownloads(&downloads);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, downloads.size());
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItemCreatedObserver creation_observer(manager);
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, -1,
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::CANCELLED));
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // -1 to disable number of files check; we don't update after cancel, and
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // we don't know when the single file completed in relationship to
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the cancel.
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> items;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  creation_observer.WaitForDownloadItem(&items);
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1UL, items.size());
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(url.spec(), items[0]->GetOriginalUrl().spec());
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  items[0]->Cancel(true);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(rdsmith): Fix DII::Cancel() to actually cancel the save package.
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Currently it's ignored.
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(benjhayden): Figure out how to safely wait for SavePackage's finished
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // notification, then expect the contents of the downloaded file.
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SaveHTMLOnlyTabDestroy) {
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* manager(GetDownloadManager());
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> downloads;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->GetAllDownloads(&downloads);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, downloads.size());
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItemCreatedObserver creation_observer(manager);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> items;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  creation_observer.WaitForDownloadItem(&items);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(items.size() == 1);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the tab; does this cancel the download?
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetCurrentTab(browser())->Close();
47090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(DownloadItem::CANCELLED, items[0]->GetState());
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_util::PathExists(full_file_name));
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_util::PathExists(dir));
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveViewSourceHTMLOnly DISABLED_SaveViewSourceHTMLOnly
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveViewSourceHTMLOnly SaveViewSourceHTMLOnly
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_SaveViewSourceHTMLOnly) {
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath file_name(FILE_PATH_LITERAL("a.htm"));
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL view_source_url = URLRequestMockHTTPJob::GetMockViewSourceUrl(
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir).Append(file_name));
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL actual_page_url = URLRequestMockHTTPJob::GetMockUrl(
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir).Append(file_name));
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), view_source_url);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, actual_page_url, full_file_name, 1,
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), actual_page_url));
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_util::PathExists(dir));
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).Append(file_name),
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveCompleteHTML DISABLED_SaveCompleteHTML
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveCompleteHTML SaveCompleteHTML
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_SaveCompleteHTML) {
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("b");
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("b", &full_file_name, &dir);
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, 3,
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name, dir, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML));
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(dir));
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::TextContentsEqual(
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("b.saved1.htm"),
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("1.png"),
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.png")));
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("1.css"),
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.css")));
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoke a save page during the initial navigation.
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (Regression test for http://crbug.com/156538).
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveDuringInitialNavigationIncognito DISABLED_SaveDuringInitialNavigationIncognito
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveDuringInitialNavigationIncognito SaveDuringInitialNavigationIncognito
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest,
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       MAYBE_SaveDuringInitialNavigationIncognito) {
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open an Incognito window.
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* incognito = CreateIncognitoBrowser();  // Waits.
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(incognito);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a download item creation waiter on that window.
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItemCreatedObserver creation_observer(
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserContext::GetDownloadManager(incognito->profile()));
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate, unblocking with new tab.
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = URLRequestMockHTTPJob::GetMockUrl(
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir).AppendASCII("b.htm"));
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURLWithDisposition(incognito, url, NEW_FOREGROUND_TAB,
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Save the page before completion.
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("b", &full_file_name, &dir);
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(incognito->profile()),
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(incognito)->SavePage(
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name, dir, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML));
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(incognito, url));
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Confirm download shelf is visible.
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(incognito->window()->IsDownloadShelfVisible());
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We can't check more than this because SavePackage is racing with
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the page load.  If the page load won the race, then SavePackage
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // might have completed. If the page load lost the race, then
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SavePackage will cancel because there aren't any resources to
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // save.
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, NoSave) {
60790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(content::kAboutBlankURL));
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(chrome::CanSavePage(browser()));
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_FileNameFromPageTitle DISABLED_FileNameFromPageTitle
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_FileNameFromPageTitle FileNameFromPageTitle
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_FileNameFromPageTitle) {
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("b");
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name = save_dir_.path().AppendASCII(
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string("Test page for saving page feature") + kAppendedExtension);
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dir = save_dir_.path().AppendASCII(
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Test page for saving page feature_files");
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, 3,
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name, dir, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML));
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(dir));
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::TextContentsEqual(
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("b.saved2.htm"),
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("1.png"),
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.png")));
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("1.css"),
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.css")));
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_RemoveFromList DISABLED_RemoveFromList
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_RemoveFromList RemoveFromList
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_RemoveFromList) {
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, 1,
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadManager* manager(GetDownloadManager());
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<DownloadItem*> downloads;
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->GetAllDownloads(&downloads);
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1UL, downloads.size());
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadRemovedObserver removed(browser()->profile(), downloads[0]->GetId());
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(manager->RemoveAllDownloads(), 1);
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  removed.WaitForRemoved();
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_util::PathExists(dir));
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(test_dir_.Append(base::FilePath(
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTestDir)).Append(FILE_PATH_LITERAL("a.htm")), full_file_name));
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests that a webpage with the title "test.exe" is saved as
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "test.exe.htm".
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We probably don't care to handle this on Linux or Mac.
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, CleanFilenameFromPageTitle) {
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath file_name(FILE_PATH_LITERAL("c.htm"));
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath download_dir =
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadPrefs::FromDownloadManager(GetDownloadManager())->
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          DownloadPath();
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name =
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_dir.AppendASCII(std::string("test.exe") + kAppendedExtension);
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dir = download_dir.AppendASCII("test.exe_files");
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_util::PathExists(full_file_name));
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = URLRequestMockHTTPJob::GetMockUrl(
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir).Append(file_name));
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePackageFilePicker::SetShouldPromptUser(false);
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::SavePage(browser());
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::DieFileDie(full_file_name, false));
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::DieFileDie(dir, true));
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SavePageAsMHTMLBrowserTest : public SavePageBrowserTest {
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePageAsMHTMLBrowserTest() {}
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SavePageAsMHTMLBrowserTest();
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kSavePageAsMHTML);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SavePageAsMHTMLBrowserTest);
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SavePageAsMHTMLBrowserTest::~SavePageAsMHTMLBrowserTest() {
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageAsMHTMLBrowserTest, SavePageAsMHTML) {
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kFileSizeMin = 2758;
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("b");
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath download_dir = DownloadPrefs::FromDownloadManager(
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetDownloadManager())->DownloadPath();
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name = download_dir.AppendASCII(std::string(
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Test page for saving page feature.mhtml"));
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePackageFilePicker::SetShouldPromptUser(false);
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, -1,
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::SavePage(browser());
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
770868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(file_util::PathExists(full_file_name));
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 actual_file_size = -1;
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::GetFileSize(full_file_name, &actual_file_size));
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(kFileSizeMin, actual_file_size);
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SavePageBrowserTest_NonMHTML) {
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFilePicker::SetShouldPromptUser(false);
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url("data:text/plain,foo");
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::SavePage(browser());
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath download_dir = DownloadPrefs::FromDownloadManager(
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetDownloadManager())->DownloadPath();
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath filename = download_dir.AppendASCII("dataurl.txt");
790868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(file_util::PathExists(filename));
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string contents;
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(file_util::ReadFileToString(filename, &contents));
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("foo", contents);
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
798