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