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