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