Home | History | Annotate | Download | only in extensions
      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/common/extensions/extension.h"
     14 #include "chrome/test/base/ui_test_utils.h"
     15 #include "content/public/browser/web_contents.h"
     16 #include "content/public/test/browser_test_utils.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