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/command_line.h" 6#include "base/logging.h" 7#include "chrome/browser/extensions/extension_apitest.h" 8#include "chrome/browser/ui/browser.h" 9#include "chrome/browser/ui/tabs/tab_strip_model.h" 10#include "chrome/test/base/test_switches.h" 11#include "chrome/test/base/ui_test_utils.h" 12#include "content/public/browser/web_contents.h" 13#include "content/public/test/browser_test_utils.h" 14#include "extensions/common/switches.h" 15#include "net/dns/mock_host_resolver.h" 16#include "url/gurl.h" 17 18class ExtensionResourceRequestPolicyTest : public ExtensionApiTest { 19 protected: 20 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 21 ExtensionApiTest::SetUpCommandLine(command_line); 22 command_line->AppendSwitch( 23 extensions::switches::kAllowLegacyExtensionManifests); 24 } 25}; 26 27// Note, this mostly tests the logic of chrome/renderer/extensions/ 28// extension_resource_request_policy.*, but we have it as a browser test so that 29// can make sure it works end-to-end. 30IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest, OriginPrivileges) { 31#if defined(OS_WIN) && defined(USE_ASH) 32 // Disable this test in Metro+Ash for now (http://crbug.com/262796). 33 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 34 return; 35#endif 36 37 host_resolver()->AddRule("*", "127.0.0.1"); 38 ASSERT_TRUE(test_server()->Start()); 39 ASSERT_TRUE(LoadExtensionWithFlags(test_data_dir_ 40 .AppendASCII("extension_resource_request_policy") 41 .AppendASCII("extension"), 42 // Tests manifest_version 1 behavior, so warnings are expected. 43 ExtensionBrowserTest::kFlagIgnoreManifestWarnings)); 44 45 GURL web_resource( 46 test_server()->GetURL( 47 "files/extensions/api_test/extension_resource_request_policy/" 48 "index.html")); 49 50 std::string host_a("a.com"); 51 GURL::Replacements make_host_a_com; 52 make_host_a_com.SetHostStr(host_a); 53 54 std::string host_b("b.com"); 55 GURL::Replacements make_host_b_com; 56 make_host_b_com.SetHostStr(host_b); 57 58 // A web host that has permission. 59 ui_test_utils::NavigateToURL( 60 browser(), web_resource.ReplaceComponents(make_host_a_com)); 61 std::string result; 62 ASSERT_TRUE(content::ExecuteScriptAndExtractString( 63 browser()->tab_strip_model()->GetActiveWebContents(), 64 "window.domAutomationController.send(document.title)", 65 &result)); 66 EXPECT_EQ(result, "Loaded"); 67 68 // A web host that loads a non-existent extension. 69 GURL non_existent_extension( 70 test_server()->GetURL( 71 "files/extensions/api_test/extension_resource_request_policy/" 72 "non_existent_extension.html")); 73 ui_test_utils::NavigateToURL(browser(), non_existent_extension); 74 ASSERT_TRUE(content::ExecuteScriptAndExtractString( 75 browser()->tab_strip_model()->GetActiveWebContents(), 76 "window.domAutomationController.send(document.title)", 77 &result)); 78 EXPECT_EQ(result, "Image failed to load"); 79 80 // A data URL. Data URLs should always be able to load chrome-extension:// 81 // resources. 82 std::string file_source; 83 ASSERT_TRUE(base::ReadFileToString( 84 test_data_dir_.AppendASCII("extension_resource_request_policy") 85 .AppendASCII("index.html"), &file_source)); 86 ui_test_utils::NavigateToURL(browser(), 87 GURL(std::string("data:text/html;charset=utf-8,") + file_source)); 88 ASSERT_TRUE(content::ExecuteScriptAndExtractString( 89 browser()->tab_strip_model()->GetActiveWebContents(), 90 "window.domAutomationController.send(document.title)", 91 &result)); 92 EXPECT_EQ(result, "Loaded"); 93 94 // A different extension. Legacy (manifest_version 1) extensions should always 95 // be able to load each other's resources. 96 ASSERT_TRUE(LoadExtensionWithFlags(test_data_dir_ 97 .AppendASCII("extension_resource_request_policy") 98 .AppendASCII("extension2"), 99 // Tests manifest_version 1 behavior, so warnings are expected. 100 ExtensionBrowserTest::kFlagIgnoreManifestWarnings)); 101 ui_test_utils::NavigateToURL( 102 browser(), 103 GURL("chrome-extension://pbkkcbgdkliohhfaeefcijaghglkahja/index.html")); 104 ASSERT_TRUE(content::ExecuteScriptAndExtractString( 105 browser()->tab_strip_model()->GetActiveWebContents(), 106 "window.domAutomationController.send(document.title)", 107 &result)); 108 EXPECT_EQ(result, "Loaded"); 109} 110 111IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest, 112 ExtensionCanLoadHostedAppIcons) { 113 ASSERT_TRUE(LoadExtensionWithFlags(test_data_dir_ 114 .AppendASCII("extension_resource_request_policy") 115 .AppendASCII("extension"), 116 // Tests manifest_version 1 behavior, so warnings are expected. 117 ExtensionBrowserTest::kFlagIgnoreManifestWarnings)); 118 119 ASSERT_TRUE(RunExtensionSubtest( 120 "extension_resource_request_policy/extension2/", 121 "can_load_icons_from_hosted_apps.html", 122 // Tests manifest_version 1 behavior, so warnings are expected. 123 ExtensionApiTest::kFlagIgnoreManifestWarnings)) << message_; 124} 125 126IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest, Audio) { 127 EXPECT_TRUE(RunExtensionSubtest( 128 "extension_resource_request_policy/extension2", 129 "audio.html", 130 // Tests manifest_version 1 behavior, so warnings are expected. 131 ExtensionApiTest::kFlagIgnoreManifestWarnings)) << message_; 132} 133 134#if defined(OS_MACOSX) || defined(OS_WIN) 135// http://crbug.com/238733 - Video is flaky on Mac and Win. 136#define MAYBE_Video DISABLED_Video 137#else 138#define MAYBE_Video Video 139#endif 140 141IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest, MAYBE_Video) { 142 EXPECT_TRUE(RunExtensionSubtest( 143 "extension_resource_request_policy/extension2", 144 "video.html", 145 // Tests manifest_version 1 behavior, so warnings are expected. 146 ExtensionApiTest::kFlagIgnoreManifestWarnings)) << message_; 147} 148 149// This test times out regularly on win_rel trybots. See http://crbug.com/122154 150#if defined(OS_WIN) 151#define MAYBE_WebAccessibleResources DISABLED_WebAccessibleResources 152#else 153#define MAYBE_WebAccessibleResources WebAccessibleResources 154#endif 155IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest, 156 MAYBE_WebAccessibleResources) { 157 std::string result; 158 ASSERT_TRUE(test_server()->Start()); 159 ASSERT_TRUE(LoadExtension(test_data_dir_ 160 .AppendASCII("extension_resource_request_policy") 161 .AppendASCII("web_accessible"))); 162 163 GURL accessible_resource( 164 test_server()->GetURL( 165 "files/extensions/api_test/extension_resource_request_policy/" 166 "web_accessible/accessible_resource.html")); 167 ui_test_utils::NavigateToURL(browser(), accessible_resource); 168 ASSERT_TRUE(content::ExecuteScriptAndExtractString( 169 browser()->tab_strip_model()->GetActiveWebContents(), 170 "window.domAutomationController.send(document.title)", 171 &result)); 172 EXPECT_EQ("Loaded", result); 173 174 GURL xhr_accessible_resource( 175 test_server()->GetURL( 176 "files/extensions/api_test/extension_resource_request_policy/" 177 "web_accessible/xhr_accessible_resource.html")); 178 ui_test_utils::NavigateToURL( 179 browser(), xhr_accessible_resource); 180 ASSERT_TRUE(content::ExecuteScriptAndExtractString( 181 browser()->tab_strip_model()->GetActiveWebContents(), 182 "window.domAutomationController.send(document.title)", 183 &result)); 184 EXPECT_EQ("XHR completed with status: 200", result); 185 186 GURL xhr_inaccessible_resource( 187 test_server()->GetURL( 188 "files/extensions/api_test/extension_resource_request_policy/" 189 "web_accessible/xhr_inaccessible_resource.html")); 190 ui_test_utils::NavigateToURL( 191 browser(), xhr_inaccessible_resource); 192 ASSERT_TRUE(content::ExecuteScriptAndExtractString( 193 browser()->tab_strip_model()->GetActiveWebContents(), 194 "window.domAutomationController.send(document.title)", 195 &result)); 196 EXPECT_EQ("XHR failed to load resource", result); 197 198 GURL nonaccessible_resource( 199 test_server()->GetURL( 200 "files/extensions/api_test/extension_resource_request_policy/" 201 "web_accessible/nonaccessible_resource.html")); 202 ui_test_utils::NavigateToURL(browser(), nonaccessible_resource); 203 ASSERT_TRUE(content::ExecuteScriptAndExtractString( 204 browser()->tab_strip_model()->GetActiveWebContents(), 205 "window.domAutomationController.send(document.title)", 206 &result)); 207 EXPECT_EQ("Image failed to load", result); 208 209 GURL nonexistent_resource( 210 test_server()->GetURL( 211 "files/extensions/api_test/extension_resource_request_policy/" 212 "web_accessible/nonexistent_resource.html")); 213 ui_test_utils::NavigateToURL(browser(), nonexistent_resource); 214 ASSERT_TRUE(content::ExecuteScriptAndExtractString( 215 browser()->tab_strip_model()->GetActiveWebContents(), 216 "window.domAutomationController.send(document.title)", 217 &result)); 218 EXPECT_EQ("Image failed to load", result); 219 220 GURL nonaccessible_cer_resource( 221 test_server()->GetURL( 222 "files/extensions/api_test/extension_resource_request_policy/" 223 "web_accessible/nonaccessible_chrome_resource_scheme.html")); 224 ui_test_utils::NavigateToURL(browser(), nonaccessible_cer_resource); 225 ASSERT_TRUE(content::ExecuteScriptAndExtractString( 226 browser()->tab_strip_model()->GetActiveWebContents(), 227 "window.domAutomationController.send(document.title)", 228 &result)); 229 EXPECT_EQ("Loading CER:// failed.", result); 230 231 GURL newtab_page("chrome://newtab"); 232 GURL accessible_newtab_override( 233 test_server()->GetURL( 234 "files/extensions/api_test/extension_resource_request_policy/" 235 "web_accessible/accessible_history_navigation.html")); 236 ui_test_utils::NavigateToURL(browser(), newtab_page); 237 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( 238 browser(), accessible_newtab_override, 2); 239 ASSERT_TRUE(content::ExecuteScriptAndExtractString( 240 browser()->tab_strip_model()->GetActiveWebContents(), 241 "window.domAutomationController.send(document.title)", 242 &result)); 243 EXPECT_EQ("New Tab Page Loaded Successfully", result); 244} 245 246IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest, 247 LinkToWebAccessibleResources) { 248 std::string result; 249 ASSERT_TRUE(test_server()->Start()); 250 ASSERT_TRUE(LoadExtension(test_data_dir_ 251 .AppendASCII("extension_resource_request_policy") 252 .AppendASCII("web_accessible"))); 253 254 GURL accessible_linked_resource( 255 test_server()->GetURL( 256 "files/extensions/api_test/extension_resource_request_policy/" 257 "web_accessible/accessible_link_resource.html")); 258 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(), 259 accessible_linked_resource, 2); 260 ASSERT_TRUE(content::ExecuteScriptAndExtractString( 261 browser()->tab_strip_model()->GetActiveWebContents(), 262 "window.domAutomationController.send(document.URL)", 263 &result)); 264 EXPECT_NE("about:blank", result); 265 266 GURL nonaccessible_linked_resource( 267 test_server()->GetURL( 268 "files/extensions/api_test/extension_resource_request_policy/" 269 "web_accessible/nonaccessible_link_resource.html")); 270 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(), 271 nonaccessible_linked_resource, 2); 272 ASSERT_TRUE(content::ExecuteScriptAndExtractString( 273 browser()->tab_strip_model()->GetActiveWebContents(), 274 "window.domAutomationController.send(document.URL)", 275 &result)); 276 EXPECT_EQ("about:blank", result); 277 278 GURL accessible_client_redirect_resource( 279 test_server()->GetURL( 280 "files/extensions/api_test/extension_resource_request_policy/" 281 "web_accessible/accessible_redirect_resource.html")); 282 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(), 283 accessible_client_redirect_resource, 2); 284 ASSERT_TRUE(content::ExecuteScriptAndExtractString( 285 browser()->tab_strip_model()->GetActiveWebContents(), 286 "window.domAutomationController.send(document.URL)", 287 &result)); 288 EXPECT_NE("about:blank", result); 289 290 GURL nonaccessible_client_redirect_resource( 291 test_server()->GetURL( 292 "files/extensions/api_test/extension_resource_request_policy/" 293 "web_accessible/nonaccessible_redirect_resource.html")); 294 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(), 295 nonaccessible_client_redirect_resource, 2); 296 ASSERT_TRUE(content::ExecuteScriptAndExtractString( 297 browser()->tab_strip_model()->GetActiveWebContents(), 298 "window.domAutomationController.send(document.URL)", 299 &result)); 300 EXPECT_EQ("about:blank", result); 301} 302 303IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest, 304 WebAccessibleResourcesWithCSP) { 305 std::string result; 306 ASSERT_TRUE(test_server()->Start()); 307 ASSERT_TRUE(LoadExtension(test_data_dir_ 308 .AppendASCII("extension_resource_request_policy") 309 .AppendASCII("web_accessible"))); 310 311 GURL accessible_resource_with_csp( 312 test_server()->GetURL( 313 "files/extensions/api_test/extension_resource_request_policy/" 314 "web_accessible/accessible_resource_with_csp.html")); 315 ui_test_utils::NavigateToURL(browser(), accessible_resource_with_csp); 316 ASSERT_TRUE(content::ExecuteScriptAndExtractString( 317 browser()->tab_strip_model()->GetActiveWebContents(), 318 "window.domAutomationController.send(document.title)", 319 &result)); 320 EXPECT_EQ("Loaded", result); 321} 322 323IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest, Iframe) { 324 // Load another extension, which the test one shouldn't be able to get 325 // resources from. 326 ASSERT_TRUE(LoadExtension(test_data_dir_ 327 .AppendASCII("extension_resource_request_policy") 328 .AppendASCII("inaccessible"))); 329 EXPECT_TRUE(RunExtensionSubtest( 330 "extension_resource_request_policy/web_accessible", 331 "iframe.html")) << message_; 332} 333 334#if defined(OS_MACOSX) 335#define MAYBE_ExtensionAccessibleResources DISABLED_ExtensionAccessibleResources 336#else 337#define MAYBE_ExtensionAccessibleResources ExtensionAccessibleResources 338#endif 339IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest, 340 MAYBE_ExtensionAccessibleResources) { 341 ASSERT_TRUE(RunExtensionSubtest("accessible_cer", "main.html")) << message_; 342} 343