save_page_browsertest.cc revision a36e5920737c6adbddd3e43b760e5de8431db6e0
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)  DownloadItem* item_;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PersistedFilter filter_;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool waiting_;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool persisted_;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadPersistedObserver);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Waits for an item record to be removed from the downloads database.
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DownloadRemovedObserver : public DownloadPersistedObserver {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadRemovedObserver(Profile* profile, int32 download_id)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : DownloadPersistedObserver(profile, PersistedFilter()),
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        removed_(false),
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        waiting_(false),
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        download_id_(download_id) {
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DownloadRemovedObserver() {}
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool WaitForRemoved() {
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (removed_)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    waiting_ = true;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RunMessageLoop();
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    waiting_ = false;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return removed_;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDownloadStored(DownloadItem* item,
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const history::DownloadRow& info) OVERRIDE {
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDownloadsRemoved(const DownloadHistory::IdSet& ids) OVERRIDE {
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    removed_ = ids.find(download_id_) != ids.end();
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (removed_ && waiting_)
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool removed_;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool waiting_;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32 download_id_;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadRemovedObserver);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DownloadStoredProperly(
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& expected_url,
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& expected_path,
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 num_files,
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadItem::DownloadState expected_state,
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadItem* item,
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const history::DownloadRow& info) {
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This function may be called multiple times for a given test. Returning
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // false doesn't necessarily mean that the test has failed or will fail, it
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // might just mean that the test hasn't passed yet.
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info.target_path != expected_path) {
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VLOG(20) << __FUNCTION__ << " " << info.target_path.value()
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             << " != " << expected_path.value();
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info.url_chain.size() != 1u) {
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VLOG(20) << __FUNCTION__ << " " << info.url_chain.size()
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             << " != 1";
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info.url_chain[0] != expected_url) {
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VLOG(20) << __FUNCTION__ << " " << info.url_chain[0].spec()
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             << " != " << expected_url.spec();
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((num_files >= 0) && (info.received_bytes != num_files)) {
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VLOG(20) << __FUNCTION__ << " " << num_files
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             << " != " << info.received_bytes;
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info.state != expected_state) {
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VLOG(20) << __FUNCTION__ << " " << info.state
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             << " != " << expected_state;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kTestDir[] = FILE_PATH_LITERAL("save_page");
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static const char kAppendedExtension[] =
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ".htm";
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ".html";
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Loosely based on logic in DownloadTestObserver.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadItemCreatedObserver : public DownloadManager::Observer {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit DownloadItemCreatedObserver(DownloadManager* manager)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : waiting_(false), manager_(manager) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager->AddObserver(this);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DownloadItemCreatedObserver() {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (manager_)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manager_->RemoveObserver(this);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the first download item created after object creation.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that this class provides no protection against the download
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // being destroyed between creation and return of WaitForNewDownloadItem();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the caller must guarantee that in some other fashion.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForDownloadItem(std::vector<DownloadItem*>* items_seen) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!manager_) {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The manager went away before we were asked to wait; return
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // what we have, even if it's null.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *items_seen = items_seen_;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (items_seen_.empty()) {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_ = true;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RunMessageLoop();
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_ = false;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *items_seen = items_seen_;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DownloadManager::Observer
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadCreated(
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadManager* manager, DownloadItem* item) OVERRIDE {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_EQ(manager, manager_);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    items_seen_.push_back(item);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (waiting_)
23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ManagerGoingDown(DownloadManager* manager) OVERRIDE {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->RemoveObserver(this);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_ = NULL;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (waiting_)
23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* manager_;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> items_seen_;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadItemCreatedObserver);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SavePackageFinishedObserver : public content::DownloadManager::Observer {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver(content::DownloadManager* manager,
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const base::Closure& callback)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : download_manager_(manager),
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        callback_(callback) {
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    download_manager_->AddObserver(this);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SavePackageFinishedObserver() {
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (download_manager_)
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      download_manager_->RemoveObserver(this);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // DownloadManager::Observer:
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnSavePackageSuccessfullyFinished(
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::DownloadManager* manager, content::DownloadItem* item) OVERRIDE {
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    callback_.Run();
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ManagerGoingDown(content::DownloadManager* manager) OVERRIDE {
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    download_manager_->RemoveObserver(this);
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    download_manager_ = NULL;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::DownloadManager* download_manager_;
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Closure callback_;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SavePackageFinishedObserver);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SavePageBrowserTest : public InProcessBrowserTest {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePageBrowserTest() {}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SavePageBrowserTest();
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_dir_));
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(save_dir_.CreateUniqueTempDir());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InProcessBrowserTest::SetUp();
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser()->profile()->GetPrefs()->SetFilePath(
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs::kDownloadDefaultDirectory, save_dir_.path());
294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    browser()->profile()->GetPrefs()->SetFilePath(
295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        prefs::kSaveFileDefaultDirectory, save_dir_.path());
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true));
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL NavigateToMockURL(const std::string& prefix) {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url = URLRequestMockHTTPJob::GetMockUrl(
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::FilePath(kTestDir).AppendASCII(prefix + ".htm"));
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser(), url);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return url;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns full paths of destination file and directory.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetDestinationPaths(const std::string& prefix,
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                base::FilePath* full_file_name,
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                base::FilePath* dir) {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *full_file_name = save_dir_.path().AppendASCII(prefix + ".htm");
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *dir = save_dir_.path().AppendASCII(prefix + "_files");
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* GetCurrentTab(Browser* browser) const {
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContents* current_tab =
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser->tab_strip_model()->GetActiveWebContents();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(current_tab);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return current_tab;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if and when there was a single download created, and its url
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is |expected_url|.
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool VerifySavePackageExpectations(
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Browser* browser,
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& expected_url) const {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Generally, there should only be one download item created
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // in all of these tests.  If it's already here, grab it; if not,
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // wait for it to show up.
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<DownloadItem*> items;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadManager* manager(
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserContext::GetDownloadManager(browser->profile()));
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager->GetAllDownloads(&items);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (items.size() == 0u) {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItemCreatedObserver(manager).WaitForDownloadItem(&items);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1u, items.size());
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (1u != items.size())
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadItem* download_item(items[0]);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return (expected_url == download_item->GetOriginalUrl());
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note on synchronization:
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For each Save Page As operation, we create a corresponding shell
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // DownloadItem to display progress to the user.  That DownloadItem goes
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // through its own state transitions, including being persisted out to the
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // history database, and the download shelf is not shown until after the
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // persistence occurs.  Save Package completion (and marking the DownloadItem
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // as completed) occurs asynchronously from persistence.  Thus if we want to
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // examine either UI state or DB state, we need to wait until both the save
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // package operation is complete and the relevant download item has been
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // persisted.
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* GetDownloadManager() const {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadManager* download_manager =
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserContext::GetDownloadManager(browser()->profile());
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(download_manager);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return download_manager;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Path to directory containing test data.
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath test_dir_;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporary directory we will save pages to.
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir save_dir_;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SavePageBrowserTest);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SavePageBrowserTest::~SavePageBrowserTest() {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveHTMLOnly DISABLED_SaveHTMLOnly
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveHTMLOnly SaveHTMLOnly
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_SaveHTMLOnly) {
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, 1,
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
4057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(full_file_name));
4067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(dir));
4077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(test_dir_.Append(base::FilePath(
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTestDir)).Append(FILE_PATH_LITERAL("a.htm")), full_file_name));
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// http://crbug.com/162323
4127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// http://crbug.com/163931
4137dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(SavePageBrowserTest, DISABLED_SaveHTMLOnlyCancel) {
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* manager(GetDownloadManager());
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> downloads;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->GetAllDownloads(&downloads);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, downloads.size());
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItemCreatedObserver creation_observer(manager);
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, -1,
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::CANCELLED));
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // -1 to disable number of files check; we don't update after cancel, and
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // we don't know when the single file completed in relationship to
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the cancel.
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> items;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  creation_observer.WaitForDownloadItem(&items);
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1UL, items.size());
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(url.spec(), items[0]->GetOriginalUrl().spec());
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  items[0]->Cancel(true);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(rdsmith): Fix DII::Cancel() to actually cancel the save package.
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Currently it's ignored.
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(benjhayden): Figure out how to safely wait for SavePackage's finished
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // notification, then expect the contents of the downloaded file.
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass DelayingDownloadManagerDelegate : public ChromeDownloadManagerDelegate {
4497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public:
4507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  explicit DelayingDownloadManagerDelegate(Profile* profile)
4517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : ChromeDownloadManagerDelegate(profile) {
4527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
4537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual bool ShouldCompleteDownload(
4547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      content::DownloadItem* item,
4557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const base::Closure& user_complete_callback) OVERRIDE {
4567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return false;
4577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
4587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
4607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual ~DelayingDownloadManagerDelegate() {}
4617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private:
4637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(DelayingDownloadManagerDelegate);
4647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
4657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SaveHTMLOnlyTabDestroy) {
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* manager(GetDownloadManager());
4697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<DelayingDownloadManagerDelegate> delaying_delegate(
4707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new DelayingDownloadManagerDelegate(browser()->profile()));
4717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  delaying_delegate->SetNextId(content::DownloadItem::kInvalidId + 1);
4727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  manager->SetDelegate(delaying_delegate.get());
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> downloads;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->GetAllDownloads(&downloads);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, downloads.size());
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItemCreatedObserver creation_observer(manager);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> items;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  creation_observer.WaitForDownloadItem(&items);
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(items.size() == 1);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the tab; does this cancel the download?
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetCurrentTab(browser())->Close();
48890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(DownloadItem::CANCELLED, items[0]->GetState());
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(full_file_name));
4917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(dir));
4927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  manager->SetDelegate(NULL);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveViewSourceHTMLOnly DISABLED_SaveViewSourceHTMLOnly
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveViewSourceHTMLOnly SaveViewSourceHTMLOnly
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_SaveViewSourceHTMLOnly) {
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath file_name(FILE_PATH_LITERAL("a.htm"));
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL view_source_url = URLRequestMockHTTPJob::GetMockViewSourceUrl(
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir).Append(file_name));
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL actual_page_url = URLRequestMockHTTPJob::GetMockUrl(
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir).Append(file_name));
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), view_source_url);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, actual_page_url, full_file_name, 1,
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), actual_page_url));
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(full_file_name));
5307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(dir));
5317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).Append(file_name),
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveCompleteHTML DISABLED_SaveCompleteHTML
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveCompleteHTML SaveCompleteHTML
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_SaveCompleteHTML) {
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("b");
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("b", &full_file_name, &dir);
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, 3,
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name, dir, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML));
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(full_file_name));
5657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(dir));
5667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::TextContentsEqual(
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("b.saved1.htm"),
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
5697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("1.png"),
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.png")));
5727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("1.css"),
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.css")));
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoke a save page during the initial navigation.
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (Regression test for http://crbug.com/156538).
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveDuringInitialNavigationIncognito DISABLED_SaveDuringInitialNavigationIncognito
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SaveDuringInitialNavigationIncognito SaveDuringInitialNavigationIncognito
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest,
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       MAYBE_SaveDuringInitialNavigationIncognito) {
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open an Incognito window.
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* incognito = CreateIncognitoBrowser();  // Waits.
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(incognito);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a download item creation waiter on that window.
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItemCreatedObserver creation_observer(
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserContext::GetDownloadManager(incognito->profile()));
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate, unblocking with new tab.
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = URLRequestMockHTTPJob::GetMockUrl(
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir).AppendASCII("b.htm"));
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURLWithDisposition(incognito, url, NEW_FOREGROUND_TAB,
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Save the page before completion.
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("b", &full_file_name, &dir);
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(incognito->profile()),
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(incognito)->SavePage(
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name, dir, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML));
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(incognito, url));
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Confirm download shelf is visible.
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(incognito->window()->IsDownloadShelfVisible());
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We can't check more than this because SavePackage is racing with
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the page load.  If the page load won the race, then SavePackage
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // might have completed. If the page load lost the race, then
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SavePackage will cancel because there aren't any resources to
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // save.
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, NoSave) {
62790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(content::kAboutBlankURL));
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(chrome::CanSavePage(browser()));
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_FileNameFromPageTitle DISABLED_FileNameFromPageTitle
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_FileNameFromPageTitle FileNameFromPageTitle
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_FileNameFromPageTitle) {
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("b");
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name = save_dir_.path().AppendASCII(
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string("Test page for saving page feature") + kAppendedExtension);
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dir = save_dir_.path().AppendASCII(
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Test page for saving page feature_files");
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, 3,
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name, dir, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML));
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(full_file_name));
6637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(dir));
6647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::TextContentsEqual(
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("b.saved2.htm"),
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
6677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("1.png"),
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.png")));
6707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.Append(base::FilePath(kTestDir)).AppendASCII("1.css"),
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.css")));
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/162323
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_RemoveFromList DISABLED_RemoveFromList
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_RemoveFromList RemoveFromList
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_RemoveFromList) {
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name, dir;
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, 1,
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadManager* manager(GetDownloadManager());
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<DownloadItem*> downloads;
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->GetAllDownloads(&downloads);
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1UL, downloads.size());
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadRemovedObserver removed(browser()->profile(), downloads[0]->GetId());
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(manager->RemoveAllDownloads(), 1);
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  removed.WaitForRemoved();
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(full_file_name));
7157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(dir));
7167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::ContentsEqual(test_dir_.Append(base::FilePath(
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTestDir)).Append(FILE_PATH_LITERAL("a.htm")), full_file_name));
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests that a webpage with the title "test.exe" is saved as
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "test.exe.htm".
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We probably don't care to handle this on Linux or Mac.
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, CleanFilenameFromPageTitle) {
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath file_name(FILE_PATH_LITERAL("c.htm"));
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath download_dir =
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadPrefs::FromDownloadManager(GetDownloadManager())->
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          DownloadPath();
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name =
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_dir.AppendASCII(std::string("test.exe") + kAppendedExtension);
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dir = download_dir.AppendASCII("test.exe_files");
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(full_file_name));
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = URLRequestMockHTTPJob::GetMockUrl(
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir).Append(file_name));
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePackageFilePicker::SetShouldPromptUser(false);
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::SavePage(browser());
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(full_file_name));
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::DieFileDie(full_file_name, false));
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::DieFileDie(dir, true));
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SavePageAsMHTMLBrowserTest : public SavePageBrowserTest {
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePageAsMHTMLBrowserTest() {}
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SavePageAsMHTMLBrowserTest();
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kSavePageAsMHTML);
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SavePageAsMHTMLBrowserTest);
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SavePageAsMHTMLBrowserTest::~SavePageAsMHTMLBrowserTest() {
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageAsMHTMLBrowserTest, SavePageAsMHTML) {
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kFileSizeMin = 2758;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("b");
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath download_dir = DownloadPrefs::FromDownloadManager(
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetDownloadManager())->DownloadPath();
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath full_file_name = download_dir.AppendASCII(std::string(
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Test page for saving page feature.mhtml"));
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePackageFilePicker::SetShouldPromptUser(false);
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadPersistedObserver persisted(browser()->profile(), base::Bind(
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &DownloadStoredProperly, url, full_file_name, -1,
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::COMPLETE));
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());
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::SavePage(browser());
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(VerifySavePackageExpectations(browser(), url));
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persisted.WaitForPersisted();
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(full_file_name));
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 actual_file_size = -1;
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::GetFileSize(full_file_name, &actual_file_size));
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(kFileSizeMin, actual_file_size);
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SavePageBrowserTest_NonMHTML) {
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFilePicker::SetShouldPromptUser(false);
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url("data:text/plain,foo");
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner(
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new content::MessageLoopRunner);
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SavePackageFinishedObserver observer(
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile()),
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop_runner->QuitClosure());
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::SavePage(browser());
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_runner->Run();
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath download_dir = DownloadPrefs::FromDownloadManager(
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetDownloadManager())->DownloadPath();
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath filename = download_dir.AppendASCII("dataurl.txt");
8107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(filename));
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string contents;
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(file_util::ReadFileToString(filename, &contents));
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("foo", contents);
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
818