save_page_browsertest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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_path.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/scoped_temp_dir.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_file_util.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/api/prefs/pref_member.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/chrome_download_manager_delegate.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_history.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_prefs.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service_factory.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/url_request_mock_util.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/pref_service.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_persistent_store_info.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/test/net/url_request_mock_http_job.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/save_package_file_picker_chromeos.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/save_package_file_picker.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserContext;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadItem;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadManager;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadPersistentStoreInfo;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::URLRequestMockHTTPJob;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const FilePath::CharType kTestDir[] = FILE_PATH_LITERAL("save_page");
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAppendedExtension[] =
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ".htm";
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ".html";
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Loosely based on logic in DownloadTestObserver.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadItemCreatedObserver : public DownloadManager::Observer {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit DownloadItemCreatedObserver(DownloadManager* manager)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : waiting_(false), manager_(manager) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager->AddObserver(this);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~DownloadItemCreatedObserver() {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (manager_)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manager_->RemoveObserver(this);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the first download item created after object creation.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that this class provides no protection against the download
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // being destroyed between creation and return of WaitForNewDownloadItem();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the caller must guarantee that in some other fashion.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForDownloadItem(std::vector<DownloadItem*>* items_seen) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!manager_) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The manager went away before we were asked to wait; return
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // what we have, even if it's null.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *items_seen = items_seen_;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (items_seen_.empty()) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_ = true;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RunMessageLoop();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_ = false;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *items_seen = items_seen_;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DownloadManager::Observer
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadCreated(
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadManager* manager, DownloadItem* item) OVERRIDE {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_EQ(manager, manager_);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    items_seen_.push_back(item);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (waiting_)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MessageLoopForUI::current()->Quit();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ManagerGoingDown(DownloadManager* manager) OVERRIDE {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->RemoveObserver(this);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_ = NULL;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (waiting_)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MessageLoopForUI::current()->Quit();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* manager_;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> items_seen_;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadItemCreatedObserver);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadPersistedObserver : public DownloadItem::Observer {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit DownloadPersistedObserver(DownloadItem* item)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : waiting_(false), item_(item) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item->AddObserver(this);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~DownloadPersistedObserver() {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (item_)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      item_->RemoveObserver(this);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for download item to get the persisted bit set.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that this class provides no protection against the download
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // being destroyed between creation and return of WaitForPersisted();
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the caller must guarantee that in some other fashion.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForPersisted() {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // In combination with OnDownloadDestroyed() below, verify the
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // above interface contract.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(item_);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (item_->IsPersisted())
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_ = true;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RunMessageLoop();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_ = false;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DownloadItem::Observer
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadUpdated(DownloadItem* item) OVERRIDE {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_EQ(item, item_);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (waiting_ && item->IsPersisted())
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MessageLoopForUI::current()->Quit();
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadDestroyed(DownloadItem* item) OVERRIDE {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (item != item_)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item_->RemoveObserver(this);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item_ = NULL;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem* item_;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadPersistedObserver);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SavePageBrowserTest : public InProcessBrowserTest {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePageBrowserTest() {}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SavePageBrowserTest();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetUp() OVERRIDE {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_dir_));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(save_dir_.CreateUniqueTempDir());
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InProcessBrowserTest::SetUp();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetUpOnMainThread() OVERRIDE {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser()->profile()->GetPrefs()->SetFilePath(
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs::kDownloadDefaultDirectory, save_dir_.path());
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL NavigateToMockURL(const std::string& prefix) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url = URLRequestMockHTTPJob::GetMockUrl(
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FilePath(kTestDir).AppendASCII(prefix + ".htm"));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser(), url);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return url;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns full paths of destination file and directory.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetDestinationPaths(const std::string& prefix,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                FilePath* full_file_name,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                FilePath* dir) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *full_file_name = save_dir_.path().AppendASCII(prefix + ".htm");
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *dir = save_dir_.path().AppendASCII(prefix + "_files");
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* GetCurrentTab(Browser* browser) const {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContents* current_tab = chrome::GetActiveWebContents(browser);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(current_tab);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return current_tab;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool WaitForSavePackageToFinish(Browser* browser, GURL* url_at_finish) const {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_SAVE_PACKAGE_SUCCESSFULLY_FINISHED,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Generally, there should only be one download item created
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // in all of these tests.  If it's already here, grab it; if not,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // wait for it to show up.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<DownloadItem*> items;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadManager* manager(
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserContext::GetDownloadManager(browser->profile()));
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager->GetAllDownloads(&items);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (items.size() == 0u) {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItemCreatedObserver(manager).WaitForDownloadItem(&items);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1u, items.size());
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (1u != items.size())
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadItem* download_item(items[0]);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Note on synchronization:
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // For each Save Page As operation, we create a corresponding shell
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // DownloadItem to display progress to the user.  That DownloadItem
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // goes through its own state transitions, including being persisted
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // out to the history database, and the download shelf is not shown
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // until after the persistence occurs.  Save Package completion (and
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // marking the DownloadItem as completed) occurs asynchronously from
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // persistence.  Thus if we want to examine either UI state or DB
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // state, we need to wait until both the save package operation is
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // complete and the relevant download item has been persisted.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadPersistedObserver(download_item).WaitForPersisted();
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *url_at_finish = content::Details<DownloadItem>(observer.details()).ptr()->
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetOriginalUrl();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* GetDownloadManager() const {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadManager* download_manager =
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserContext::GetDownloadManager(browser()->profile());
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(download_manager);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return download_manager;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void QueryDownloadHistory() {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Query the history system.
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeDownloadManagerDelegate* delegate =
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<ChromeDownloadManagerDelegate*>(
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetDownloadManager()->GetDelegate());
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate->download_history()->Load(
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&SavePageBrowserTest::OnQueryDownloadEntriesComplete,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this)));
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Run message loop until a quit message is sent from
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // OnQueryDownloadEntriesComplete().
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RunMessageLoop();
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnQueryDownloadEntriesComplete(
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<DownloadPersistentStoreInfo>* entries) {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history_entries_ = *entries;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Indicate thet we have received the history and can continue.
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MessageLoopForUI::current()->Quit();
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct DownloadPersistentStoreInfoMatch
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public std::unary_function<DownloadPersistentStoreInfo, bool> {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadPersistentStoreInfoMatch(const GURL& url,
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const FilePath& path,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     int64 num_files,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     DownloadItem::DownloadState state)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : url_(url),
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        path_(path),
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        num_files_(num_files),
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        state_(state) {}
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool operator() (const DownloadPersistentStoreInfo& info) const {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return info.url == url_ &&
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             info.path == path_ &&
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             // For non-MHTML save packages, received_bytes is actually the
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             // number of files.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             ((num_files_ < 0) ||
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              (info.received_bytes == num_files_)) &&
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             info.total_bytes == 0 &&
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             info.state == state_;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url_;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FilePath path_;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 num_files_;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadItem::DownloadState state_;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckDownloadHistory(const GURL& url,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const FilePath& path,
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int64 num_files,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            DownloadItem::DownloadState state) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the relevant download item made it into the history.
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<DownloadItem*> downloads;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetDownloadManager()->GetAllDownloads(&downloads);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1u, downloads.size());
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QueryDownloadHistory();
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<DownloadPersistentStoreInfo>::iterator found =
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::find_if(history_entries_.begin(), history_entries_.end(),
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   DownloadPersistentStoreInfoMatch(url, path, num_files,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    state));
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (found == history_entries_.end()) {
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Missing url=" << url.spec()
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << " path=" << path.value()
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << " received=" << num_files
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << " state=" << state;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (size_t index = 0; index < history_entries_.size(); ++index) {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LOG(ERROR) << "History@" << index << ": url="
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   << history_entries_[index].url.spec()
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   << " path=" << history_entries_[index].path.value()
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   << " received=" << history_entries_[index].received_bytes
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   << " total=" << history_entries_[index].total_bytes
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   << " state=" << history_entries_[index].state;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(false);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadPersistentStoreInfo> history_entries_;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Path to directory containing test data.
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath test_dir_;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporary directory we will save pages to.
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedTempDir save_dir_;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SavePageBrowserTest);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SavePageBrowserTest::~SavePageBrowserTest() {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SaveHTMLOnly) {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath full_file_name, dir;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL output_url;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForSavePackageToFinish(browser(), &output_url));
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, output_url);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a.htm is 1 file.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDownloadHistory(url, full_file_name, 1, DownloadItem::COMPLETE);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_util::PathExists(dir));
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_dir_.Append(FilePath(kTestDir)).Append(FILE_PATH_LITERAL("a.htm")),
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SaveHTMLOnlyCancel) {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* manager(GetDownloadManager());
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> downloads;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->GetAllDownloads(&downloads);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, downloads.size());
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath full_file_name, dir;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItemCreatedObserver creation_observer(manager);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> items;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  creation_observer.WaitForDownloadItem(&items);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(items.size() == 1);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  items[0]->Cancel(true);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(rdsmith): Fix DII::Cancel() to actually cancel the save package.
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Currently it's ignored.
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL output_url;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForSavePackageToFinish(browser(), &output_url));
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, output_url);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // -1 to disable number of files check; we don't update after cancel, and
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we don't know when the single file completed in relationship to
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the cancel.
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDownloadHistory(url, full_file_name, -1, DownloadItem::CANCELLED);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_util::PathExists(dir));
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_dir_.Append(FilePath(kTestDir)).Append(FILE_PATH_LITERAL("a.htm")),
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SaveHTMLOnlyTabDestroy) {
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManager* manager(GetDownloadManager());
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> downloads;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->GetAllDownloads(&downloads);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, downloads.size());
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath full_file_name, dir;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItemCreatedObserver creation_observer(manager);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<DownloadItem*> items;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  creation_observer.WaitForDownloadItem(&items);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(items.size() == 1);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the tab; does this cancel the download?
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetCurrentTab(browser())->Close();
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(items[0]->IsCancelled());
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_util::PathExists(full_file_name));
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_util::PathExists(dir));
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SaveViewSourceHTMLOnly) {
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath file_name(FILE_PATH_LITERAL("a.htm"));
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL view_source_url = URLRequestMockHTTPJob::GetMockViewSourceUrl(
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePath(kTestDir).Append(file_name));
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL actual_page_url = URLRequestMockHTTPJob::GetMockUrl(
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePath(kTestDir).Append(file_name));
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), view_source_url);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath full_file_name, dir;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
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)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL output_url;
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForSavePackageToFinish(browser(), &output_url));
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(actual_page_url, output_url);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a.htm is 1 file.
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDownloadHistory(actual_page_url, full_file_name, 1,
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DownloadItem::COMPLETE);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_util::PathExists(dir));
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_dir_.Append(FilePath(kTestDir)).Append(file_name),
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SaveCompleteHTML) {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("b");
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath full_file_name, dir;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("b", &full_file_name, &dir);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name, dir, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML));
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL output_url;
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForSavePackageToFinish(browser(), &output_url));
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, output_url);
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // b.htm is 3 files.
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDownloadHistory(url, full_file_name, 3, DownloadItem::COMPLETE);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(dir));
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::TextContentsEqual(
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_dir_.Append(FilePath(kTestDir)).AppendASCII("b.saved1.htm"),
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_dir_.Append(FilePath(kTestDir)).AppendASCII("1.png"),
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.png")));
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_dir_.Append(FilePath(kTestDir)).AppendASCII("1.css"),
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.css")));
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoke a save page during the initial navigation.
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (Regression test for http://crbug.com/156538).
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest,
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       SaveDuringInitialNavigationIncognito) {
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open an Incognito window.
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* incognito = CreateIncognitoBrowser();  // Waits.
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(incognito);
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a download item creation waiter on that window.
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItemCreatedObserver creation_observer(
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserContext::GetDownloadManager(incognito->profile()));
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate, unblocking with new tab.
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = URLRequestMockHTTPJob::GetMockUrl(
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePath(kTestDir).AppendASCII("b.htm"));
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURLWithDisposition(incognito, url, NEW_FOREGROUND_TAB,
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Save the page before completion.
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath full_file_name, dir;
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("b", &full_file_name, &dir);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(incognito)->SavePage(
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name, dir, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML));
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL output_url;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForSavePackageToFinish(incognito, &output_url);
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, output_url);
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Confirm download shelf is visible.
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(incognito->window()->IsDownloadShelfVisible());
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We can't check more than this because SavePackage is racing with
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the page load.  If the page load won the race, then SavePackage
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // might have completed. If the page load lost the race, then
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SavePackage will cancel because there aren't any resources to
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // save.
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, NoSave) {
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(chrome::kAboutBlankURL));
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(chrome::CanSavePage(browser()));
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, FileNameFromPageTitle) {
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("b");
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath full_file_name = save_dir_.path().AppendASCII(
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string("Test page for saving page feature") + kAppendedExtension);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath dir = save_dir_.path().AppendASCII(
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Test page for saving page feature_files");
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name, dir, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML));
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL output_url;
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForSavePackageToFinish(browser(), &output_url));
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, output_url);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // b.htm is 3 files.
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDownloadHistory(url, full_file_name, 3, DownloadItem::COMPLETE);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(dir));
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::TextContentsEqual(
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_dir_.Append(FilePath(kTestDir)).AppendASCII("b.saved2.htm"),
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_dir_.Append(FilePath(kTestDir)).AppendASCII("1.png"),
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.png")));
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_dir_.Append(FilePath(kTestDir)).AppendASCII("1.css"),
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir.AppendASCII("1.css")));
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, RemoveFromList) {
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("a");
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath full_file_name, dir;
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetDestinationPaths("a", &full_file_name, &dir);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetCurrentTab(browser())->SavePage(full_file_name, dir,
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        content::SAVE_PAGE_TYPE_AS_ONLY_HTML));
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL output_url;
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForSavePackageToFinish(browser(), &output_url));
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, output_url);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a.htm is 1 file.
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDownloadHistory(url, full_file_name, 1, DownloadItem::COMPLETE);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetDownloadManager()->RemoveAllDownloads(), 1);
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should not be in history.
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryDownloadHistory();
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::find_if(history_entries_.begin(), history_entries_.end(),
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         DownloadPersistentStoreInfoMatch(
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             url, full_file_name, 1, DownloadItem::COMPLETE)),
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      history_entries_.end());
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_util::PathExists(dir));
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::ContentsEqual(
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_dir_.Append(FilePath(kTestDir)).Append(FILE_PATH_LITERAL("a.htm")),
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_file_name));
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests that a webpage with the title "test.exe" is saved as
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "test.exe.htm".
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We probably don't care to handle this on Linux or Mac.
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, CleanFilenameFromPageTitle) {
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FilePath file_name(FILE_PATH_LITERAL("c.htm"));
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath download_dir =
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadPrefs::FromDownloadManager(GetDownloadManager())->
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          DownloadPath();
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath full_file_name =
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_dir.AppendASCII(std::string("test.exe") + kAppendedExtension);
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath dir = download_dir.AppendASCII("test.exe_files");
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_util::PathExists(full_file_name));
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = URLRequestMockHTTPJob::GetMockUrl(
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePath(kTestDir).Append(file_name));
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePackageFilePicker::SetShouldPromptUser(false);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver observer(
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_SAVE_PACKAGE_SUCCESSFULLY_FINISHED,
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::SavePage(browser());
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer.Wait();
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::DieFileDie(full_file_name, false));
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::DieFileDie(dir, true));
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SavePageAsMHTMLBrowserTest : public SavePageBrowserTest {
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePageAsMHTMLBrowserTest() {}
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SavePageAsMHTMLBrowserTest();
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kSavePageAsMHTML);
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SavePageAsMHTMLBrowserTest);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SavePageAsMHTMLBrowserTest::~SavePageAsMHTMLBrowserTest() {
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavePageAsMHTMLBrowserTest, SavePageAsMHTML) {
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kFileSizeMin = 2758;
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = NavigateToMockURL("b");
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath download_dir = DownloadPrefs::FromDownloadManager(
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetDownloadManager())->DownloadPath();
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath full_file_name = download_dir.AppendASCII(std::string(
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Test page for saving page feature.mhtml"));
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePackageFilePickerChromeOS::SetShouldPromptUser(false);
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SavePackageFilePicker::SetShouldPromptUser(false);
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::SavePage(browser());
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL output_url;
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForSavePackageToFinish(browser(), &output_url));
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, output_url);
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckDownloadHistory(url, full_file_name, -1, DownloadItem::COMPLETE);
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::PathExists(full_file_name));
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 actual_file_size = -1;
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::GetFileSize(full_file_name, &actual_file_size));
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(kFileSizeMin, actual_file_size);
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
687