// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef EXTENSIONS_COMMON_EXTENSION_API_H_
#define EXTENSIONS_COMMON_EXTENSION_API_H_

#include <map>
#include <memory>
#include <string>
#include <string_view>

#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "base/synchronization/lock.h"
#include "base/thread_annotations.h"
#include "base/values.h"
#include "extensions/common/context_data.h"
#include "extensions/common/features/feature.h"
#include "extensions/common/features/feature_provider.h"
#include "extensions/common/mojom/context_type.mojom-forward.h"
#include "extensions/common/url_pattern_set.h"

class GURL;

namespace extensions {

class Extension;
class ExtensionsClient;
class Feature;

// Used when testing Feature availability to specify whether feature aliases
// should be ignored or not - i.e. if a feature exposed only through an alias
// should be considered available.
enum class CheckAliasStatus {
  // Includes aliases in an availability check.
  ALLOWED,
  // Ignores aliases during an availability check.
  NOT_ALLOWED
};

// C++ Wrapper for the JSON API definitions in chrome/common/extensions/api/.
//
// WARNING: This class is accessed on multiple threads in the browser process
// (see ExtensionFunctionDispatcher). No state should be modified after
// construction.
class ExtensionAPI {
 public:
  // Returns a single shared instance of this class. This is the typical use
  // case in Chrome.
  //
  // TODO(aa): Make this const to enforce thread-safe usage.
  static ExtensionAPI* GetSharedInstance();

  // Creates a new instance configured the way ExtensionAPI typically is in
  // Chrome. Use the default constructor to get a clean instance.
  static ExtensionAPI* CreateWithDefaultConfiguration();

  // Splits a name like "permission:bookmark" into ("permission", "bookmark").
  // The first part refers to a type of feature, for example "manifest",
  // "permission", or "api". The second part is the full name of the feature.
  //
  // TODO(kalman): ExtensionAPI isn't really the right place for this function.
  static void SplitDependencyName(const std::string& full_name,
                                  std::string* feature_type,
                                  std::string* feature_name);

  class OverrideSharedInstanceForTest {
   public:
    explicit OverrideSharedInstanceForTest(ExtensionAPI* testing_api);
    ~OverrideSharedInstanceForTest();

   private:
    raw_ptr<ExtensionAPI> original_api_;
  };

  // Creates a completely clean instance. Configure using
  // RegisterDependencyProvider before use.
  ExtensionAPI();

  ExtensionAPI(const ExtensionAPI&) = delete;
  ExtensionAPI& operator=(const ExtensionAPI&) = delete;

  virtual ~ExtensionAPI();

  // Add a FeatureProvider for APIs. The features are used to specify
  // dependencies and constraints on the availability of APIs.
  void RegisterDependencyProvider(const std::string& name,
                                  const FeatureProvider* provider);

  // Returns true if the API item called `api_full_name` and all of its
  // dependencies are available in `context`.
  //
  // `api_full_name` can be either a namespace name (like "bookmarks") or a
  // member name (like "bookmarks.create").
  //
  // Depending on the configuration of `api` (in _api_features.json), either
  // `extension` or `url` (or both) may determine its availability, but this is
  // up to the configuration of the individual feature.
  //
  // `check_alias` determines whether it should be tested whether the API
  // is available through an alias.
  //
  // TODO(kalman): This is just an unnecessary combination of finding a Feature
  // then calling Feature::IsAvailableToContext(..) on it. Just provide that
  // FindFeature function and let callers compose if they want.
  Feature::Availability IsAvailable(const std::string& api_full_name,
                                    const Extension* extension,
                                    mojom::ContextType context,
                                    const GURL& url,
                                    CheckAliasStatus check_alias,
                                    int context_id,
                                    const ContextData& context_data);

  // Determines whether an API, or any parts of that API, can be exposed to
  // `context`.
  //
  // `check_alias` determines whether it should be tested whether the API
  // is available through an alias.
  //
  bool IsAnyFeatureAvailableToContext(const Feature& api,
                                      const Extension* extension,
                                      mojom::ContextType context,
                                      const GURL& url,
                                      CheckAliasStatus check_alias,
                                      int context_id,
                                      const ContextData& context_data);

  // Gets the string_view for the schema specified by `api_name`.
  std::string_view GetSchemaStringPiece(const std::string& api_name);

  // Gets the schema for the extension API with namespace `full_name`.
  // Ownership remains with this object.
  // TODO(devlin): Now that we use GetSchemaStringPiece() in the renderer, we
  // may not really need this anymore.
  const base::Value::Dict* GetSchema(const std::string& full_name);

  // Splits a full name from the extension API into its API and child name
  // parts. Some examples:
  //
  // "bookmarks.create" -> ("bookmarks", "create")
  // "experimental.input.ui.cursorUp" -> ("experimental.input.ui", "cursorUp")
  // "storage.sync.set" -> ("storage", "sync.get")
  // "<unknown-api>.monkey" -> ("", "")
  //
  // The `child_name` parameter can be be NULL if you don't need that part.
  std::string GetAPINameFromFullName(const std::string& full_name,
                                     std::string* child_name);

  // Gets a feature from any dependency provider registered with ExtensionAPI.
  // Returns NULL if the feature could not be found.
  const Feature* GetFeatureDependency(const std::string& dependency_name);

 private:
  FRIEND_TEST_ALL_PREFIXES(ExtensionAPITest, DefaultConfigurationFeatures);

  void InitDefaultConfiguration();

  // Returns true if there exists an API with `name`. Declared virtual for
  // testing purposes.
  virtual bool IsKnownAPI(const std::string& name, ExtensionsClient* client);

  // Checks if `full_name` is available to provided context and extension under
  // associated API's alias name.
  Feature::Availability IsAliasAvailable(const std::string& full_name,
                                         const Feature& feature,
                                         const Extension* extension,
                                         mojom::ContextType context,
                                         const GURL& url,
                                         int context_id,
                                         const ContextData& context_data);

  // Loads a schema.
  void LoadSchema(const std::string& name, std::string_view schema);

  // Same as GetSchemaStringPiece() but doesn't acquire `lock_`.
  std::string_view GetSchemaStringPieceUnsafe(const std::string& api_name);

  // Same as GetAPINameFromFullName() but doesn't acquire `lock_`.
  std::string GetAPINameFromFullNameUnsafe(const std::string& full_name,
                                           std::string* child_name);

  bool default_configuration_initialized_ = false;

  base::Lock lock_;

  // Schemas for each namespace.
  using SchemaMap = std::map<std::string, base::Value::Dict>;
  SchemaMap schemas_ GUARDED_BY(lock_);

  // FeatureProviders used for resolving dependencies.
  using FeatureProviderMap =
      std::map<std::string, raw_ptr<const FeatureProvider, CtnExperimental>>;
  FeatureProviderMap dependency_providers_;
};

}  // namespace extensions

#endif  // EXTENSIONS_COMMON_EXTENSION_API_H_
