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