1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h" 63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/file_util.h" 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_temp_dir.h" 83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/path_service.h" 9513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/app/chrome_command_ids.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/net/url_request_mock_http_job.h" 114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_window.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/download/download_tab_helper.h" 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_paths.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/url_constants.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/in_process_browser_test.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui_test_utils.h" 19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h" 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const FilePath::CharType* kTestDir = FILE_PATH_LITERAL("save_page"); 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const char* kAppendedExtension = 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ".htm"; 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ".html"; 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SavePageBrowserTest : public InProcessBrowserTest { 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetUp() { 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_dir_)); 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(save_dir_.CreateUniqueTempDir()); 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InProcessBrowserTest::SetUp(); 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL WaitForSavePackageToFinish() { 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::TestNotificationObserver observer; 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::RegisterAndWait(&observer, 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationType::SAVE_PACKAGE_SUCCESSFULLY_FINISHED, 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::AllSources()); 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return *Details<GURL>(observer.details()).ptr(); 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Path to directory containing test data. 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath test_dir_; 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Temporary directory we will save pages to. 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScopedTempDir save_dir_; 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SaveHTMLOnly) { 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath file_name(FILE_PATH_LITERAL("a.htm")); 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url = URLRequestMockHTTPJob::GetMockUrl( 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath(kTestDir).Append(file_name)); 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(browser(), url); 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TabContentsWrapper* current_tab = browser()->GetSelectedTabContentsWrapper(); 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(current_tab); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath full_file_name = save_dir_.path().Append(file_name); 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath dir = save_dir_.path().AppendASCII("a_files"); 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(current_tab->download_tab_helper()->SavePage( 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen full_file_name, dir, SavePackage::SAVE_AS_ONLY_HTML)); 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(url, WaitForSavePackageToFinish()); 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (browser()->SupportsWindowFeature(Browser::FEATURE_DOWNLOADSHELF)) 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(file_util::PathExists(full_file_name)); 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(file_util::PathExists(dir)); 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(file_util::ContentsEqual( 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch test_dir_.Append(FilePath(kTestDir)).Append(file_name), 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch full_file_name)); 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SaveViewSourceHTMLOnly) { 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath file_name(FILE_PATH_LITERAL("a.htm")); 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL view_source_url = URLRequestMockHTTPJob::GetMockViewSourceUrl( 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath(kTestDir).Append(file_name)); 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL actual_page_url = URLRequestMockHTTPJob::GetMockUrl( 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath(kTestDir).Append(file_name)); 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(browser(), view_source_url); 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TabContentsWrapper* current_tab = browser()->GetSelectedTabContentsWrapper(); 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(current_tab); 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath full_file_name = save_dir_.path().Append(file_name); 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath dir = save_dir_.path().AppendASCII("a_files"); 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(current_tab->download_tab_helper()->SavePage( 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen full_file_name, dir, SavePackage::SAVE_AS_ONLY_HTML)); 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(actual_page_url, WaitForSavePackageToFinish()); 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (browser()->SupportsWindowFeature(Browser::FEATURE_DOWNLOADSHELF)) 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(file_util::PathExists(full_file_name)); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(file_util::PathExists(dir)); 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(file_util::ContentsEqual( 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch test_dir_.Append(FilePath(kTestDir)).Append(file_name), 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch full_file_name)); 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SaveCompleteHTML) { 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath file_name(FILE_PATH_LITERAL("b.htm")); 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url = URLRequestMockHTTPJob::GetMockUrl( 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath(kTestDir).Append(file_name)); 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(browser(), url); 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TabContentsWrapper* current_tab = browser()->GetSelectedTabContentsWrapper(); 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(current_tab); 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath full_file_name = save_dir_.path().Append(file_name); 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath dir = save_dir_.path().AppendASCII("b_files"); 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(current_tab->download_tab_helper()->SavePage( 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen full_file_name, dir, SavePackage::SAVE_AS_COMPLETE_HTML)); 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(url, WaitForSavePackageToFinish()); 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (browser()->SupportsWindowFeature(Browser::FEATURE_DOWNLOADSHELF)) 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(file_util::PathExists(full_file_name)); 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(file_util::PathExists(dir)); 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(file_util::TextContentsEqual( 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch test_dir_.Append(FilePath(kTestDir)).AppendASCII("b.saved1.htm"), 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch full_file_name)); 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(file_util::ContentsEqual( 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch test_dir_.Append(FilePath(kTestDir)).AppendASCII("1.png"), 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dir.AppendASCII("1.png"))); 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(file_util::ContentsEqual( 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch test_dir_.Append(FilePath(kTestDir)).AppendASCII("1.css"), 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dir.AppendASCII("1.css"))); 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(SavePageBrowserTest, NoSave) { 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(browser(), GURL(chrome::kAboutBlankURL)); 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(browser()->command_updater()->SupportsCommand(IDC_SAVE_PAGE)); 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(browser()->command_updater()->IsCommandEnabled(IDC_SAVE_PAGE)); 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(SavePageBrowserTest, FileNameFromPageTitle) { 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath file_name(FILE_PATH_LITERAL("b.htm")); 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url = URLRequestMockHTTPJob::GetMockUrl( 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath(kTestDir).Append(file_name)); 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(browser(), url); 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath full_file_name = save_dir_.path().AppendASCII( 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string("Test page for saving page feature") + kAppendedExtension); 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath dir = save_dir_.path().AppendASCII( 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Test page for saving page feature_files"); 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TabContentsWrapper* current_tab = browser()->GetSelectedTabContentsWrapper(); 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(current_tab); 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(current_tab->download_tab_helper()->SavePage( 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen full_file_name, dir, SavePackage::SAVE_AS_COMPLETE_HTML)); 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(url, WaitForSavePackageToFinish()); 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (browser()->SupportsWindowFeature(Browser::FEATURE_DOWNLOADSHELF)) 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(file_util::PathExists(full_file_name)); 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(file_util::PathExists(dir)); 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(file_util::TextContentsEqual( 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch test_dir_.Append(FilePath(kTestDir)).AppendASCII("b.saved2.htm"), 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch full_file_name)); 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(file_util::ContentsEqual( 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch test_dir_.Append(FilePath(kTestDir)).AppendASCII("1.png"), 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dir.AppendASCII("1.png"))); 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(file_util::ContentsEqual( 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch test_dir_.Append(FilePath(kTestDir)).AppendASCII("1.css"), 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dir.AppendASCII("1.css"))); 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace 187