15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/strings/stringprintf.h"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/permissions/permissions_api.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/notification_types.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/test/result_catcher.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h"
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/test/embedded_test_server/embedded_test_server.h"
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace extensions {
24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace {
26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// A fake webstore domain.
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst char kWebstoreDomain[] = "cws.com";
29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Check whether or not style was injected, with |expected_injection| indicating
31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// the expected result. Also ensure that no CSS was added to the
32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// document.styleSheets array.
33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochtesting::AssertionResult CheckStyleInjection(Browser* browser,
34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                             const GURL& url,
35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                             bool expected_injection) {
36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ui_test_utils::NavigateToURL(browser, url);
37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool css_injected = false;
39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!content::ExecuteScriptAndExtractBool(
40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          browser->tab_strip_model()->GetActiveWebContents(),
41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          "window.domAutomationController.send("
42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          "    document.defaultView.getComputedStyle(document.body, null)."
43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          "        getPropertyValue('display') == 'none');",
44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          &css_injected)) {
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return testing::AssertionFailure()
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        << "Failed to execute script and extract bool for injection status.";
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (css_injected != expected_injection) {
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    std::string message;
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (css_injected)
52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      message = "CSS injected when no injection was expected.";
53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    else
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      message = "CSS not injected when injection was expected.";
55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return testing::AssertionFailure() << message;
56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool css_doesnt_add_to_list = false;
59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!content::ExecuteScriptAndExtractBool(
60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          browser->tab_strip_model()->GetActiveWebContents(),
61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          "window.domAutomationController.send("
62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          "    document.styleSheets.length == 0);",
63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          &css_doesnt_add_to_list)) {
64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return testing::AssertionFailure()
65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        << "Failed to execute script and extract bool for stylesheets length.";
66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!css_doesnt_add_to_list) {
68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return testing::AssertionFailure()
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        << "CSS injection added to number of stylesheets.";
70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return testing::AssertionSuccess();
73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}  // namespace
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptAllFrames) {
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("content_scripts/all_frames")) << message_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptAboutBlankIframes) {
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RunExtensionTest("content_scripts/about_blank_iframes")) << message_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptAboutBlankAndSrcdoc) {
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The optional "*://*/*" permission is requested after verifying that
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // content script insertion solely depends on content_scripts[*].matches.
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The permission is needed for chrome.tabs.executeScript tests.
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PermissionsRequestFunction::SetAutoConfirmForTests(true);
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PermissionsRequestFunction::SetIgnoreUserGestureForTests(true);
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(StartEmbeddedTestServer());
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("content_scripts/about_blank_srcdoc"))
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      << message_;
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptExtensionIframe) {
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("content_scripts/extension_iframe")) << message_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptExtensionProcess) {
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RunExtensionTest("content_scripts/extension_process")) << message_;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptFragmentNavigation) {
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* extension_name = "content_scripts/fragment";
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest(extension_name)) << message_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Times out on Linux: http://crbug.com/163097
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_ContentScriptIsolatedWorlds DISABLED_ContentScriptIsolatedWorlds
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_ContentScriptIsolatedWorlds ContentScriptIsolatedWorlds
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_ContentScriptIsolatedWorlds) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This extension runs various bits of script and tests that they all run in
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the same isolated world.
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("content_scripts/isolated_world1")) << message_;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now load a different extension, inject into same page, verify worlds aren't
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // shared.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("content_scripts/isolated_world2")) << message_;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptIgnoreHostPermissions) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("a.com", "127.0.0.1");
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("b.com", "127.0.0.1");
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest(
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "content_scripts/dont_match_host_permissions")) << message_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// crbug.com/39249 -- content scripts js should not run on view source.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptViewSource) {
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("content_scripts/view_source")) << message_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// crbug.com/126257 -- content scripts should not get injected into other
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extensions.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptOtherExtensions) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("a.com", "127.0.0.1");
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First, load extension that sets up content script.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("content_scripts/other_extensions/injector"))
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << message_;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then load targeted extension to make sure its content isn't changed.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("content_scripts/other_extensions/victim"))
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << message_;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass ContentScriptCssInjectionTest : public ExtensionApiTest {
162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected:
163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // TODO(rdevlin.cronin): Make a testing switch that looks like FeatureSwitch,
164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // but takes in an optional value so that we don't have to do this.
165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE {
166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ExtensionApiTest::SetUpCommandLine(command_line);
167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // We change the Webstore URL to be http://cws.com. We need to do this so
168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // we can check that css injection is not allowed on the webstore (which
169c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // could lead to spoofing). Unfortunately, host_resolver seems to have
170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // problems with redirecting "chrome.google.com" to the test server, so we
171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // can't use the real Webstore's URL. If this changes, we could clean this
172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // up.
173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    command_line->AppendSwitchASCII(
174c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        switches::kAppsGalleryURL,
175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        base::StringPrintf("http://%s", kWebstoreDomain));
176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochIN_PROC_BROWSER_TEST_F(ContentScriptCssInjectionTest,
180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                       ContentScriptInjectsStyles) {
181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  host_resolver()->AddRule(kWebstoreDomain, "127.0.0.1");
183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("content_scripts")
185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                          .AppendASCII("css_injection")));
186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // CSS injection should be allowed on an aribitrary web page.
188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  GURL url =
189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      embedded_test_server()->GetURL("/extensions/test_file_with_body.html");
190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(CheckStyleInjection(browser(), url, true));
191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The loaded extension has an exclude match for "extensions/test_file.html",
193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // so no CSS should be injected.
194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  url = embedded_test_server()->GetURL("/extensions/test_file.html");
195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(CheckStyleInjection(browser(), url, false));
196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // We disallow all injection on the webstore.
198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  GURL::Replacements replacements;
199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  std::string host(kWebstoreDomain);
200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  replacements.SetHostStr(host);
201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  url = embedded_test_server()->GetURL("/extensions/test_file_with_body.html")
202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            .ReplaceComponents(replacements);
203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(CheckStyleInjection(browser(), url, false));
204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// crbug.com/120762
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionApiTest,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISABLED_ContentScriptStylesInjectedIntoExistingRenderers) {
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver signal(
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_USER_SCRIPTS_UPDATED,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<Profile>(browser()->profile()));
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start with a renderer already open at a URL.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server()->GetURL("file/extensions/test_file.html"));
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension(
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("content_scripts/existing_renderers"));
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signal.Wait();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And check that its styles were affected by the styles that just got loaded.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool styles_injected;
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(),
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send("
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    document.defaultView.getComputedStyle(document.body, null)."
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "        getPropertyValue('background-color') == 'rgb(255, 0, 0)')",
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &styles_injected));
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(styles_injected);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionApiTest,
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       ContentScriptCSSLocalization) {
238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("content_scripts/css_l10n")) << message_;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptExtensionAPIs) {
243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* extension = LoadExtension(
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("content_scripts/extension_api"));
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResultCatcher catcher;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(
250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      browser(),
251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      embedded_test_server()->GetURL(
252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          "/extensions/api_test/content_scripts/extension_api/functions.html"));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(catcher.GetNextResult());
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to a page that will cause a content script to run that starts
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // listening for an extension event.
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(
258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      browser(),
259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      embedded_test_server()->GetURL(
260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          "/extensions/api_test/content_scripts/extension_api/events.html"));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to an extension page that will fire the event events.js is
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // listening for.
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURLWithDisposition(
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser(), extension->GetResourceURL("fire_event.html"),
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_NONE);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(catcher.GetNextResult());
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Flaky on Windows. http://crbug.com/248418
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_WIN)
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_ContentScriptPermissionsApi DISABLED_ContentScriptPermissionsApi
273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#else
274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_ContentScriptPermissionsApi ContentScriptPermissionsApi
275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_ContentScriptPermissionsApi) {
277b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  extensions::PermissionsRequestFunction::SetIgnoreUserGestureForTests(true);
278b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  extensions::PermissionsRequestFunction::SetAutoConfirmForTests(true);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("*.com", "127.0.0.1");
280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("content_scripts/permissions")) << message_;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentScriptBypassPageCSP) {
285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("content_scripts/bypass_page_csp")) << message_;
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
288c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
289c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}  // namespace extensions
290