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