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 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// support for those requirements. If platforms are not specified, then feature 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// is available on all platforms. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Feature { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The JavaScript contexts the feature is supported in. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Context { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNSPECIFIED_CONTEXT, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A context in a privileged extension process. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BLESSED_EXTENSION_CONTEXT, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A context in an unprivileged extension process. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNBLESSED_EXTENSION_CONTEXT, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A context from a content script. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SCRIPT_CONTEXT, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A normal web page. This should have an associated URL matching pattern. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WEB_PAGE_CONTEXT, 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // A web page context which has been blessed by the user. Typically this 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // will be via the installation of a hosted app, so this may host an 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // extension. This is not affected by the URL matching pattern. 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BLESSED_WEB_PAGE_CONTEXT, 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // A page within webui. 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WEBUI_CONTEXT, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The platforms the feature is supported in. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Platform { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNSPECIFIED_PLATFORM, 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CHROMEOS_PLATFORM, 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LINUX_PLATFORM, 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MACOSX_PLATFORM, 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WIN_PLATFORM 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether a feature is available in a given situation or not, and if not, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // why not. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum AvailabilityResult { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IS_AVAILABLE, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOT_FOUND_IN_WHITELIST, 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) INVALID_URL, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INVALID_TYPE, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INVALID_CONTEXT, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INVALID_LOCATION, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INVALID_PLATFORM, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INVALID_MIN_MANIFEST_VERSION, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INVALID_MAX_MANIFEST_VERSION, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOT_PRESENT, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNSUPPORTED_CHANNEL, 75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FOUND_IN_BLACKLIST, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Container for AvailabiltyResult that also exposes a user-visible error 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message in cases where the feature is not available. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Availability { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AvailabilityResult result() const { return result_; } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_available() const { return result_ == IS_AVAILABLE; } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& message() const { return message_; } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class SimpleFeature; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class Feature; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Instances should be created via Feature::CreateAvailability. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Availability(AvailabilityResult result, const std::string& message) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : result_(result), message_(message) { } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AvailabilityResult result_; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string message_; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Feature(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Feature(); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Used by ChromeV8Context until the feature system is fully functional. 1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // TODO(kalman): This is no longer used by ChromeV8Context, so what is the 1030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // comment trying to say? 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static Availability CreateAvailability(AvailabilityResult result, 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& message); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name() const { return name_; } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_name(const std::string& name) { name_ = name; } 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool no_parent() const { return no_parent_; } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the platform the code is currently running on. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Platform GetCurrentPlatform(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Tests whether this is an internal API or not. 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool IsInternal() const = 0; 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the feature is available to be parsed into a new extension 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // manifest. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Availability IsAvailableToManifest(const std::string& extension_id, 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Type type, 1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Manifest::Location location, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int manifest_version) const { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return IsAvailableToManifest(extension_id, type, location, manifest_version, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCurrentPlatform()); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual Availability IsAvailableToManifest(const std::string& extension_id, 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Type type, 1280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Manifest::Location location, 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int manifest_version, 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Platform platform) const = 0; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Returns true if the feature is available to |extension|. 1330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Availability IsAvailableToExtension(const Extension* extension); 1340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the feature is available to be used in the specified 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extension and context. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Availability IsAvailableToContext(const Extension* extension, 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Context context, 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url) const { 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return IsAvailableToContext(extension, context, url, GetCurrentPlatform()); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual Availability IsAvailableToContext(const Extension* extension, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Context context, 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Platform platform) const = 0; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual std::string GetAvailabilityMessage(AvailabilityResult result, 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Type type, 1498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const GURL& url, 1508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Context context) const = 0; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual bool IsIdInBlacklist(const std::string& extension_id) const = 0; 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool IsIdInWhitelist(const std::string& extension_id) const = 0; 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name_; 1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool no_parent_; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif // EXTENSIONS_COMMON_FEATURES_FEATURE_H_ 163