OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/common/extensions/manifest.h" | 5 #include "chrome/common/extensions/manifest.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <set> | 8 #include <set> |
9 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 23 matching lines...) Expand all Loading... |
34 EXPECT_EQ(type == Manifest::TYPE_PLATFORM_APP, | 34 EXPECT_EQ(type == Manifest::TYPE_PLATFORM_APP, |
35 manifest->is_platform_app()); | 35 manifest->is_platform_app()); |
36 EXPECT_EQ(type == Manifest::TYPE_LEGACY_PACKAGED_APP, | 36 EXPECT_EQ(type == Manifest::TYPE_LEGACY_PACKAGED_APP, |
37 manifest->is_legacy_packaged_app()); | 37 manifest->is_legacy_packaged_app()); |
38 EXPECT_EQ(type == Manifest::TYPE_HOSTED_APP, manifest->is_hosted_app()); | 38 EXPECT_EQ(type == Manifest::TYPE_HOSTED_APP, manifest->is_hosted_app()); |
39 } | 39 } |
40 | 40 |
41 // Helper function that replaces the Manifest held by |manifest| with a copy | 41 // Helper function that replaces the Manifest held by |manifest| with a copy |
42 // with its |key| changed to |value|. If |value| is NULL, then |key| will | 42 // with its |key| changed to |value|. If |value| is NULL, then |key| will |
43 // instead be deleted. | 43 // instead be deleted. |
44 void MutateManifest( | 44 void MutateManifest(scoped_ptr<Manifest>* manifest, |
45 scoped_ptr<Manifest>* manifest, const std::string& key, Value* value) { | 45 const std::string& key, |
46 scoped_ptr<DictionaryValue> manifest_value( | 46 base::Value* value) { |
| 47 scoped_ptr<base::DictionaryValue> manifest_value( |
47 manifest->get()->value()->DeepCopy()); | 48 manifest->get()->value()->DeepCopy()); |
48 if (value) | 49 if (value) |
49 manifest_value->Set(key, value); | 50 manifest_value->Set(key, value); |
50 else | 51 else |
51 manifest_value->Remove(key, NULL); | 52 manifest_value->Remove(key, NULL); |
52 manifest->reset(new Manifest(Manifest::INTERNAL, manifest_value.Pass())); | 53 manifest->reset(new Manifest(Manifest::INTERNAL, manifest_value.Pass())); |
53 } | 54 } |
54 | 55 |
55 std::string default_value_; | 56 std::string default_value_; |
56 }; | 57 }; |
57 | 58 |
58 // Verifies that extensions can access the correct keys. | 59 // Verifies that extensions can access the correct keys. |
59 TEST_F(ManifestTest, Extension) { | 60 TEST_F(ManifestTest, Extension) { |
60 scoped_ptr<DictionaryValue> manifest_value(new DictionaryValue()); | 61 scoped_ptr<base::DictionaryValue> manifest_value(new base::DictionaryValue()); |
61 manifest_value->SetString(keys::kName, "extension"); | 62 manifest_value->SetString(keys::kName, "extension"); |
62 manifest_value->SetString(keys::kVersion, "1"); | 63 manifest_value->SetString(keys::kVersion, "1"); |
63 // Only supported in manifest_version=1. | 64 // Only supported in manifest_version=1. |
64 manifest_value->SetString(keys::kBackgroundPageLegacy, "bg.html"); | 65 manifest_value->SetString(keys::kBackgroundPageLegacy, "bg.html"); |
65 manifest_value->SetString("unknown_key", "foo"); | 66 manifest_value->SetString("unknown_key", "foo"); |
66 | 67 |
67 scoped_ptr<Manifest> manifest( | 68 scoped_ptr<Manifest> manifest( |
68 new Manifest(Manifest::INTERNAL, manifest_value.Pass())); | 69 new Manifest(Manifest::INTERNAL, manifest_value.Pass())); |
69 std::string error; | 70 std::string error; |
70 std::vector<InstallWarning> warnings; | 71 std::vector<InstallWarning> warnings; |
71 manifest->ValidateManifest(&error, &warnings); | 72 manifest->ValidateManifest(&error, &warnings); |
72 EXPECT_TRUE(error.empty()); | 73 EXPECT_TRUE(error.empty()); |
73 ASSERT_EQ(1u, warnings.size()); | 74 ASSERT_EQ(1u, warnings.size()); |
74 AssertType(manifest.get(), Manifest::TYPE_EXTENSION); | 75 AssertType(manifest.get(), Manifest::TYPE_EXTENSION); |
75 | 76 |
76 // The known key 'background_page' should be accessible. | 77 // The known key 'background_page' should be accessible. |
77 std::string value; | 78 std::string value; |
78 EXPECT_TRUE(manifest->GetString(keys::kBackgroundPageLegacy, &value)); | 79 EXPECT_TRUE(manifest->GetString(keys::kBackgroundPageLegacy, &value)); |
79 EXPECT_EQ("bg.html", value); | 80 EXPECT_EQ("bg.html", value); |
80 | 81 |
81 // The unknown key 'unknown_key' should be accesible. | 82 // The unknown key 'unknown_key' should be accesible. |
82 value.clear(); | 83 value.clear(); |
83 EXPECT_TRUE(manifest->GetString("unknown_key", &value)); | 84 EXPECT_TRUE(manifest->GetString("unknown_key", &value)); |
84 EXPECT_EQ("foo", value); | 85 EXPECT_EQ("foo", value); |
85 | 86 |
86 // Set the manifest_version to 2; background_page should stop working. | 87 // Set the manifest_version to 2; background_page should stop working. |
87 value.clear(); | 88 value.clear(); |
88 MutateManifest( | 89 MutateManifest( |
89 &manifest, keys::kManifestVersion, Value::CreateIntegerValue(2)); | 90 &manifest, keys::kManifestVersion, new base::FundamentalValue(2)); |
90 EXPECT_FALSE(manifest->GetString("background_page", &value)); | 91 EXPECT_FALSE(manifest->GetString("background_page", &value)); |
91 EXPECT_EQ("", value); | 92 EXPECT_EQ("", value); |
92 | 93 |
93 // Validate should also give a warning. | 94 // Validate should also give a warning. |
94 warnings.clear(); | 95 warnings.clear(); |
95 manifest->ValidateManifest(&error, &warnings); | 96 manifest->ValidateManifest(&error, &warnings); |
96 EXPECT_TRUE(error.empty()); | 97 EXPECT_TRUE(error.empty()); |
97 ASSERT_EQ(2u, warnings.size()); | 98 ASSERT_EQ(2u, warnings.size()); |
98 { | 99 { |
99 SimpleFeature feature; | 100 SimpleFeature feature; |
100 feature.set_name("background_page"); | 101 feature.set_name("background_page"); |
101 feature.set_max_manifest_version(1); | 102 feature.set_max_manifest_version(1); |
102 EXPECT_EQ( | 103 EXPECT_EQ( |
103 "'background_page' requires manifest version of 1 or lower.", | 104 "'background_page' requires manifest version of 1 or lower.", |
104 warnings[0].message); | 105 warnings[0].message); |
105 } | 106 } |
106 | 107 |
107 // Test DeepCopy and Equals. | 108 // Test DeepCopy and Equals. |
108 scoped_ptr<Manifest> manifest2(manifest->DeepCopy()); | 109 scoped_ptr<Manifest> manifest2(manifest->DeepCopy()); |
109 EXPECT_TRUE(manifest->Equals(manifest2.get())); | 110 EXPECT_TRUE(manifest->Equals(manifest2.get())); |
110 EXPECT_TRUE(manifest2->Equals(manifest.get())); | 111 EXPECT_TRUE(manifest2->Equals(manifest.get())); |
111 MutateManifest( | 112 MutateManifest( |
112 &manifest, "foo", Value::CreateStringValue("blah")); | 113 &manifest, "foo", new base::StringValue("blah")); |
113 EXPECT_FALSE(manifest->Equals(manifest2.get())); | 114 EXPECT_FALSE(manifest->Equals(manifest2.get())); |
114 } | 115 } |
115 | 116 |
116 // Verifies that key restriction based on type works. | 117 // Verifies that key restriction based on type works. |
117 TEST_F(ManifestTest, ExtensionTypes) { | 118 TEST_F(ManifestTest, ExtensionTypes) { |
118 scoped_ptr<DictionaryValue> value(new DictionaryValue()); | 119 scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue()); |
119 value->SetString(keys::kName, "extension"); | 120 value->SetString(keys::kName, "extension"); |
120 value->SetString(keys::kVersion, "1"); | 121 value->SetString(keys::kVersion, "1"); |
121 | 122 |
122 scoped_ptr<Manifest> manifest( | 123 scoped_ptr<Manifest> manifest( |
123 new Manifest(Manifest::INTERNAL, value.Pass())); | 124 new Manifest(Manifest::INTERNAL, value.Pass())); |
124 std::string error; | 125 std::string error; |
125 std::vector<InstallWarning> warnings; | 126 std::vector<InstallWarning> warnings; |
126 manifest->ValidateManifest(&error, &warnings); | 127 manifest->ValidateManifest(&error, &warnings); |
127 EXPECT_TRUE(error.empty()); | 128 EXPECT_TRUE(error.empty()); |
128 EXPECT_TRUE(warnings.empty()); | 129 EXPECT_TRUE(warnings.empty()); |
129 | 130 |
130 // By default, the type is Extension. | 131 // By default, the type is Extension. |
131 AssertType(manifest.get(), Manifest::TYPE_EXTENSION); | 132 AssertType(manifest.get(), Manifest::TYPE_EXTENSION); |
132 | 133 |
133 // Theme. | 134 // Theme. |
134 MutateManifest( | 135 MutateManifest( |
135 &manifest, keys::kTheme, new DictionaryValue()); | 136 &manifest, keys::kTheme, new base::DictionaryValue()); |
136 AssertType(manifest.get(), Manifest::TYPE_THEME); | 137 AssertType(manifest.get(), Manifest::TYPE_THEME); |
137 MutateManifest( | 138 MutateManifest( |
138 &manifest, keys::kTheme, NULL); | 139 &manifest, keys::kTheme, NULL); |
139 | 140 |
140 // Packaged app. | 141 // Packaged app. |
141 MutateManifest( | 142 MutateManifest( |
142 &manifest, keys::kApp, new DictionaryValue()); | 143 &manifest, keys::kApp, new base::DictionaryValue()); |
143 AssertType(manifest.get(), Manifest::TYPE_LEGACY_PACKAGED_APP); | 144 AssertType(manifest.get(), Manifest::TYPE_LEGACY_PACKAGED_APP); |
144 | 145 |
145 // Platform app. | 146 // Platform app. |
146 MutateManifest( | 147 MutateManifest( |
147 &manifest, keys::kPlatformAppBackground, new DictionaryValue()); | 148 &manifest, keys::kPlatformAppBackground, new base::DictionaryValue()); |
148 AssertType(manifest.get(), Manifest::TYPE_PLATFORM_APP); | 149 AssertType(manifest.get(), Manifest::TYPE_PLATFORM_APP); |
149 MutateManifest( | 150 MutateManifest( |
150 &manifest, keys::kPlatformAppBackground, NULL); | 151 &manifest, keys::kPlatformAppBackground, NULL); |
151 | 152 |
152 // Hosted app. | 153 // Hosted app. |
153 MutateManifest( | 154 MutateManifest( |
154 &manifest, keys::kWebURLs, new ListValue()); | 155 &manifest, keys::kWebURLs, new base::ListValue()); |
155 AssertType(manifest.get(), Manifest::TYPE_HOSTED_APP); | 156 AssertType(manifest.get(), Manifest::TYPE_HOSTED_APP); |
156 MutateManifest( | 157 MutateManifest( |
157 &manifest, keys::kWebURLs, NULL); | 158 &manifest, keys::kWebURLs, NULL); |
158 MutateManifest( | 159 MutateManifest( |
159 &manifest, keys::kLaunchWebURL, Value::CreateStringValue("foo")); | 160 &manifest, keys::kLaunchWebURL, new base::StringValue("foo")); |
160 AssertType(manifest.get(), Manifest::TYPE_HOSTED_APP); | 161 AssertType(manifest.get(), Manifest::TYPE_HOSTED_APP); |
161 MutateManifest( | 162 MutateManifest( |
162 &manifest, keys::kLaunchWebURL, NULL); | 163 &manifest, keys::kLaunchWebURL, NULL); |
163 }; | 164 }; |
164 | 165 |
165 // Verifies that the getters filter restricted keys. | 166 // Verifies that the getters filter restricted keys. |
166 TEST_F(ManifestTest, RestrictedKeys) { | 167 TEST_F(ManifestTest, RestrictedKeys) { |
167 scoped_ptr<DictionaryValue> value(new DictionaryValue()); | 168 scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue()); |
168 value->SetString(keys::kName, "extension"); | 169 value->SetString(keys::kName, "extension"); |
169 value->SetString(keys::kVersion, "1"); | 170 value->SetString(keys::kVersion, "1"); |
170 | 171 |
171 scoped_ptr<Manifest> manifest( | 172 scoped_ptr<Manifest> manifest( |
172 new Manifest(Manifest::INTERNAL, value.Pass())); | 173 new Manifest(Manifest::INTERNAL, value.Pass())); |
173 std::string error; | 174 std::string error; |
174 std::vector<InstallWarning> warnings; | 175 std::vector<InstallWarning> warnings; |
175 manifest->ValidateManifest(&error, &warnings); | 176 manifest->ValidateManifest(&error, &warnings); |
176 EXPECT_TRUE(error.empty()); | 177 EXPECT_TRUE(error.empty()); |
177 EXPECT_TRUE(warnings.empty()); | 178 EXPECT_TRUE(warnings.empty()); |
178 | 179 |
179 // Platform apps cannot have a "page_action" key. | 180 // Platform apps cannot have a "page_action" key. |
180 MutateManifest( | 181 MutateManifest( |
181 &manifest, keys::kPageAction, new DictionaryValue()); | 182 &manifest, keys::kPageAction, new base::DictionaryValue()); |
182 AssertType(manifest.get(), Manifest::TYPE_EXTENSION); | 183 AssertType(manifest.get(), Manifest::TYPE_EXTENSION); |
183 base::Value* output = NULL; | 184 base::Value* output = NULL; |
184 EXPECT_TRUE(manifest->HasKey(keys::kPageAction)); | 185 EXPECT_TRUE(manifest->HasKey(keys::kPageAction)); |
185 EXPECT_TRUE(manifest->Get(keys::kPageAction, &output)); | 186 EXPECT_TRUE(manifest->Get(keys::kPageAction, &output)); |
186 | 187 |
187 MutateManifest( | 188 MutateManifest( |
188 &manifest, keys::kPlatformAppBackground, new DictionaryValue()); | 189 &manifest, keys::kPlatformAppBackground, new base::DictionaryValue()); |
189 AssertType(manifest.get(), Manifest::TYPE_PLATFORM_APP); | 190 AssertType(manifest.get(), Manifest::TYPE_PLATFORM_APP); |
190 EXPECT_FALSE(manifest->HasKey(keys::kPageAction)); | 191 EXPECT_FALSE(manifest->HasKey(keys::kPageAction)); |
191 EXPECT_FALSE(manifest->Get(keys::kPageAction, &output)); | 192 EXPECT_FALSE(manifest->Get(keys::kPageAction, &output)); |
192 MutateManifest( | 193 MutateManifest( |
193 &manifest, keys::kPlatformAppBackground, NULL); | 194 &manifest, keys::kPlatformAppBackground, NULL); |
194 | 195 |
195 // "commands" is restricted to manifest_version >= 2. | 196 // "commands" is restricted to manifest_version >= 2. |
196 { | 197 { |
197 // ... and dev channel, for now. | 198 // ... and dev channel, for now. |
198 Feature::ScopedCurrentChannel dev_channel_scope( | 199 Feature::ScopedCurrentChannel dev_channel_scope( |
199 chrome::VersionInfo::CHANNEL_DEV); | 200 chrome::VersionInfo::CHANNEL_DEV); |
200 | 201 |
201 MutateManifest( | 202 MutateManifest( |
202 &manifest, keys::kCommands, new DictionaryValue()); | 203 &manifest, keys::kCommands, new base::DictionaryValue()); |
203 EXPECT_FALSE(manifest->HasKey(keys::kCommands)); | 204 EXPECT_FALSE(manifest->HasKey(keys::kCommands)); |
204 EXPECT_FALSE(manifest->Get(keys::kCommands, &output)); | 205 EXPECT_FALSE(manifest->Get(keys::kCommands, &output)); |
205 | 206 |
206 MutateManifest( | 207 MutateManifest( |
207 &manifest, keys::kManifestVersion, Value::CreateIntegerValue(2)); | 208 &manifest, keys::kManifestVersion, new base::FundamentalValue(2)); |
208 EXPECT_TRUE(manifest->HasKey(keys::kCommands)); | 209 EXPECT_TRUE(manifest->HasKey(keys::kCommands)); |
209 EXPECT_TRUE(manifest->Get(keys::kCommands, &output)); | 210 EXPECT_TRUE(manifest->Get(keys::kCommands, &output)); |
210 } | 211 } |
211 }; | 212 }; |
212 | 213 |
213 } // namespace extensions | 214 } // namespace extensions |
OLD | NEW |