// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/file_path.h"
#include "base/file_util.h"
#include "base/memory/scoped_temp_dir.h"
#include "base/path_service.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/net/url_request_mock_http_job.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/download/download_tab_helper.h"
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/url_constants.h"
#include "chrome/test/in_process_browser_test.h"
#include "chrome/test/ui_test_utils.h"
#include "content/browser/tab_contents/tab_contents.h"
#include "content/common/notification_service.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
static const FilePath::CharType* kTestDir = FILE_PATH_LITERAL("save_page");
static const char* kAppendedExtension =
#if defined(OS_WIN)
".htm";
#else
".html";
#endif
class SavePageBrowserTest : public InProcessBrowserTest {
protected:
void SetUp() {
ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_dir_));
ASSERT_TRUE(save_dir_.CreateUniqueTempDir());
InProcessBrowserTest::SetUp();
}
GURL WaitForSavePackageToFinish() {
ui_test_utils::TestNotificationObserver observer;
ui_test_utils::RegisterAndWait(&observer,
NotificationType::SAVE_PACKAGE_SUCCESSFULLY_FINISHED,
NotificationService::AllSources());
return *Details<GURL>(observer.details()).ptr();
}
// Path to directory containing test data.
FilePath test_dir_;
// Temporary directory we will save pages to.
ScopedTempDir save_dir_;
};
IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SaveHTMLOnly) {
FilePath file_name(FILE_PATH_LITERAL("a.htm"));
GURL url = URLRequestMockHTTPJob::GetMockUrl(
FilePath(kTestDir).Append(file_name));
ui_test_utils::NavigateToURL(browser(), url);
TabContentsWrapper* current_tab = browser()->GetSelectedTabContentsWrapper();
ASSERT_TRUE(current_tab);
FilePath full_file_name = save_dir_.path().Append(file_name);
FilePath dir = save_dir_.path().AppendASCII("a_files");
ASSERT_TRUE(current_tab->download_tab_helper()->SavePage(
full_file_name, dir, SavePackage::SAVE_AS_ONLY_HTML));
EXPECT_EQ(url, WaitForSavePackageToFinish());
if (browser()->SupportsWindowFeature(Browser::FEATURE_DOWNLOADSHELF))
EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
EXPECT_TRUE(file_util::PathExists(full_file_name));
EXPECT_FALSE(file_util::PathExists(dir));
EXPECT_TRUE(file_util::ContentsEqual(
test_dir_.Append(FilePath(kTestDir)).Append(file_name),
full_file_name));
}
IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SaveViewSourceHTMLOnly) {
FilePath file_name(FILE_PATH_LITERAL("a.htm"));
GURL view_source_url = URLRequestMockHTTPJob::GetMockViewSourceUrl(
FilePath(kTestDir).Append(file_name));
GURL actual_page_url = URLRequestMockHTTPJob::GetMockUrl(
FilePath(kTestDir).Append(file_name));
ui_test_utils::NavigateToURL(browser(), view_source_url);
TabContentsWrapper* current_tab = browser()->GetSelectedTabContentsWrapper();
ASSERT_TRUE(current_tab);
FilePath full_file_name = save_dir_.path().Append(file_name);
FilePath dir = save_dir_.path().AppendASCII("a_files");
ASSERT_TRUE(current_tab->download_tab_helper()->SavePage(
full_file_name, dir, SavePackage::SAVE_AS_ONLY_HTML));
EXPECT_EQ(actual_page_url, WaitForSavePackageToFinish());
if (browser()->SupportsWindowFeature(Browser::FEATURE_DOWNLOADSHELF))
EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
EXPECT_TRUE(file_util::PathExists(full_file_name));
EXPECT_FALSE(file_util::PathExists(dir));
EXPECT_TRUE(file_util::ContentsEqual(
test_dir_.Append(FilePath(kTestDir)).Append(file_name),
full_file_name));
}
IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SaveCompleteHTML) {
FilePath file_name(FILE_PATH_LITERAL("b.htm"));
GURL url = URLRequestMockHTTPJob::GetMockUrl(
FilePath(kTestDir).Append(file_name));
ui_test_utils::NavigateToURL(browser(), url);
TabContentsWrapper* current_tab = browser()->GetSelectedTabContentsWrapper();
ASSERT_TRUE(current_tab);
FilePath full_file_name = save_dir_.path().Append(file_name);
FilePath dir = save_dir_.path().AppendASCII("b_files");
ASSERT_TRUE(current_tab->download_tab_helper()->SavePage(
full_file_name, dir, SavePackage::SAVE_AS_COMPLETE_HTML));
EXPECT_EQ(url, WaitForSavePackageToFinish());
if (browser()->SupportsWindowFeature(Browser::FEATURE_DOWNLOADSHELF))
EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
EXPECT_TRUE(file_util::PathExists(full_file_name));
EXPECT_TRUE(file_util::PathExists(dir));
EXPECT_TRUE(file_util::TextContentsEqual(
test_dir_.Append(FilePath(kTestDir)).AppendASCII("b.saved1.htm"),
full_file_name));
EXPECT_TRUE(file_util::ContentsEqual(
test_dir_.Append(FilePath(kTestDir)).AppendASCII("1.png"),
dir.AppendASCII("1.png")));
EXPECT_TRUE(file_util::ContentsEqual(
test_dir_.Append(FilePath(kTestDir)).AppendASCII("1.css"),
dir.AppendASCII("1.css")));
}
IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, NoSave) {
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kAboutBlankURL));
ASSERT_TRUE(browser()->command_updater()->SupportsCommand(IDC_SAVE_PAGE));
EXPECT_FALSE(browser()->command_updater()->IsCommandEnabled(IDC_SAVE_PAGE));
}
IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, FileNameFromPageTitle) {
FilePath file_name(FILE_PATH_LITERAL("b.htm"));
GURL url = URLRequestMockHTTPJob::GetMockUrl(
FilePath(kTestDir).Append(file_name));
ui_test_utils::NavigateToURL(browser(), url);
FilePath full_file_name = save_dir_.path().AppendASCII(
std::string("Test page for saving page feature") + kAppendedExtension);
FilePath dir = save_dir_.path().AppendASCII(
"Test page for saving page feature_files");
TabContentsWrapper* current_tab = browser()->GetSelectedTabContentsWrapper();
ASSERT_TRUE(current_tab);
ASSERT_TRUE(current_tab->download_tab_helper()->SavePage(
full_file_name, dir, SavePackage::SAVE_AS_COMPLETE_HTML));
EXPECT_EQ(url, WaitForSavePackageToFinish());
if (browser()->SupportsWindowFeature(Browser::FEATURE_DOWNLOADSHELF))
EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
EXPECT_TRUE(file_util::PathExists(full_file_name));
EXPECT_TRUE(file_util::PathExists(dir));
EXPECT_TRUE(file_util::TextContentsEqual(
test_dir_.Append(FilePath(kTestDir)).AppendASCII("b.saved2.htm"),
full_file_name));
EXPECT_TRUE(file_util::ContentsEqual(
test_dir_.Append(FilePath(kTestDir)).AppendASCII("1.png"),
dir.AppendASCII("1.png")));
EXPECT_TRUE(file_util::ContentsEqual(
test_dir_.Append(FilePath(kTestDir)).AppendASCII("1.css"),
dir.AppendASCII("1.css")));
}
} // namespace