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