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/strings/utf_string_conversions.h" 6 #include "chrome/browser/chrome_notification_types.h" 7 #include "chrome/browser/extensions/api/permissions/permissions_api.h" 8 #include "chrome/browser/extensions/extension_apitest.h" 9 #include "chrome/browser/extensions/extension_service.h" 10 #include "chrome/browser/ui/browser.h" 11 #include "chrome/browser/ui/tabs/tab_strip_model.h" 12 #include "chrome/common/chrome_switches.h" 13 #include "chrome/test/base/ui_test_utils.h" 14 #include "content/public/browser/web_contents.h" 15 #include "content/public/test/browser_test_utils.h" 16 #include "extensions/common/extension.h" 17 #include "net/dns/mock_host_resolver.h" 18 #include "net/test/embedded_test_server/embedded_test_server.h" 19 #include "url/gurl.h" 20 21 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptAllFrames) { 22 ASSERT_TRUE(StartEmbeddedTestServer()); 23 ASSERT_TRUE(RunExtensionTest("content_scripts/all_frames")) << message_; 24 } 25 26 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptAboutBlankIframes) { 27 ASSERT_TRUE(StartEmbeddedTestServer()); 28 ASSERT_TRUE( 29 RunExtensionTest("content_scripts/about_blank_iframes")) << message_; 30 } 31 32 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptExtensionIframe) { 33 ASSERT_TRUE(StartEmbeddedTestServer()); 34 ASSERT_TRUE(RunExtensionTest("content_scripts/extension_iframe")) << message_; 35 } 36 37 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptExtensionProcess) { 38 ASSERT_TRUE(StartEmbeddedTestServer()); 39 ASSERT_TRUE( 40 RunExtensionTest("content_scripts/extension_process")) << message_; 41 } 42 43 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptFragmentNavigation) { 44 ASSERT_TRUE(StartEmbeddedTestServer()); 45 const char* extension_name = "content_scripts/fragment"; 46 ASSERT_TRUE(RunExtensionTest(extension_name)) << message_; 47 } 48 49 // Times out on Linux: http://crbug.com/163097 50 #if defined(OS_LINUX) 51 #define MAYBE_ContentScriptIsolatedWorlds DISABLED_ContentScriptIsolatedWorlds 52 #else 53 #define MAYBE_ContentScriptIsolatedWorlds ContentScriptIsolatedWorlds 54 #endif 55 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_ContentScriptIsolatedWorlds) { 56 // This extension runs various bits of script and tests that they all run in 57 // the same isolated world. 58 ASSERT_TRUE(StartEmbeddedTestServer()); 59 ASSERT_TRUE(RunExtensionTest("content_scripts/isolated_world1")) << message_; 60 61 // Now load a different extension, inject into same page, verify worlds aren't 62 // shared. 63 ASSERT_TRUE(RunExtensionTest("content_scripts/isolated_world2")) << message_; 64 } 65 66 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptIgnoreHostPermissions) { 67 host_resolver()->AddRule("a.com", "127.0.0.1"); 68 host_resolver()->AddRule("b.com", "127.0.0.1"); 69 ASSERT_TRUE(StartEmbeddedTestServer()); 70 ASSERT_TRUE(RunExtensionTest( 71 "content_scripts/dont_match_host_permissions")) << message_; 72 } 73 74 // crbug.com/39249 -- content scripts js should not run on view source. 75 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptViewSource) { 76 ASSERT_TRUE(StartEmbeddedTestServer()); 77 ASSERT_TRUE(RunExtensionTest("content_scripts/view_source")) << message_; 78 } 79 80 // crbug.com/126257 -- content scripts should not get injected into other 81 // extensions. 82 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptOtherExtensions) { 83 host_resolver()->AddRule("a.com", "127.0.0.1"); 84 ASSERT_TRUE(StartEmbeddedTestServer()); 85 // First, load extension that sets up content script. 86 ASSERT_TRUE(RunExtensionTest("content_scripts/other_extensions/injector")) 87 << message_; 88 // Then load targeted extension to make sure its content isn't changed. 89 ASSERT_TRUE(RunExtensionTest("content_scripts/other_extensions/victim")) 90 << message_; 91 } 92 93 // crbug.com/120762 94 IN_PROC_BROWSER_TEST_F( 95 ExtensionApiTest, 96 DISABLED_ContentScriptStylesInjectedIntoExistingRenderers) { 97 ASSERT_TRUE(StartEmbeddedTestServer()); 98 99 content::WindowedNotificationObserver signal( 100 chrome::NOTIFICATION_USER_SCRIPTS_UPDATED, 101 content::Source<Profile>(browser()->profile())); 102 103 // Start with a renderer already open at a URL. 104 GURL url(test_server()->GetURL("file/extensions/test_file.html")); 105 ui_test_utils::NavigateToURL(browser(), url); 106 107 LoadExtension( 108 test_data_dir_.AppendASCII("content_scripts/existing_renderers")); 109 110 signal.Wait(); 111 112 // And check that its styles were affected by the styles that just got loaded. 113 bool styles_injected; 114 ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 115 browser()->tab_strip_model()->GetActiveWebContents(), 116 "window.domAutomationController.send(" 117 " document.defaultView.getComputedStyle(document.body, null)." 118 " getPropertyValue('background-color') == 'rgb(255, 0, 0)')", 119 &styles_injected)); 120 ASSERT_TRUE(styles_injected); 121 } 122 123 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, 124 ContentScriptCSSLocalization) { 125 ASSERT_TRUE(StartEmbeddedTestServer()); 126 ASSERT_TRUE(RunExtensionTest("content_scripts/css_l10n")) << message_; 127 } 128 129 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptExtensionAPIs) { 130 ASSERT_TRUE(StartEmbeddedTestServer()); 131 132 const extensions::Extension* extension = LoadExtension( 133 test_data_dir_.AppendASCII("content_scripts/extension_api")); 134 135 ResultCatcher catcher; 136 ui_test_utils::NavigateToURL( 137 browser(), 138 embedded_test_server()->GetURL( 139 "/extensions/api_test/content_scripts/extension_api/functions.html")); 140 EXPECT_TRUE(catcher.GetNextResult()); 141 142 // Navigate to a page that will cause a content script to run that starts 143 // listening for an extension event. 144 ui_test_utils::NavigateToURL( 145 browser(), 146 embedded_test_server()->GetURL( 147 "/extensions/api_test/content_scripts/extension_api/events.html")); 148 149 // Navigate to an extension page that will fire the event events.js is 150 // listening for. 151 ui_test_utils::NavigateToURLWithDisposition( 152 browser(), extension->GetResourceURL("fire_event.html"), 153 NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_NONE); 154 EXPECT_TRUE(catcher.GetNextResult()); 155 } 156 157 // Flaky on Windows. http://crbug.com/248418 158 #if defined(OS_WIN) 159 #define MAYBE_ContentScriptPermissionsApi DISABLED_ContentScriptPermissionsApi 160 #else 161 #define MAYBE_ContentScriptPermissionsApi ContentScriptPermissionsApi 162 #endif 163 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_ContentScriptPermissionsApi) { 164 extensions::PermissionsRequestFunction::SetIgnoreUserGestureForTests(true); 165 extensions::PermissionsRequestFunction::SetAutoConfirmForTests(true); 166 host_resolver()->AddRule("*.com", "127.0.0.1"); 167 ASSERT_TRUE(StartEmbeddedTestServer()); 168 ASSERT_TRUE(RunExtensionTest("content_scripts/permissions")) << message_; 169 } 170 171 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptBypassPageCSP) { 172 ASSERT_TRUE(StartEmbeddedTestServer()); 173 ASSERT_TRUE(RunExtensionTest("content_scripts/bypass_page_csp")) << message_; 174 } 175