1// Copyright (c) 2013 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/files/file_path.h"
7#include "base/path_service.h"
8#include "base/strings/string_number_conversions.h"
9#include "chrome/common/chrome_paths.h"
10#include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h"
11#include "chrome/common/extensions/manifest_tests/chrome_manifest_test.h"
12#include "extensions/common/error_utils.h"
13#include "extensions/common/extension.h"
14#include "extensions/common/file_util.h"
15#include "extensions/common/manifest_constants.h"
16#include "extensions/common/switches.h"
17#include "testing/gtest/include/gtest/gtest.h"
18
19namespace extensions {
20
21namespace errors = manifest_errors;
22
23class ContentScriptsManifestTest : public ChromeManifestTest {
24};
25
26TEST_F(ContentScriptsManifestTest, MatchPattern) {
27  Testcase testcases[] = {
28    // chrome:// urls are not allowed.
29    Testcase("content_script_chrome_url_invalid.json",
30             ErrorUtils::FormatErrorMessage(
31                 errors::kInvalidMatch,
32                 base::IntToString(0),
33                 base::IntToString(0),
34                 URLPattern::GetParseResultString(
35                     URLPattern::PARSE_ERROR_INVALID_SCHEME))),
36
37    // Match paterns must be strings.
38    Testcase("content_script_match_pattern_not_string.json",
39             ErrorUtils::FormatErrorMessage(errors::kInvalidMatch,
40                                            base::IntToString(0),
41                                            base::IntToString(0),
42                                            errors::kExpectString))
43  };
44  RunTestcases(testcases, arraysize(testcases),
45               EXPECT_TYPE_ERROR);
46
47  LoadAndExpectSuccess("ports_in_content_scripts.json");
48}
49
50TEST_F(ContentScriptsManifestTest, OnChromeUrlsWithFlag) {
51  CommandLine::ForCurrentProcess()->AppendSwitch(
52      switches::kExtensionsOnChromeURLs);
53  scoped_refptr<Extension> extension =
54    LoadAndExpectSuccess("content_script_chrome_url_invalid.json");
55  const GURL newtab_url("chrome://newtab/");
56  EXPECT_TRUE(
57      ContentScriptsInfo::ExtensionHasScriptAtURL(extension.get(), newtab_url));
58}
59
60TEST_F(ContentScriptsManifestTest, ScriptableHosts) {
61  // TODO(yoz): Test GetScriptableHosts.
62  scoped_refptr<Extension> extension =
63      LoadAndExpectSuccess("content_script_yahoo.json");
64  URLPatternSet scriptable_hosts =
65      ContentScriptsInfo::GetScriptableHosts(extension.get());
66
67  URLPatternSet expected;
68  expected.AddPattern(
69      URLPattern(URLPattern::SCHEME_HTTP, "http://yahoo.com/*"));
70
71  EXPECT_EQ(expected, scriptable_hosts);
72}
73
74TEST_F(ContentScriptsManifestTest, ContentScriptIds) {
75  scoped_refptr<Extension> extension1 =
76      LoadAndExpectSuccess("content_script_yahoo.json");
77  scoped_refptr<Extension> extension2 =
78      LoadAndExpectSuccess("content_script_yahoo.json");
79  const UserScriptList& user_scripts1 =
80      ContentScriptsInfo::GetContentScripts(extension1.get());
81  ASSERT_EQ(1u, user_scripts1.size());
82  int id = user_scripts1[0].id();
83  const UserScriptList& user_scripts2 =
84      ContentScriptsInfo::GetContentScripts(extension2.get());
85  ASSERT_EQ(1u, user_scripts2.size());
86  // The id of the content script should be one higher than the previous.
87  EXPECT_EQ(id + 1, user_scripts2[0].id());
88}
89
90TEST_F(ContentScriptsManifestTest, FailLoadingNonUTF8Scripts) {
91  base::FilePath install_dir;
92  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &install_dir));
93  install_dir = install_dir.AppendASCII("extensions")
94                    .AppendASCII("bad")
95                    .AppendASCII("bad_encoding");
96
97  std::string error;
98  scoped_refptr<Extension> extension(file_util::LoadExtension(
99      install_dir, Manifest::UNPACKED, Extension::NO_FLAGS, &error));
100  ASSERT_TRUE(extension.get() == NULL);
101  ASSERT_STREQ(
102      "Could not load file 'bad_encoding.js' for content script. "
103      "It isn't UTF-8 encoded.",
104      error.c_str());
105}
106
107}  // namespace extensions
108