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/features/simple_feature.h" | 5 #include "chrome/common/extensions/features/simple_feature.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
11 #include "base/lazy_instance.h" | 11 #include "base/lazy_instance.h" |
12 #include "base/string_util.h" | 12 #include "base/string_util.h" |
13 #include "base/stringprintf.h" | 13 #include "base/stringprintf.h" |
14 #include "chrome/common/chrome_switches.h" | 14 #include "chrome/common/chrome_switches.h" |
15 | 15 |
16 using chrome::VersionInfo; | 16 using chrome::VersionInfo; |
17 using extensions::Extension; | 17 |
| 18 namespace extensions { |
18 | 19 |
19 namespace { | 20 namespace { |
20 | 21 |
21 struct Mappings { | 22 struct Mappings { |
22 Mappings() { | 23 Mappings() { |
23 extension_types["extension"] = Extension::TYPE_EXTENSION; | 24 extension_types["extension"] = Manifest::TYPE_EXTENSION; |
24 extension_types["theme"] = Extension::TYPE_THEME; | 25 extension_types["theme"] = Manifest::TYPE_THEME; |
25 extension_types["packaged_app"] | 26 extension_types["packaged_app"] = Manifest::TYPE_LEGACY_PACKAGED_APP; |
26 = Extension::TYPE_LEGACY_PACKAGED_APP; | 27 extension_types["hosted_app"] = Manifest::TYPE_HOSTED_APP; |
27 extension_types["hosted_app"] = Extension::TYPE_HOSTED_APP; | 28 extension_types["platform_app"] = Manifest::TYPE_PLATFORM_APP; |
28 extension_types["platform_app"] = Extension::TYPE_PLATFORM_APP; | |
29 | 29 |
30 contexts["blessed_extension"] = | 30 contexts["blessed_extension"] = Feature::BLESSED_EXTENSION_CONTEXT; |
31 extensions::Feature::BLESSED_EXTENSION_CONTEXT; | 31 contexts["unblessed_extension"] = Feature::UNBLESSED_EXTENSION_CONTEXT; |
32 contexts["unblessed_extension"] = | 32 contexts["content_script"] = Feature::CONTENT_SCRIPT_CONTEXT; |
33 extensions::Feature::UNBLESSED_EXTENSION_CONTEXT; | 33 contexts["web_page"] = Feature::WEB_PAGE_CONTEXT; |
34 contexts["content_script"] = extensions::Feature::CONTENT_SCRIPT_CONTEXT; | |
35 contexts["web_page"] = extensions::Feature::WEB_PAGE_CONTEXT; | |
36 | 34 |
37 locations["component"] = extensions::Feature::COMPONENT_LOCATION; | 35 locations["component"] = Feature::COMPONENT_LOCATION; |
38 | 36 |
39 platforms["chromeos"] = extensions::Feature::CHROMEOS_PLATFORM; | 37 platforms["chromeos"] = Feature::CHROMEOS_PLATFORM; |
40 | 38 |
41 channels["trunk"] = VersionInfo::CHANNEL_UNKNOWN; | 39 channels["trunk"] = VersionInfo::CHANNEL_UNKNOWN; |
42 channels["canary"] = VersionInfo::CHANNEL_CANARY; | 40 channels["canary"] = VersionInfo::CHANNEL_CANARY; |
43 channels["dev"] = VersionInfo::CHANNEL_DEV; | 41 channels["dev"] = VersionInfo::CHANNEL_DEV; |
44 channels["beta"] = VersionInfo::CHANNEL_BETA; | 42 channels["beta"] = VersionInfo::CHANNEL_BETA; |
45 channels["stable"] = VersionInfo::CHANNEL_STABLE; | 43 channels["stable"] = VersionInfo::CHANNEL_STABLE; |
46 } | 44 } |
47 | 45 |
48 std::map<std::string, Extension::Type> extension_types; | 46 std::map<std::string, Manifest::Type> extension_types; |
49 std::map<std::string, extensions::Feature::Context> contexts; | 47 std::map<std::string, Feature::Context> contexts; |
50 std::map<std::string, extensions::Feature::Location> locations; | 48 std::map<std::string, Feature::Location> locations; |
51 std::map<std::string, extensions::Feature::Platform> platforms; | 49 std::map<std::string, Feature::Platform> platforms; |
52 std::map<std::string, VersionInfo::Channel> channels; | 50 std::map<std::string, VersionInfo::Channel> channels; |
53 }; | 51 }; |
54 | 52 |
55 base::LazyInstance<Mappings> g_mappings = LAZY_INSTANCE_INITIALIZER; | 53 base::LazyInstance<Mappings> g_mappings = LAZY_INSTANCE_INITIALIZER; |
56 | 54 |
57 std::string GetChannelName(VersionInfo::Channel channel) { | 55 std::string GetChannelName(VersionInfo::Channel channel) { |
58 typedef std::map<std::string, VersionInfo::Channel> ChannelsMap; | 56 typedef std::map<std::string, VersionInfo::Channel> ChannelsMap; |
59 ChannelsMap channels = g_mappings.Get().channels; | 57 ChannelsMap channels = g_mappings.Get().channels; |
60 for (ChannelsMap::iterator i = channels.begin(); i != channels.end(); ++i) { | 58 for (ChannelsMap::iterator i = channels.begin(); i != channels.end(); ++i) { |
61 if (i->second == channel) | 59 if (i->second == channel) |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 ParseSet(value, property, &string_set); | 127 ParseSet(value, property, &string_set); |
130 for (std::set<std::string>::iterator iter = string_set.begin(); | 128 for (std::set<std::string>::iterator iter = string_set.begin(); |
131 iter != string_set.end(); ++iter) { | 129 iter != string_set.end(); ++iter) { |
132 T enum_value = static_cast<T>(0); | 130 T enum_value = static_cast<T>(0); |
133 ParseEnum(*iter, &enum_value, mapping); | 131 ParseEnum(*iter, &enum_value, mapping); |
134 enum_set->insert(enum_value); | 132 enum_set->insert(enum_value); |
135 } | 133 } |
136 } | 134 } |
137 | 135 |
138 // Gets a human-readable name for the given extension type. | 136 // Gets a human-readable name for the given extension type. |
139 std::string GetDisplayTypeName(Extension::Type type) { | 137 std::string GetDisplayTypeName(Manifest::Type type) { |
140 switch (type) { | 138 switch (type) { |
141 case Extension::TYPE_UNKNOWN: | 139 case Manifest::TYPE_UNKNOWN: |
142 return "unknown"; | 140 return "unknown"; |
143 case Extension::TYPE_EXTENSION: | 141 case Manifest::TYPE_EXTENSION: |
144 return "extension"; | 142 return "extension"; |
145 case Extension::TYPE_HOSTED_APP: | 143 case Manifest::TYPE_HOSTED_APP: |
146 return "hosted app"; | 144 return "hosted app"; |
147 case Extension::TYPE_LEGACY_PACKAGED_APP: | 145 case Manifest::TYPE_LEGACY_PACKAGED_APP: |
148 return "legacy packaged app"; | 146 return "legacy packaged app"; |
149 case Extension::TYPE_PLATFORM_APP: | 147 case Manifest::TYPE_PLATFORM_APP: |
150 return "packaged app"; | 148 return "packaged app"; |
151 case Extension::TYPE_THEME: | 149 case Manifest::TYPE_THEME: |
152 return "theme"; | 150 return "theme"; |
153 case Extension::TYPE_USER_SCRIPT: | 151 case Manifest::TYPE_USER_SCRIPT: |
154 return "user script"; | 152 return "user script"; |
155 } | 153 } |
156 | 154 |
157 NOTREACHED(); | 155 NOTREACHED(); |
158 return ""; | 156 return ""; |
159 } | 157 } |
160 | 158 |
161 } // namespace | 159 } // namespace |
162 | 160 |
163 namespace extensions { | |
164 | |
165 SimpleFeature::SimpleFeature() | 161 SimpleFeature::SimpleFeature() |
166 : location_(UNSPECIFIED_LOCATION), | 162 : location_(UNSPECIFIED_LOCATION), |
167 platform_(UNSPECIFIED_PLATFORM), | 163 platform_(UNSPECIFIED_PLATFORM), |
168 min_manifest_version_(0), | 164 min_manifest_version_(0), |
169 max_manifest_version_(0), | 165 max_manifest_version_(0), |
170 channel_(VersionInfo::CHANNEL_UNKNOWN) { | 166 channel_(VersionInfo::CHANNEL_UNKNOWN) { |
171 } | 167 } |
172 | 168 |
173 SimpleFeature::SimpleFeature(const SimpleFeature& other) | 169 SimpleFeature::SimpleFeature(const SimpleFeature& other) |
174 : whitelist_(other.whitelist_), | 170 : whitelist_(other.whitelist_), |
(...skipping 15 matching lines...) Expand all Loading... |
190 contexts_ == other.contexts_ && | 186 contexts_ == other.contexts_ && |
191 location_ == other.location_ && | 187 location_ == other.location_ && |
192 platform_ == other.platform_ && | 188 platform_ == other.platform_ && |
193 min_manifest_version_ == other.min_manifest_version_ && | 189 min_manifest_version_ == other.min_manifest_version_ && |
194 max_manifest_version_ == other.max_manifest_version_ && | 190 max_manifest_version_ == other.max_manifest_version_ && |
195 channel_ == other.channel_; | 191 channel_ == other.channel_; |
196 } | 192 } |
197 | 193 |
198 void SimpleFeature::Parse(const DictionaryValue* value) { | 194 void SimpleFeature::Parse(const DictionaryValue* value) { |
199 ParseSet(value, "whitelist", &whitelist_); | 195 ParseSet(value, "whitelist", &whitelist_); |
200 ParseEnumSet<Extension::Type>(value, "extension_types", &extension_types_, | 196 ParseEnumSet<Manifest::Type>(value, "extension_types", &extension_types_, |
201 g_mappings.Get().extension_types); | 197 g_mappings.Get().extension_types); |
202 ParseEnumSet<Context>(value, "contexts", &contexts_, | 198 ParseEnumSet<Context>(value, "contexts", &contexts_, |
203 g_mappings.Get().contexts); | 199 g_mappings.Get().contexts); |
204 ParseEnum<Location>(value, "location", &location_, | 200 ParseEnum<Location>(value, "location", &location_, |
205 g_mappings.Get().locations); | 201 g_mappings.Get().locations); |
206 ParseEnum<Platform>(value, "platform", &platform_, | 202 ParseEnum<Platform>(value, "platform", &platform_, |
207 g_mappings.Get().platforms); | 203 g_mappings.Get().platforms); |
208 value->GetInteger("min_manifest_version", &min_manifest_version_); | 204 value->GetInteger("min_manifest_version", &min_manifest_version_); |
209 value->GetInteger("max_manifest_version", &max_manifest_version_); | 205 value->GetInteger("max_manifest_version", &max_manifest_version_); |
210 ParseEnum<VersionInfo::Channel>( | 206 ParseEnum<VersionInfo::Channel>( |
211 value, "channel", &channel_, | 207 value, "channel", &channel_, |
212 g_mappings.Get().channels); | 208 g_mappings.Get().channels); |
213 } | 209 } |
214 | 210 |
215 Feature::Availability SimpleFeature::IsAvailableToManifest( | 211 Feature::Availability SimpleFeature::IsAvailableToManifest( |
216 const std::string& extension_id, | 212 const std::string& extension_id, |
217 Extension::Type type, | 213 Manifest::Type type, |
218 Location location, | 214 Location location, |
219 int manifest_version, | 215 int manifest_version, |
220 Platform platform) const { | 216 Platform platform) const { |
221 // Component extensions can access any feature. | 217 // Component extensions can access any feature. |
222 if (location == COMPONENT_LOCATION) | 218 if (location == COMPONENT_LOCATION) |
223 return CreateAvailability(IS_AVAILABLE, type); | 219 return CreateAvailability(IS_AVAILABLE, type); |
224 | 220 |
225 if (!whitelist_.empty()) { | 221 if (!whitelist_.empty()) { |
226 if (whitelist_.find(extension_id) == whitelist_.end()) { | 222 if (whitelist_.find(extension_id) == whitelist_.end()) { |
227 // TODO(aa): This is gross. There should be a better way to test the | 223 // TODO(aa): This is gross. There should be a better way to test the |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 | 272 |
277 if (!contexts_.empty() && | 273 if (!contexts_.empty() && |
278 contexts_.find(context) == contexts_.end()) { | 274 contexts_.find(context) == contexts_.end()) { |
279 return CreateAvailability(INVALID_CONTEXT, extension->GetType()); | 275 return CreateAvailability(INVALID_CONTEXT, extension->GetType()); |
280 } | 276 } |
281 | 277 |
282 return CreateAvailability(IS_AVAILABLE); | 278 return CreateAvailability(IS_AVAILABLE); |
283 } | 279 } |
284 | 280 |
285 std::string SimpleFeature::GetAvailabilityMessage( | 281 std::string SimpleFeature::GetAvailabilityMessage( |
286 AvailabilityResult result, Extension::Type type) const { | 282 AvailabilityResult result, Manifest::Type type) const { |
287 switch (result) { | 283 switch (result) { |
288 case IS_AVAILABLE: | 284 case IS_AVAILABLE: |
289 return ""; | 285 return ""; |
290 case NOT_FOUND_IN_WHITELIST: | 286 case NOT_FOUND_IN_WHITELIST: |
291 return base::StringPrintf( | 287 return base::StringPrintf( |
292 "'%s' is not allowed for specified extension ID.", | 288 "'%s' is not allowed for specified extension ID.", |
293 name().c_str()); | 289 name().c_str()); |
294 case INVALID_TYPE: { | 290 case INVALID_TYPE: { |
295 std::string allowed_type_names; | 291 std::string allowed_type_names; |
296 // Turn the set of allowed types into a vector so that it's easier to | 292 // Turn the set of allowed types into a vector so that it's easier to |
297 // inject the appropriate separator into the display string. | 293 // inject the appropriate separator into the display string. |
298 std::vector<Extension::Type> extension_types( | 294 std::vector<Manifest::Type> extension_types( |
299 extension_types_.begin(), extension_types_.end()); | 295 extension_types_.begin(), extension_types_.end()); |
300 for (size_t i = 0; i < extension_types.size(); i++) { | 296 for (size_t i = 0; i < extension_types.size(); i++) { |
301 // Pluralize type name. | 297 // Pluralize type name. |
302 allowed_type_names += GetDisplayTypeName(extension_types[i]) + "s"; | 298 allowed_type_names += GetDisplayTypeName(extension_types[i]) + "s"; |
303 if (i == extension_types_.size() - 2) { | 299 if (i == extension_types_.size() - 2) { |
304 allowed_type_names += " and "; | 300 allowed_type_names += " and "; |
305 } else if (i != extension_types_.size() - 1) { | 301 } else if (i != extension_types_.size() - 1) { |
306 allowed_type_names += ", "; | 302 allowed_type_names += ", "; |
307 } | 303 } |
308 } | 304 } |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 GetChannelName(GetCurrentChannel()).c_str()); | 345 GetChannelName(GetCurrentChannel()).c_str()); |
350 } | 346 } |
351 | 347 |
352 NOTREACHED(); | 348 NOTREACHED(); |
353 return ""; | 349 return ""; |
354 } | 350 } |
355 | 351 |
356 Feature::Availability SimpleFeature::CreateAvailability( | 352 Feature::Availability SimpleFeature::CreateAvailability( |
357 AvailabilityResult result) const { | 353 AvailabilityResult result) const { |
358 return Availability( | 354 return Availability( |
359 result, GetAvailabilityMessage(result, Extension::TYPE_UNKNOWN)); | 355 result, GetAvailabilityMessage(result, Manifest::TYPE_UNKNOWN)); |
360 } | 356 } |
361 | 357 |
362 Feature::Availability SimpleFeature::CreateAvailability( | 358 Feature::Availability SimpleFeature::CreateAvailability( |
363 AvailabilityResult result, Extension::Type type) const { | 359 AvailabilityResult result, Manifest::Type type) const { |
364 return Availability(result, GetAvailabilityMessage(result, type)); | 360 return Availability(result, GetAvailabilityMessage(result, type)); |
365 } | 361 } |
366 | 362 |
367 std::set<Feature::Context>* SimpleFeature::GetContexts() { | 363 std::set<Feature::Context>* SimpleFeature::GetContexts() { |
368 return &contexts_; | 364 return &contexts_; |
369 } | 365 } |
370 | 366 |
371 } // namespace extensions | 367 } // namespace extensions |
OLD | NEW |