1// Copyright (c) 2011 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/logging.h"
6#include "chrome/browser/extensions/extension_apitest.h"
7#include "chrome/browser/ui/browser.h"
8#include "chrome/test/ui_test_utils.h"
9#include "content/browser/tab_contents/tab_contents.h"
10#include "googleurl/src/gurl.h"
11#include "net/base/mock_host_resolver.h"
12
13class ExtensionResourceRequestPolicyTest : public ExtensionApiTest {
14};
15
16// Note, this mostly tests the logic of chrome/renderer/extensions/
17// extension_resource_request_policy.*, but we have it as a browser test so that
18// can make sure it works end-to-end.
19IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest, OriginPrivileges) {
20  host_resolver()->AddRule("*", "127.0.0.1");
21  ASSERT_TRUE(test_server()->Start());
22  ASSERT_TRUE(LoadExtension(test_data_dir_
23      .AppendASCII("extension_resource_request_policy")
24      .AppendASCII("extension")));
25
26  GURL web_resource(
27      test_server()->GetURL(
28          "files/extensions/api_test/extension_resource_request_policy/"
29          "index.html"));
30
31  std::string host_a("a.com");
32  GURL::Replacements make_host_a_com;
33  make_host_a_com.SetHostStr(host_a);
34
35  std::string host_b("b.com");
36  GURL::Replacements make_host_b_com;
37  make_host_b_com.SetHostStr(host_b);
38
39  // A web host that has permission.
40  ui_test_utils::NavigateToURL(
41      browser(), web_resource.ReplaceComponents(make_host_a_com));
42  std::string result;
43  ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
44    browser()->GetSelectedTabContents()->render_view_host(), L"",
45      L"window.domAutomationController.send(document.title)",
46    &result));
47  EXPECT_EQ(result, "Loaded");
48
49  // A web host that loads a non-existent extension.
50  GURL non_existent_extension(
51      test_server()->GetURL(
52          "files/extensions/api_test/extension_resource_request_policy/"
53          "non_existent_extension.html"));
54  ui_test_utils::NavigateToURL(browser(), non_existent_extension);
55  ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
56    browser()->GetSelectedTabContents()->render_view_host(), L"",
57      L"window.domAutomationController.send(document.title)",
58    &result));
59  EXPECT_EQ(result, "Image failed to load");
60
61  // A data URL. Data URLs should always be able to load chrome-extension://
62  // resources.
63  std::string file_source;
64  ASSERT_TRUE(file_util::ReadFileToString(
65      test_data_dir_.AppendASCII("extension_resource_request_policy")
66                    .AppendASCII("index.html"), &file_source));
67  ui_test_utils::NavigateToURL(browser(),
68      GURL(std::string("data:text/html;charset=utf-8,") + file_source));
69  ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
70      browser()->GetSelectedTabContents()->render_view_host(), L"",
71      L"window.domAutomationController.send(document.title)",
72      &result));
73  EXPECT_EQ(result, "Loaded");
74
75  // A different extension. Extensions should always be able to load each
76  // other's resources.
77  ASSERT_TRUE(LoadExtension(test_data_dir_
78      .AppendASCII("extension_resource_request_policy")
79      .AppendASCII("extension2")));
80  ui_test_utils::NavigateToURL(
81      browser(),
82      GURL("chrome-extension://pbkkcbgdkliohhfaeefcijaghglkahja/index.html"));
83  ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
84      browser()->GetSelectedTabContents()->render_view_host(), L"",
85      L"window.domAutomationController.send(document.title)",
86      &result));
87  EXPECT_EQ(result, "Loaded");
88}
89
90IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest,
91                       ExtensionCanLoadHostedAppIcons) {
92  ASSERT_TRUE(LoadExtension(test_data_dir_
93      .AppendASCII("extension_resource_request_policy")
94      .AppendASCII("extension")));
95
96  ASSERT_TRUE(RunExtensionSubtest(
97      "extension_resource_request_policy/extension2/",
98      "can_load_icons_from_hosted_apps.html"));
99}
100
101IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest, Audio) {
102  EXPECT_TRUE(RunExtensionSubtest(
103      "extension_resource_request_policy/extension2",
104      "audio.html"));
105}
106
107IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest, Video) {
108  EXPECT_TRUE(RunExtensionSubtest(
109      "extension_resource_request_policy/extension2",
110      "video.html"));
111}
112