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