Home | History | Annotate | Download | only in features
      1 // Copyright 2013 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 #ifndef EXTENSIONS_COMMON_FEATURES_FEATURE_H_
      6 #define EXTENSIONS_COMMON_FEATURES_FEATURE_H_
      7 
      8 #include <set>
      9 #include <string>
     10 
     11 #include "base/values.h"
     12 #include "extensions/common/manifest.h"
     13 
     14 class GURL;
     15 
     16 namespace extensions {
     17 
     18 class Extension;
     19 
     20 // Represents a single feature accessible to an extension developer, such as a
     21 // top-level manifest key, a permission, or a programmatic API. A feature can
     22 // express requirements for where it can be accessed, and supports testing
     23 // support for those requirements. If platforms are not specified, then feature
     24 // is available on all platforms.
     25 class Feature {
     26  public:
     27   // The JavaScript contexts the feature is supported in.
     28   enum Context {
     29     UNSPECIFIED_CONTEXT,
     30 
     31     // A context in a privileged extension process.
     32     BLESSED_EXTENSION_CONTEXT,
     33 
     34     // A context in an unprivileged extension process.
     35     UNBLESSED_EXTENSION_CONTEXT,
     36 
     37     // A context from a content script.
     38     CONTENT_SCRIPT_CONTEXT,
     39 
     40     // A normal web page. This should have an associated URL matching pattern.
     41     WEB_PAGE_CONTEXT,
     42 
     43     // A web page context which has been blessed by the user. Typically this
     44     // will be via the installation of a hosted app, so this may host an
     45     // extension. This is not affected by the URL matching pattern.
     46     BLESSED_WEB_PAGE_CONTEXT,
     47   };
     48 
     49   // The platforms the feature is supported in.
     50   enum Platform {
     51     UNSPECIFIED_PLATFORM,
     52     CHROMEOS_PLATFORM,
     53     LINUX_PLATFORM,
     54     MACOSX_PLATFORM,
     55     WIN_PLATFORM
     56   };
     57 
     58   // Whether a feature is available in a given situation or not, and if not,
     59   // why not.
     60   enum AvailabilityResult {
     61     IS_AVAILABLE,
     62     NOT_FOUND_IN_WHITELIST,
     63     INVALID_URL,
     64     INVALID_TYPE,
     65     INVALID_CONTEXT,
     66     INVALID_LOCATION,
     67     INVALID_PLATFORM,
     68     INVALID_MIN_MANIFEST_VERSION,
     69     INVALID_MAX_MANIFEST_VERSION,
     70     NOT_PRESENT,
     71     UNSUPPORTED_CHANNEL,
     72     FOUND_IN_BLACKLIST,
     73   };
     74 
     75   // Container for AvailabiltyResult that also exposes a user-visible error
     76   // message in cases where the feature is not available.
     77   class Availability {
     78    public:
     79     AvailabilityResult result() const { return result_; }
     80     bool is_available() const { return result_ == IS_AVAILABLE; }
     81     const std::string& message() const { return message_; }
     82 
     83    private:
     84     friend class SimpleFeature;
     85     friend class Feature;
     86 
     87     // Instances should be created via Feature::CreateAvailability.
     88     Availability(AvailabilityResult result, const std::string& message)
     89         : result_(result), message_(message) { }
     90 
     91     const AvailabilityResult result_;
     92     const std::string message_;
     93   };
     94 
     95   Feature();
     96   virtual ~Feature();
     97 
     98   // Used by ChromeV8Context until the feature system is fully functional.
     99   // TODO(kalman): This is no longer used by ChromeV8Context, so what is the
    100   // comment trying to say?
    101   static Availability CreateAvailability(AvailabilityResult result,
    102                                          const std::string& message);
    103 
    104   const std::string& name() const { return name_; }
    105   void set_name(const std::string& name) { name_ = name; }
    106   const std::set<std::string>& dependencies() const { return dependencies_; }
    107   bool no_parent() const { return no_parent_; }
    108 
    109   // Gets the platform the code is currently running on.
    110   static Platform GetCurrentPlatform();
    111 
    112   virtual std::set<Context>* GetContexts() = 0;
    113 
    114   // Tests whether this is an internal API or not.
    115   virtual bool IsInternal() const = 0;
    116 
    117   // Returns True for features excluded from service worker backed contexts.
    118   virtual bool IsBlockedInServiceWorker() const = 0;
    119 
    120   // Returns true if the feature is available to be parsed into a new extension
    121   // manifest.
    122   Availability IsAvailableToManifest(const std::string& extension_id,
    123                                      Manifest::Type type,
    124                                      Manifest::Location location,
    125                                      int manifest_version) const {
    126     return IsAvailableToManifest(extension_id, type, location, manifest_version,
    127                                  GetCurrentPlatform());
    128   }
    129   virtual Availability IsAvailableToManifest(const std::string& extension_id,
    130                                              Manifest::Type type,
    131                                              Manifest::Location location,
    132                                              int manifest_version,
    133                                              Platform platform) const = 0;
    134 
    135   // Returns true if the feature is available to |extension|.
    136   Availability IsAvailableToExtension(const Extension* extension);
    137 
    138   // Returns true if the feature is available to be used in the specified
    139   // extension and context.
    140   Availability IsAvailableToContext(const Extension* extension,
    141                                     Context context,
    142                                     const GURL& url) const {
    143     return IsAvailableToContext(extension, context, url, GetCurrentPlatform());
    144   }
    145   virtual Availability IsAvailableToContext(const Extension* extension,
    146                                             Context context,
    147                                             const GURL& url,
    148                                             Platform platform) const = 0;
    149 
    150   virtual std::string GetAvailabilityMessage(AvailabilityResult result,
    151                                              Manifest::Type type,
    152                                              const GURL& url,
    153                                              Context context) const = 0;
    154 
    155   virtual bool IsIdInBlacklist(const std::string& extension_id) const = 0;
    156   virtual bool IsIdInWhitelist(const std::string& extension_id) const = 0;
    157 
    158  protected:
    159   std::string name_;
    160   std::set<std::string> dependencies_;
    161   bool no_parent_;
    162 };
    163 
    164 }  // namespace extensions
    165 
    166 #endif  // EXTENSIONS_COMMON_FEATURES_FEATURE_H_
    167