feature.h revision 3551c9c881056c480085172ff9840cab31610854
13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#ifndef EXTENSIONS_COMMON_FEATURES_FEATURE_H_ 63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define EXTENSIONS_COMMON_FEATURES_FEATURE_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GURL; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass Extension; 19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Represents a single feature accessible to an extension developer, such as a 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// top-level manifest key, a permission, or a programmatic API. A feature can 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// express requirements for where it can be accessed, and supports testing 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// support for those requirements. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Feature { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The JavaScript contexts the feature is supported in. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Context { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNSPECIFIED_CONTEXT, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A context in a privileged extension process. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BLESSED_EXTENSION_CONTEXT, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A context in an unprivileged extension process. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNBLESSED_EXTENSION_CONTEXT, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A context from a content script. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SCRIPT_CONTEXT, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A normal web page. This should have an associated URL matching pattern. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WEB_PAGE_CONTEXT, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The location required of extensions the feature is supported in. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Location { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNSPECIFIED_LOCATION, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPONENT_LOCATION 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The platforms the feature is supported in. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Platform { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNSPECIFIED_PLATFORM, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHROMEOS_PLATFORM 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether a feature is available in a given situation or not, and if not, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // why not. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum AvailabilityResult { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IS_AVAILABLE, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOT_FOUND_IN_WHITELIST, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) INVALID_URL, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INVALID_TYPE, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INVALID_CONTEXT, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INVALID_LOCATION, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INVALID_PLATFORM, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INVALID_MIN_MANIFEST_VERSION, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INVALID_MAX_MANIFEST_VERSION, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOT_PRESENT, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNSUPPORTED_CHANNEL, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Container for AvailabiltyResult that also exposes a user-visible error 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message in cases where the feature is not available. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Availability { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AvailabilityResult result() const { return result_; } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_available() const { return result_ == IS_AVAILABLE; } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& message() const { return message_; } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class SimpleFeature; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class Feature; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Instances should be created via Feature::CreateAvailability. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Availability(AvailabilityResult result, const std::string& message) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : result_(result), message_(message) { } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AvailabilityResult result_; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string message_; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Feature(); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Feature(); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Used by ChromeV8Context until the feature system is fully functional. 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static Availability CreateAvailability(AvailabilityResult result, 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& message); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name() const { return name_; } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_name(const std::string& name) { name_ = name; } 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::set<std::string>& dependencies() { return dependencies_; } 1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool no_parent() const { return no_parent_; } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the platform the code is currently running on. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Platform GetCurrentPlatform(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Gets the Feature::Location value for the specified Manifest::Location. 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static Location ConvertLocation(Manifest::Location extension_location); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual std::set<Context>* GetContexts() = 0; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Tests whether this is an internal API or not. 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool IsInternal() const = 0; 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the feature is available to be parsed into a new extension 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // manifest. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Availability IsAvailableToManifest(const std::string& extension_id, 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Type type, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int manifest_version) const { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return IsAvailableToManifest(extension_id, type, location, manifest_version, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCurrentPlatform()); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual Availability IsAvailableToManifest(const std::string& extension_id, 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Type type, 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Location location, 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int manifest_version, 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Platform platform) const = 0; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the feature is available to be used in the specified 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extension and context. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Availability IsAvailableToContext(const Extension* extension, 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Context context, 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url) const { 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return IsAvailableToContext(extension, context, url, GetCurrentPlatform()); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual Availability IsAvailableToContext(const Extension* extension, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Context context, 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Platform platform) const = 0; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual std::string GetAvailabilityMessage(AvailabilityResult result, 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Type type, 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url) const = 0; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool IsIdInWhitelist(const std::string& extension_id) const = 0; 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name_; 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::set<std::string> dependencies_; 1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool no_parent_; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif // EXTENSIONS_COMMON_FEATURES_FEATURE_H_ 156