1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/bind.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/command_line.h" 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/file_path.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/web_contents.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/content_switches.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/renderer/render_view.h" 11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/test/content_browser_test.h" 12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/test/content_browser_test_utils.h" 1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/renderer/savable_resources.h" 143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell.h" 15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/base/filename_util.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace content { 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class SavableResourcesTest : public ContentBrowserTest { 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) command_line->AppendSwitch(switches::kSingleProcess); 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Don't want to try to create a GPU process. 250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch command_line->AppendSwitch(switches::kDisableGpu); 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Test function GetAllSavableResourceLinksForCurrentPage with a web page. 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We expect result of GetAllSavableResourceLinksForCurrentPage exactly 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // matches expected_resources_set. 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void GetSavableResourceLinksForPage( 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& page_file_path, 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::set<GURL>& expected_resources_set) { 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Convert local file path to file URL. 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL file_url = net::FilePathToFileURL(page_file_path); 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Load the test file. 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NavigateToURL(shell(), file_url); 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostTaskToInProcessRendererAndWait( 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&SavableResourcesTest::CheckResources, 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(this), 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_file_path, 4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) expected_resources_set, 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) file_url, 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shell()->web_contents()->GetRoutingID())); 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void CheckResources(const base::FilePath& page_file_path, 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::set<GURL>& expected_resources_set, 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL& file_url, 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int render_view_id) { 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Get all savable resource links for the page. 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<GURL> resources_list; 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<GURL> referrer_urls_list; 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<blink::WebReferrerPolicy> referrer_policies_list; 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<GURL> frames_list; 5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SavableResourcesResult result(&resources_list, 5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &referrer_urls_list, 6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &referrer_policies_list, 6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &frames_list); 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* savable_schemes[] = { 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http", 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "https", 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "file", 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderView* render_view = RenderView::FromRoutingID(render_view_id); 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(GetAllSavableResourceLinksForCurrentPage( 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_view->GetWebView(), file_url, &result, savable_schemes)); 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check all links of sub-resource 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (std::vector<GURL>::const_iterator cit = resources_list.begin(); 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cit != resources_list.end(); ++cit) { 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(expected_resources_set.find(*cit) != 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expected_resources_set.end()); 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check all links of frame. 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (std::vector<GURL>::const_iterator cit = frames_list.begin(); 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cit != frames_list.end(); ++cit) { 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(expected_resources_set.find(*cit) != 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expected_resources_set.end()); 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test function GetAllSavableResourceLinksForCurrentPage with a web page 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// which has valid savable resource links. 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavableResourcesTest, 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetSavableResourceLinksWithPageHasValidLinks) { 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::set<GURL> expected_resources_set; 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* expected_sub_resource_links[] = { 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "file:///c:/yt/css/base_all-vfl36460.css", 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "file:///c:/yt/js/base_all_with_bidi-vfl36451.js", 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "file:///c:/yt/img/pixel-vfl73.gif" 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* expected_frame_links[] = { 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "youtube_1.htm", 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "youtube_2.htm" 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Add all expected links of sub-resource to expected set. 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < arraysize(expected_sub_resource_links); ++i) 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expected_resources_set.insert(GURL(expected_sub_resource_links[i])); 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Add all expected links of frame to expected set. 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < arraysize(expected_frame_links); ++i) { 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath expected_frame_url = 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetTestFilePath("dom_serializer", expected_frame_links[i]); 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expected_resources_set.insert( 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::FilePathToFileURL(expected_frame_url)); 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath page_file_path = 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetTestFilePath("dom_serializer", "youtube_1.htm"); 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetSavableResourceLinksForPage(page_file_path, expected_resources_set); 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test function GetAllSavableResourceLinksForCurrentPage with a web page 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// which does not have valid savable resource links. 12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SavableResourcesTest, 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetSavableResourceLinksWithPageHasInvalidLinks) { 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::set<GURL> expected_resources_set; 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* expected_frame_links[] = { 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "youtube_2.htm" 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Add all expected links of frame to expected set. 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < arraysize(expected_frame_links); ++i) { 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath expected_frame_url = 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetTestFilePath("dom_serializer", expected_frame_links[i]); 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expected_resources_set.insert( 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::FilePathToFileURL(expected_frame_url)); 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath page_file_path = 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetTestFilePath("dom_serializer", "youtube_2.htm"); 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetSavableResourceLinksForPage(page_file_path, expected_resources_set); 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace content 143