Index: chrome/browser/download/save_page_browsertest.cc |
diff --git a/chrome/browser/download/save_page_browsertest.cc b/chrome/browser/download/save_page_browsertest.cc |
index fcf27876c996b2591033ab1fb27cce3c518ab213..36d155cda9a0fe240ea7e8ad20811215f10420e6 100644 |
--- a/chrome/browser/download/save_page_browsertest.cc |
+++ b/chrome/browser/download/save_page_browsertest.cc |
@@ -12,6 +12,7 @@ |
#include "base/prefs/pref_member.h" |
#include "base/prefs/pref_service.h" |
#include "base/run_loop.h" |
+#include "base/strings/utf_string_conversions.h" |
#include "base/test/test_file_util.h" |
#include "chrome/app/chrome_command_ids.h" |
#include "chrome/browser/download/chrome_download_manager_delegate.h" |
@@ -43,6 +44,7 @@ |
#include "content/public/common/url_constants.h" |
#include "content/public/test/browser_test_utils.h" |
#include "content/public/test/test_utils.h" |
+#include "net/base/filename_util.h" |
#include "net/dns/mock_host_resolver.h" |
#include "net/test/embedded_test_server/embedded_test_server.h" |
#include "net/test/url_request/url_request_mock_http_job.h" |
@@ -308,8 +310,12 @@ class SavePageBrowserTest : public InProcessBrowserTest { |
// Returns full paths of destination file and directory. |
void GetDestinationPaths(const std::string& prefix, |
base::FilePath* full_file_name, |
- base::FilePath* dir) { |
- *full_file_name = save_dir_.path().AppendASCII(prefix + ".htm"); |
+ base::FilePath* dir, |
+ content::SavePageType save_page_type = |
+ content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML) { |
+ std::string extension = |
+ (save_page_type == content::SAVE_PAGE_TYPE_AS_MHTML) ? ".mht" : ".htm"; |
+ *full_file_name = save_dir_.path().AppendASCII(prefix + extension); |
*dir = save_dir_.path().AppendASCII(prefix + "_files"); |
} |
@@ -350,7 +356,8 @@ class SavePageBrowserTest : public InProcessBrowserTest { |
int expected_number_of_files, |
base::FilePath* output_dir, |
base::FilePath* main_file_name) { |
- GetDestinationPaths(prefix_for_output_files, main_file_name, output_dir); |
+ GetDestinationPaths(prefix_for_output_files, main_file_name, output_dir, |
+ save_page_type); |
DownloadPersistedObserver persisted( |
browser()->profile(), |
base::Bind(&DownloadStoredProperly, url, *main_file_name, |
@@ -784,12 +791,13 @@ class SavePageSitePerProcessBrowserTest : public SavePageBrowserTest { |
// Test for crbug.com/526786. |
IN_PROC_BROWSER_TEST_F(SavePageSitePerProcessBrowserTest, SaveAsCompleteHtml) { |
- GURL url(embedded_test_server()->GetURL("a.com", "/save_page/iframes.htm")); |
+ GURL url( |
+ embedded_test_server()->GetURL("a.com", "/save_page/frames-xsite.htm")); |
ui_test_utils::NavigateToURL(browser(), url); |
base::FilePath full_file_name, dir; |
- SaveCurrentTab(url, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML, "iframes", 5, |
- &dir, &full_file_name); |
+ SaveCurrentTab(url, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML, |
+ "frames-xsite-complete-html", 5, &dir, &full_file_name); |
ASSERT_FALSE(HasFailure()); |
EXPECT_TRUE(base::DirectoryExists(dir)); |
@@ -814,24 +822,30 @@ IN_PROC_BROWSER_TEST_F(SavePageSitePerProcessBrowserTest, SaveAsCompleteHtml) { |
// by this particular test). |
std::string main_contents; |
ASSERT_TRUE(base::ReadFileToString(full_file_name, &main_contents)); |
- EXPECT_THAT(main_contents, |
- HasSubstr("<iframe src=\"./iframes_files/a.html\"></iframe>")); |
- EXPECT_THAT(main_contents, |
- HasSubstr("<iframe src=\"./iframes_files/b.html\"></iframe>")); |
- EXPECT_THAT(main_contents, |
- HasSubstr("<img src=\"./iframes_files/1.png\">")); |
+ EXPECT_THAT( |
+ main_contents, |
+ HasSubstr("<iframe " |
+ "src=\"./frames-xsite-complete-html_files/a.html\"></iframe>")); |
+ EXPECT_THAT( |
+ main_contents, |
+ HasSubstr("<iframe " |
+ "src=\"./frames-xsite-complete-html_files/b.html\"></iframe>")); |
+ EXPECT_THAT( |
+ main_contents, |
+ HasSubstr("<img src=\"./frames-xsite-complete-html_files/1.png\">")); |
// Verification of html contents. |
- EXPECT_THAT(main_contents, HasSubstr("896fd88d-a77a-4f46-afd8-24db7d5af9c2")) |
- << "Verifing if content from iframes.htm is present"; |
+ EXPECT_THAT( |
+ main_contents, |
+ HasSubstr("frames-xsite.htm: 896fd88d-a77a-4f46-afd8-24db7d5af9c2")); |
std::string a_contents; |
ASSERT_TRUE(base::ReadFileToString(dir.AppendASCII("a.html"), &a_contents)); |
- EXPECT_THAT(a_contents, HasSubstr("1b8aae2b-e164-462f-bd5b-98aa366205f2")) |
- << "Verifing if content from a.htm is present"; |
+ EXPECT_THAT(a_contents, |
+ HasSubstr("a.htm: 1b8aae2b-e164-462f-bd5b-98aa366205f2")); |
std::string b_contents; |
ASSERT_TRUE(base::ReadFileToString(dir.AppendASCII("b.html"), &b_contents)); |
- EXPECT_THAT(b_contents, HasSubstr("3a35f7fa-96a9-4487-9f18-4470263907fa")) |
- << "Verifing if content from b.htm is present"; |
+ EXPECT_THAT(b_contents, |
+ HasSubstr("b.htm: 3a35f7fa-96a9-4487-9f18-4470263907fa")); |
} |
// Test for crbug.com/538766. |
@@ -839,38 +853,39 @@ IN_PROC_BROWSER_TEST_F(SavePageSitePerProcessBrowserTest, SaveAsCompleteHtml) { |
// (but note that the test only fails with --site-per-process flag). |
IN_PROC_BROWSER_TEST_F(SavePageSitePerProcessBrowserTest, |
DISABLED_SaveAsMHTML) { |
- GURL url(embedded_test_server()->GetURL("a.com", "/save_page/iframes.htm")); |
+ GURL url( |
+ embedded_test_server()->GetURL("a.com", "/save_page/frames-xsite.htm")); |
ui_test_utils::NavigateToURL(browser(), url); |
base::FilePath full_file_name, dir; |
- SaveCurrentTab(url, content::SAVE_PAGE_TYPE_AS_MHTML, "iframes", -1, &dir, |
- &full_file_name); |
+ SaveCurrentTab(url, content::SAVE_PAGE_TYPE_AS_MHTML, "frames-xsite-mhtml", |
+ -1, &dir, &full_file_name); |
ASSERT_FALSE(HasFailure()); |
std::string mhtml; |
ASSERT_TRUE(base::ReadFileToString(full_file_name, &mhtml)); |
// Verify content of main frame, subframes and some savable resources. |
- EXPECT_THAT(mhtml, HasSubstr("896fd88d-a77a-4f46-afd8-24db7d5af9c2")) |
- << "Verifing if content from iframes.htm is present"; |
- EXPECT_THAT(mhtml, HasSubstr("1b8aae2b-e164-462f-bd5b-98aa366205f2")) |
- << "Verifing if content from a.htm is present"; |
- EXPECT_THAT(mhtml, HasSubstr("3a35f7fa-96a9-4487-9f18-4470263907fa")) |
- << "Verifing if content from b.htm is present"; |
+ EXPECT_THAT( |
+ mhtml, |
+ HasSubstr("frames-xsite.htm: 896fd88d-a77a-4f46-afd8-24db7d5af9c2")); |
+ EXPECT_THAT(mhtml, HasSubstr("a.htm: 1b8aae2b-e164-462f-bd5b-98aa366205f2")); |
+ EXPECT_THAT(mhtml, HasSubstr("b.htm: 3a35f7fa-96a9-4487-9f18-4470263907fa")); |
EXPECT_THAT(mhtml, HasSubstr("font-size: 20px;")) |
- << "Verifing if content from 1.css is present"; |
+ << "Verifying if content from 1.css is present"; |
// Verify presence of URLs associated with main frame, subframes and some |
// savable resources. |
// (note that these are single-line regexes). |
- EXPECT_THAT(mhtml, ContainsRegex("Content-Location.*/save_page/iframes.htm")); |
+ EXPECT_THAT(mhtml, |
+ ContainsRegex("Content-Location.*/save_page/frames-xsite.htm")); |
EXPECT_THAT(mhtml, ContainsRegex("Content-Location.*/save_page/a.htm")); |
EXPECT_THAT(mhtml, ContainsRegex("Content-Location.*/save_page/b.htm")); |
EXPECT_THAT(mhtml, ContainsRegex("Content-Location.*/save_page/1.css")); |
EXPECT_THAT(mhtml, ContainsRegex("Content-Location.*/save_page/1.png")); |
- // Verify that 1.png appear in the output only once (despite being referred to |
- // twice - from iframes.htm and from b.htm). |
+ // Verify that 1.png appears in the output only once (despite being referred |
+ // to twice - from iframes.htm and from b.htm). |
int count = 0; |
size_t pos = 0; |
for (;;) { |
@@ -883,4 +898,174 @@ IN_PROC_BROWSER_TEST_F(SavePageSitePerProcessBrowserTest, |
EXPECT_EQ(1, count) << "Verify number of image/png parts in the mhtml output"; |
} |
+// Test suite that verifies that the frame tree "looks" the same before |
+// and after a save-page-as. |
+class SavePageMultiFrameBrowserTest : public SavePageSitePerProcessBrowserTest { |
+ protected: |
+ void TestMultiFramePage(content::SavePageType save_page_type, |
+ const GURL& url, |
+ int expected_number_of_frames, |
+ const std::vector<std::string>& expected_substrings) { |
+ // Navigate to the test page and verify if test expectations |
+ // are met (this is mostly a sanity check - a failure to meet |
+ // expectations would probably mean that there is a test bug |
+ // (i.e. that we got called with wrong expected_foo argument). |
+ ui_test_utils::NavigateToURL(browser(), url); |
+ DLOG(INFO) << "Verifying test expectations for original page... : " |
+ << GetCurrentTab(browser())->GetLastCommittedURL(); |
+ // TODO(lukasza/paulmeyer): crbug.com/457440: Can uncomment |
+ // the assertion below once find-in-page works for oop frames. |
+ // AssertExpectationsAboutCurrentTab(expected_number_of_frames, |
+ // expected_substrings); |
+ |
+ // Save the page. |
+ base::FilePath full_file_name, dir; |
+ SaveCurrentTab(url, save_page_type, "save_result", -1, &dir, |
+ &full_file_name); |
+ ASSERT_FALSE(HasFailure()); |
+ |
+ // Stop the test server (to make sure the locally saved page |
+ // is self-contained / won't try to open original resources). |
+ ASSERT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete()); |
+ |
+ // Open the saved page and verify if test expectations are |
+ // met (i.e. if the same expectations are met for "after" |
+ // [saved version of the page] as for the "before" |
+ // [the original version of the page]. |
+ ui_test_utils::NavigateToURL(browser(), |
+ GURL(net::FilePathToFileURL(full_file_name))); |
+ DLOG(INFO) << "Verifying test expectations for saved page... : " |
+ << GetCurrentTab(browser())->GetLastCommittedURL(); |
+ AssertExpectationsAboutCurrentTab(expected_number_of_frames, |
+ expected_substrings); |
+ } |
+ |
+ private: |
+ void AssertExpectationsAboutCurrentTab( |
+ int expected_number_of_frames, |
+ const std::vector<std::string>& expected_substrings) { |
+ int actual_number_of_frames = 0; |
+ GetCurrentTab(browser())->ForEachFrame(base::Bind( |
+ &IncrementInteger, base::Unretained(&actual_number_of_frames))); |
+ EXPECT_EQ(expected_number_of_frames, actual_number_of_frames); |
+ |
+ for (const auto& expected_substring : expected_substrings) { |
+ int actual_number_of_matches = ui_test_utils::FindInPage( |
+ GetCurrentTab(browser()), base::UTF8ToUTF16(expected_substring), |
+ true, // |forward| |
+ true, // |case_sensitive| |
+ nullptr, nullptr); |
+ |
+ EXPECT_EQ(1, actual_number_of_matches) |
+ << "Verifying if \"" << expected_substring << "\" appears " |
+ << "exactly once in the web-contents text"; |
+ } |
+ |
+ int actual_number_of_errors = ui_test_utils::FindInPage( |
+ GetCurrentTab(browser()), base::UTF8ToUTF16("err"), |
+ true, // |forward| |
+ false, // |case_sensitive| |
+ nullptr, nullptr); |
+ EXPECT_EQ(0, actual_number_of_errors); |
+ } |
+ |
+ static void IncrementInteger(int* i, content::RenderFrameHost* /* unused */) { |
+ (*i)++; |
+ } |
+}; |
+ |
+// TODO(lukasza): Pivot on mhtml-vs-complete-html using test params |
+// (once all SavePageMultiFrameBrowserTest are enabled). |
+ |
+IN_PROC_BROWSER_TEST_F(SavePageMultiFrameBrowserTest, |
+ CrossSiteFrames_CompleteHtml) { |
+ std::vector<std::string> expected_substrings{ |
+ "frames-xsite.htm: 896fd88d-a77a-4f46-afd8-24db7d5af9c2", |
+ "a.htm: 1b8aae2b-e164-462f-bd5b-98aa366205f2", |
+ "b.htm: 3a35f7fa-96a9-4487-9f18-4470263907fa", |
+ }; |
+ GURL url( |
+ embedded_test_server()->GetURL("a.com", "/save_page/frames-xsite.htm")); |
+ TestMultiFramePage(content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML, url, 3, |
+ expected_substrings); |
+} |
+ |
+// Test for crbug.com/538766 and crbug.com/539936. |
+// Disabled because both bugs are not yet fixed. |
+IN_PROC_BROWSER_TEST_F(SavePageMultiFrameBrowserTest, |
+ DISABLED_CrossSiteFrames_MHTML) { |
+ std::vector<std::string> expected_substrings{ |
+ "frames-xsite.htm: 896fd88d-a77a-4f46-afd8-24db7d5af9c2", |
+ "a.htm: 1b8aae2b-e164-462f-bd5b-98aa366205f2", |
+ "b.htm: 3a35f7fa-96a9-4487-9f18-4470263907fa", |
+ }; |
+ GURL url( |
+ embedded_test_server()->GetURL("a.com", "/save_page/frames-xsite.htm")); |
+ TestMultiFramePage(content::SAVE_PAGE_TYPE_AS_MHTML, url, 3, |
+ expected_substrings); |
+} |
+ |
+// Test for crbug.com/553478 (complete html part). |
+IN_PROC_BROWSER_TEST_F(SavePageMultiFrameBrowserTest, |
+ DISABLED_ObjectElements_CompleteHtml) { |
+ // 4 = main frame + iframe + object w/ html doc + object w/ pdf doc |
+ // (svg and png objects do not get a separate frame) |
+ int expected_number_of_frames = 4; |
+ |
+ std::vector<std::string> expected_substrings{ |
+ "frames-objects.htm: 8da13db4-a512-4d9b-b1c5-dc1c134234b9", |
+ "a.htm: 1b8aae2b-e164-462f-bd5b-98aa366205f2", |
+ "b.htm: 3a35f7fa-96a9-4487-9f18-4470263907fa", |
+ }; |
+ GURL url( |
+ embedded_test_server()->GetURL("a.com", "/save_page/frames-objects.htm")); |
+ TestMultiFramePage(content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML, url, |
+ expected_number_of_frames, expected_substrings); |
+} |
+ |
+// Test for crbug.com/553478 (mhtml part). |
+// See crbug.com/553478#c3 for some MHTML-specific notes. |
+IN_PROC_BROWSER_TEST_F(SavePageMultiFrameBrowserTest, |
+ DISABLED_ObjectElements_MHTML) { |
+ // 4 = main frame + iframe + object w/ html doc + object w/ pdf doc |
+ // (svg and png objects do not get a separate frame) |
+ int expected_number_of_frames = 4; |
+ |
+ std::vector<std::string> expected_substrings{ |
+ "frames-objects.htm: 8da13db4-a512-4d9b-b1c5-dc1c134234b9", |
+ "a.htm: 1b8aae2b-e164-462f-bd5b-98aa366205f2", |
+ "b.htm: 3a35f7fa-96a9-4487-9f18-4470263907fa", |
+ }; |
+ GURL url( |
+ embedded_test_server()->GetURL("a.com", "/save_page/frames-objects.htm")); |
+ TestMultiFramePage(content::SAVE_PAGE_TYPE_AS_MHTML, url, |
+ expected_number_of_frames, expected_substrings); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(SavePageMultiFrameBrowserTest, AboutBlank_CompleteHtml) { |
+ std::vector<std::string> expected_substrings{ |
+ "main: acb0609d-eb10-4c26-83e2-ad8afb7b0ff3", |
+ "sub1: b124df3a-d39f-47a1-ae04-5bb5d0bf549e", |
+ "sub2: 07014068-604d-45ae-884f-a068cfe7bc0a", |
+ "sub3: 06cc8fcc-c692-4a1a-a10f-1645b746e8f4", |
+ }; |
+ GURL url(embedded_test_server()->GetURL("a.com", |
+ "/save_page/frames-about-blank.htm")); |
+ TestMultiFramePage(content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML, url, 4, |
+ expected_substrings); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(SavePageMultiFrameBrowserTest, AboutBlank_MHTML) { |
+ std::vector<std::string> expected_substrings{ |
+ "main: acb0609d-eb10-4c26-83e2-ad8afb7b0ff3", |
+ "sub1: b124df3a-d39f-47a1-ae04-5bb5d0bf549e", |
+ "sub2: 07014068-604d-45ae-884f-a068cfe7bc0a", |
+ "sub3: 06cc8fcc-c692-4a1a-a10f-1645b746e8f4", |
+ }; |
+ GURL url(embedded_test_server()->GetURL("a.com", |
+ "/save_page/frames-about-blank.htm")); |
+ TestMultiFramePage(content::SAVE_PAGE_TYPE_AS_MHTML, url, 4, |
+ expected_substrings); |
+} |
+ |
} // namespace |