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 "chrome/common/extensions/manifest_tests/chrome_manifest_test.h"
6
7#include "base/command_line.h"
8#include "base/memory/scoped_ptr.h"
9#include "base/values.h"
10#include "chrome/common/extensions/features/feature_channel.h"
11#include "extensions/common/constants.h"
12#include "extensions/common/error_utils.h"
13#include "extensions/common/extension.h"
14#include "extensions/common/manifest_constants.h"
15#include "extensions/common/manifest_handlers/background_info.h"
16#include "testing/gtest/include/gtest/gtest.h"
17
18namespace extensions {
19
20namespace errors = manifest_errors;
21namespace keys = manifest_keys;
22
23class ExtensionManifestBackgroundTest : public ChromeManifestTest {
24};
25
26TEST_F(ExtensionManifestBackgroundTest, BackgroundPermission) {
27  LoadAndExpectError("background_permission.json",
28                     errors::kBackgroundPermissionNeeded);
29}
30
31TEST_F(ExtensionManifestBackgroundTest, BackgroundScripts) {
32  std::string error;
33  scoped_ptr<base::DictionaryValue> manifest(
34      LoadManifest("background_scripts.json", &error));
35  ASSERT_TRUE(manifest.get());
36
37  scoped_refptr<Extension> extension(
38      LoadAndExpectSuccess(ManifestData(manifest.get(), "")));
39  ASSERT_TRUE(extension.get());
40  const std::vector<std::string>& background_scripts =
41      BackgroundInfo::GetBackgroundScripts(extension.get());
42  ASSERT_EQ(2u, background_scripts.size());
43  EXPECT_EQ("foo.js", background_scripts[0u]);
44  EXPECT_EQ("bar/baz.js", background_scripts[1u]);
45
46  EXPECT_TRUE(BackgroundInfo::HasBackgroundPage(extension.get()));
47  EXPECT_EQ(
48      std::string("/") + kGeneratedBackgroundPageFilename,
49      BackgroundInfo::GetBackgroundURL(extension.get()).path());
50
51  manifest->SetString("background_page", "monkey.html");
52  LoadAndExpectError(ManifestData(manifest.get(), ""),
53                     errors::kInvalidBackgroundCombination);
54}
55
56TEST_F(ExtensionManifestBackgroundTest, BackgroundPage) {
57  scoped_refptr<Extension> extension(
58      LoadAndExpectSuccess("background_page.json"));
59  ASSERT_TRUE(extension.get());
60  EXPECT_EQ("/foo.html",
61            BackgroundInfo::GetBackgroundURL(extension.get()).path());
62  EXPECT_TRUE(BackgroundInfo::AllowJSAccess(extension.get()));
63
64  std::string error;
65  scoped_ptr<base::DictionaryValue> manifest(
66      LoadManifest("background_page_legacy.json", &error));
67  ASSERT_TRUE(manifest.get());
68  extension = LoadAndExpectSuccess(ManifestData(manifest.get(), ""));
69  ASSERT_TRUE(extension.get());
70  EXPECT_EQ("/foo.html",
71            BackgroundInfo::GetBackgroundURL(extension.get()).path());
72
73  manifest->SetInteger(keys::kManifestVersion, 2);
74  LoadAndExpectWarning(
75      ManifestData(manifest.get(), ""),
76      "'background_page' requires manifest version of 1 or lower.");
77}
78
79TEST_F(ExtensionManifestBackgroundTest, BackgroundAllowNoJsAccess) {
80  scoped_refptr<Extension> extension;
81  extension = LoadAndExpectSuccess("background_allow_no_js_access.json");
82  ASSERT_TRUE(extension.get());
83  EXPECT_FALSE(BackgroundInfo::AllowJSAccess(extension.get()));
84
85  extension = LoadAndExpectSuccess("background_allow_no_js_access2.json");
86  ASSERT_TRUE(extension.get());
87  EXPECT_FALSE(BackgroundInfo::AllowJSAccess(extension.get()));
88}
89
90TEST_F(ExtensionManifestBackgroundTest, BackgroundPageWebRequest) {
91  ScopedCurrentChannel current_channel(chrome::VersionInfo::CHANNEL_DEV);
92
93  std::string error;
94  scoped_ptr<base::DictionaryValue> manifest(
95      LoadManifest("background_page.json", &error));
96  ASSERT_TRUE(manifest.get());
97  manifest->SetBoolean(keys::kBackgroundPersistent, false);
98  manifest->SetInteger(keys::kManifestVersion, 2);
99  scoped_refptr<Extension> extension(
100      LoadAndExpectSuccess(ManifestData(manifest.get(), "")));
101  ASSERT_TRUE(extension.get());
102  EXPECT_TRUE(BackgroundInfo::HasLazyBackgroundPage(extension.get()));
103
104  base::ListValue* permissions = new base::ListValue();
105  permissions->Append(new base::StringValue("webRequest"));
106  manifest->Set(keys::kPermissions, permissions);
107  LoadAndExpectError(ManifestData(manifest.get(), ""),
108                     errors::kWebRequestConflictsWithLazyBackground);
109}
110
111}  // namespace extensions
112