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 // A page within webui. 49 WEBUI_CONTEXT, 50 }; 51 52 // The platforms the feature is supported in. 53 enum Platform { 54 UNSPECIFIED_PLATFORM, 55 CHROMEOS_PLATFORM, 56 LINUX_PLATFORM, 57 MACOSX_PLATFORM, 58 WIN_PLATFORM 59 }; 60 61 // Whether a feature is available in a given situation or not, and if not, 62 // why not. 63 enum AvailabilityResult { 64 IS_AVAILABLE, 65 NOT_FOUND_IN_WHITELIST, 66 INVALID_URL, 67 INVALID_TYPE, 68 INVALID_CONTEXT, 69 INVALID_LOCATION, 70 INVALID_PLATFORM, 71 INVALID_MIN_MANIFEST_VERSION, 72 INVALID_MAX_MANIFEST_VERSION, 73 NOT_PRESENT, 74 UNSUPPORTED_CHANNEL, 75 FOUND_IN_BLACKLIST, 76 }; 77 78 // Container for AvailabiltyResult that also exposes a user-visible error 79 // message in cases where the feature is not available. 80 class Availability { 81 public: result()82 AvailabilityResult result() const { return result_; } is_available()83 bool is_available() const { return result_ == IS_AVAILABLE; } message()84 const std::string& message() const { return message_; } 85 86 private: 87 friend class SimpleFeature; 88 friend class Feature; 89 90 // Instances should be created via Feature::CreateAvailability. Availability(AvailabilityResult result,const std::string & message)91 Availability(AvailabilityResult result, const std::string& message) 92 : result_(result), message_(message) { } 93 94 const AvailabilityResult result_; 95 const std::string message_; 96 }; 97 98 Feature(); 99 virtual ~Feature(); 100 101 // Used by ChromeV8Context until the feature system is fully functional. 102 // TODO(kalman): This is no longer used by ChromeV8Context, so what is the 103 // comment trying to say? 104 static Availability CreateAvailability(AvailabilityResult result, 105 const std::string& message); 106 name()107 const std::string& name() const { return name_; } set_name(const std::string & name)108 void set_name(const std::string& name) { name_ = name; } no_parent()109 bool no_parent() const { return no_parent_; } 110 111 // Gets the platform the code is currently running on. 112 static Platform GetCurrentPlatform(); 113 114 // Tests whether this is an internal API or not. 115 virtual bool IsInternal() const = 0; 116 117 // Returns true if the feature is available to be parsed into a new extension 118 // manifest. IsAvailableToManifest(const std::string & extension_id,Manifest::Type type,Manifest::Location location,int manifest_version)119 Availability IsAvailableToManifest(const std::string& extension_id, 120 Manifest::Type type, 121 Manifest::Location location, 122 int manifest_version) const { 123 return IsAvailableToManifest(extension_id, type, location, manifest_version, 124 GetCurrentPlatform()); 125 } 126 virtual Availability IsAvailableToManifest(const std::string& extension_id, 127 Manifest::Type type, 128 Manifest::Location location, 129 int manifest_version, 130 Platform platform) const = 0; 131 132 // Returns true if the feature is available to |extension|. 133 Availability IsAvailableToExtension(const Extension* extension); 134 135 // Returns true if the feature is available to be used in the specified 136 // extension and context. IsAvailableToContext(const Extension * extension,Context context,const GURL & url)137 Availability IsAvailableToContext(const Extension* extension, 138 Context context, 139 const GURL& url) const { 140 return IsAvailableToContext(extension, context, url, GetCurrentPlatform()); 141 } 142 virtual Availability IsAvailableToContext(const Extension* extension, 143 Context context, 144 const GURL& url, 145 Platform platform) const = 0; 146 147 virtual std::string GetAvailabilityMessage(AvailabilityResult result, 148 Manifest::Type type, 149 const GURL& url, 150 Context context) const = 0; 151 152 virtual bool IsIdInBlacklist(const std::string& extension_id) const = 0; 153 virtual bool IsIdInWhitelist(const std::string& extension_id) const = 0; 154 155 protected: 156 std::string name_; 157 bool no_parent_; 158 }; 159 160 } // namespace extensions 161 162 #endif // EXTENSIONS_COMMON_FEATURES_FEATURE_H_ 163