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 544d49935ad23def57a279a2ebfcfeb6611b5b31..322a15ea508e92853abaab9563de8364a9dff1db 100644 |
--- a/chrome/browser/download/save_page_browsertest.cc |
+++ b/chrome/browser/download/save_page_browsertest.cc |
@@ -18,6 +18,7 @@ |
#include "base/path_service.h" |
#include "base/run_loop.h" |
#include "base/strings/string_util.h" |
+#include "base/strings/stringprintf.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/test/test_file_util.h" |
#include "build/build_config.h" |
@@ -811,6 +812,41 @@ IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SaveDownloadableIFrame) { |
EXPECT_TRUE(base::PathExists(dir.AppendASCII("no-such-file.html"))); |
} |
+// Test that file: URI won't be saved when referred to from an HTTP page. |
+// See also https://crbug.com/616429. |
+IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SaveUnauthorizedResource) { |
+ GURL url = NavigateToMockURL("unauthorized-access"); |
+ |
+ // Create a test file (that the web page should not have access to). |
+ base::ScopedTempDir temp_dir2; |
+ ASSERT_TRUE(temp_dir2.CreateUniqueTempDir()); |
+ base::FilePath file_path = |
+ temp_dir2.path().Append(FILE_PATH_LITERAL("should-not-save.jpg")); |
+ std::string file_content("fake-jpg"); |
+ ASSERT_LT( |
+ 0, base::WriteFile(file_path, file_content.data(), file_content.size())); |
+ |
+ // Refer to the test file from the test page. |
+ GURL file_url = net::FilePathToFileURL(file_path); |
+ ASSERT_TRUE(ExecuteScript( |
+ browser()->tab_strip_model()->GetWebContentsAt(0), |
+ base::StringPrintf("document.getElementById('resource1').src = '%s';", |
+ file_url.spec().data()))); |
+ |
+ // Save the current page. |
+ base::FilePath full_file_name, dir; |
+ SaveCurrentTab(url, content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML, |
+ "unauthorized-access", 2, &dir, &full_file_name); |
+ |
+ // We should not save resource that the web page didn't have access to. |
+ // (because executing a resource request can have side effects - for example |
+ // after https://crbug.com/590714 a website from the internet should not be |
+ // able to issue a resource request to an intranet website and trigger |
+ // server-side actions in the internet; this test uses a file: URI as a |
+ // canary for detecting whether a website can access restricted resources). |
+ EXPECT_FALSE(base::PathExists(dir.AppendASCII("should-not-save.jpg"))); |
+} |
+ |
// Test suite that allows testing --site-per-process against cross-site frames. |
// See http://dev.chromium.org/developers/design-documents/site-isolation. |
class SavePageSitePerProcessBrowserTest : public SavePageBrowserTest { |
@@ -1021,6 +1057,38 @@ class SavePageOriginalVsSavedComparisonTest |
expected_substrings); |
} |
+ // Helper method to deduplicate some code across 2 tests. |
+ void RunObjectElementsTest(GURL url) { |
+ content::SavePageType save_page_type = GetParam(); |
+ |
+ // 7 comes from: |
+ // - main frame (frames-objects.htm) |
+ // - object with frame-nested.htm + 2 subframes (frames-nested2.htm + b.htm) |
+ // - iframe with a.htm |
+ // - object with svg.svg |
+ // - object with text.txt |
+ // (pdf and png objects do not get a separate frame) |
+ int expected_number_of_frames = 7; |
+ |
+ std::string arr[] = { |
+ "frames-objects.htm: 8da13db4-a512-4d9b-b1c5-dc1c134234b9", |
+ "a.htm: 1b8aae2b-e164-462f-bd5b-98aa366205f2", |
+ "b.htm: 3a35f7fa-96a9-4487-9f18-4470263907fa", |
+ "frames-nested.htm: 4388232f-8d45-4d2e-9807-721b381be153", |
+ "frames-nested2.htm: 6d23dc47-f283-4977-96ec-66bcf72301a4", |
+ "text-object.txt: ae52dd09-9746-4b7e-86a6-6ada5e2680c2", |
+ }; |
+ std::vector<std::string> expected_substrings(std::begin(arr), |
+ std::end(arr)); |
+ |
+ // TODO(lukasza): crbug.com/553478: Enable <object> testing of MHTML. |
+ if (save_page_type == content::SAVE_PAGE_TYPE_AS_MHTML) |
+ return; |
+ |
+ TestOriginalVsSavedPage(save_page_type, url, expected_number_of_frames, |
+ expected_substrings); |
+ } |
+ |
private: |
void AssertExpectationsAboutCurrentTab( |
int expected_number_of_frames, |
@@ -1090,31 +1158,24 @@ IN_PROC_BROWSER_TEST_P(SavePageOriginalVsSavedComparisonTest, CrossSite) { |
// Test compares original-vs-saved for a page with <object> elements. |
// (see crbug.com/553478). |
-IN_PROC_BROWSER_TEST_P(SavePageOriginalVsSavedComparisonTest, ObjectElements) { |
- content::SavePageType save_page_type = GetParam(); |
- |
- // 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 = 6; |
- |
- std::string arr[] = { |
- "frames-objects.htm: 8da13db4-a512-4d9b-b1c5-dc1c134234b9", |
- "a.htm: 1b8aae2b-e164-462f-bd5b-98aa366205f2", |
- "b.htm: 3a35f7fa-96a9-4487-9f18-4470263907fa", |
- "frames-nested.htm: 4388232f-8d45-4d2e-9807-721b381be153", |
- "frames-nested2.htm: 6d23dc47-f283-4977-96ec-66bcf72301a4", |
- }; |
- std::vector<std::string> expected_substrings(std::begin(arr), std::end(arr)); |
- |
+IN_PROC_BROWSER_TEST_P(SavePageOriginalVsSavedComparisonTest, |
+ ObjectElementsViaHttp) { |
GURL url( |
embedded_test_server()->GetURL("a.com", "/save_page/frames-objects.htm")); |
- // TODO(lukasza): crbug.com/553478: Enable <object> testing of MHTML. |
- if (save_page_type == content::SAVE_PAGE_TYPE_AS_MHTML) |
- return; |
+ RunObjectElementsTest(url); |
+} |
+ |
+// Tests that saving a page from file: URI works. |
+IN_PROC_BROWSER_TEST_P(SavePageOriginalVsSavedComparisonTest, |
+ ObjectElementsViaFile) { |
+ base::FilePath test_data_dir; |
+ ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir)); |
+ GURL url(net::FilePathToFileURL( |
+ test_data_dir.Append(FILE_PATH_LITERAL("save_page/frames-objects.htm")))); |
+ EXPECT_TRUE(url.SchemeIsFile()); |
- TestOriginalVsSavedPage(save_page_type, url, expected_number_of_frames, |
- expected_substrings); |
+ RunObjectElementsTest(url); |
} |
// Test compares original-vs-saved for a page with frames at about:blank uri. |