Home | History | Annotate | Download | only in features
      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/features/complex_feature.h"
      6 
      7 namespace extensions {
      8 
      9 ComplexFeature::ComplexFeature(scoped_ptr<FeatureList> features) {
     10   DCHECK_GT(features->size(), 0UL);
     11   features_.swap(*features);
     12 }
     13 
     14 ComplexFeature::~ComplexFeature() {
     15 }
     16 
     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;
     25 
     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;
     32   }
     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;
     36 }
     37 
     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;
     47 
     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;
     54   }
     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;
     58 }
     59 
     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();
     66 }
     67 
     68 bool ComplexFeature::IsInternal() const {
     69   NOTREACHED();
     70   return false;
     71 }
     72 
     73 std::string ComplexFeature::GetAvailabilityMessage(AvailabilityResult result,
     74                                                    Manifest::Type type,
     75                                                    const GURL& url) const {
     76   if (result == IS_AVAILABLE)
     77     return std::string();
     78 
     79   // TODO(justinlin): Form some kind of combined availabilities/messages from
     80   // SimpleFeatures.
     81   return features_[0]->GetAvailabilityMessage(result, type, url);
     82 }
     83 
     84 bool ComplexFeature::IsIdInWhitelist(const std::string& extension_id) const {
     85   for (FeatureList::const_iterator it = features_.begin();
     86        it != features_.end(); ++it) {
     87     if ((*it)->IsIdInWhitelist(extension_id))
     88       return true;
     89   }
     90   return false;
     91 }
     92 
     93 }  // namespace extensions
     94