Disable view source for Developer Tools.
[chromium-blink-merge.git] / chrome / common / extensions / features / complex_feature.cc
bloba1cedfaacba76e4e0f5747180ee15629a13949a2
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.
5 #include "chrome/common/extensions/features/complex_feature.h"
7 namespace extensions {
9 ComplexFeature::ComplexFeature(scoped_ptr<FeatureList> features) {
10 DCHECK_GT(features->size(), 0UL);
11 features_.swap(*features);
14 ComplexFeature::~ComplexFeature() {
17 Feature::Availability ComplexFeature::IsAvailableToManifest(
18 const std::string& extension_id, Manifest::Type type, Location location,
19 int manifest_version, Platform platform) const {
20 Feature::Availability first_availability =
21 features_[0]->IsAvailableToManifest(
22 extension_id, type, location, manifest_version, platform);
23 if (first_availability.is_available())
24 return first_availability;
26 for (FeatureList::const_iterator it = features_.begin() + 1;
27 it != features_.end(); ++it) {
28 Availability availability = (*it)->IsAvailableToManifest(
29 extension_id, type, location, manifest_version, platform);
30 if (availability.is_available())
31 return availability;
33 // If none of the SimpleFeatures are available, we return the availability
34 // info of the first SimpleFeature that was not available.
35 return first_availability;
38 Feature::Availability ComplexFeature::IsAvailableToContext(
39 const Extension* extension,
40 Context context,
41 const GURL& url,
42 Platform platform) const {
43 Feature::Availability first_availability =
44 features_[0]->IsAvailableToContext(extension, context, url, platform);
45 if (first_availability.is_available())
46 return first_availability;
48 for (FeatureList::const_iterator it = features_.begin() + 1;
49 it != features_.end(); ++it) {
50 Availability availability =
51 (*it)->IsAvailableToContext(extension, context, url, platform);
52 if (availability.is_available())
53 return availability;
55 // If none of the SimpleFeatures are available, we return the availability
56 // info of the first SimpleFeature that was not available.
57 return first_availability;
60 std::set<Feature::Context>* ComplexFeature::GetContexts() {
61 // TODO(justinlin): Current use cases for ComplexFeatures are simple (e.g.
62 // allow API in dev channel for everyone but stable channel for a whitelist),
63 // but if they get more complicated, we need to return some meaningful context
64 // set. Either that or remove this method from the Feature interface.
65 return features_[0]->GetContexts();
68 bool ComplexFeature::IsInternal() const {
69 // TODO(justinlin): Same as the above TODO.
70 return features_[0]->IsInternal();
73 std::string ComplexFeature::GetAvailabilityMessage(AvailabilityResult result,
74 Manifest::Type type,
75 const GURL& url,
76 Context context) const {
77 if (result == IS_AVAILABLE)
78 return std::string();
80 // TODO(justinlin): Form some kind of combined availabilities/messages from
81 // SimpleFeatures.
82 return features_[0]->GetAvailabilityMessage(result, type, url, context);
85 bool ComplexFeature::IsIdInWhitelist(const std::string& extension_id) const {
86 for (FeatureList::const_iterator it = features_.begin();
87 it != features_.end(); ++it) {
88 if ((*it)->IsIdInWhitelist(extension_id))
89 return true;
91 return false;
94 } // namespace extensions