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

#ifndef EXTENSIONS_RENDERER_FEATURE_CACHE_H_
#define EXTENSIONS_RENDERER_FEATURE_CACHE_H_

#include <map>
#include <string>
#include <utility>
#include <vector>

#include "base/macros.h"
#include "extensions/common/extension_id.h"
#include "extensions/common/features/feature.h"
#include "url/gurl.h"

namespace extensions {
class Extension;

// Caches features available to different extensions in different context types,
// and returns features available to a given context. Note: currently, this is
// only used for non-webpage contexts.
// TODO(devlin): Use it for all context types?
// Note: This could actually go in extensions/common/, if there was any need for
// it browser-side.
class FeatureCache {
 public:
  using FeatureNameVector = std::vector<std::string>;

  FeatureCache();
  ~FeatureCache();

  // Returns the names of features available to the given set of |context_type|,
  // |extension|, and |url| in a lexicographically sorted vector.
  // Note: these contexts should be valid, so WebUI contexts should have no
  // extensions, extension should be non-null for extension contexts, etc.
  FeatureNameVector GetAvailableFeatures(Feature::Context context_type,
                                         const Extension* extension,
                                         const GURL& url);

  // Invalidates the cache for the specified extension.
  void InvalidateExtension(const ExtensionId& extension_id);

 private:
  using FeatureVector = std::vector<const Feature*>;
  // Note: We use a key of ExtensionId, Feature::Context to maximize cache hits.
  // Unfortunately, this won't always be perfectly accurate, since some features
  // may have other context-dependent restrictions (such as URLs), but caching
  // by extension id + context + url would result in significantly fewer hits.
  using ExtensionCacheMapKey = std::pair<ExtensionId, Feature::Context>;
  using ExtensionCacheMap = std::map<ExtensionCacheMapKey, FeatureVector>;

  // Cache by origin.
  using WebUICacheMap = std::map<GURL, FeatureVector>;

  // Returns the features available to the given context from the cache,
  // creating a new entry if one doesn't exist.
  const FeatureVector& GetFeaturesFromCache(Feature::Context context_type,
                                            const Extension* extension,
                                            const GURL& origin);

  // Creates a FeatureVector to be entered into a cache for the specified
  // context data.
  FeatureVector CreateCacheEntry(Feature::Context context_type,
                                 const Extension* extension,
                                 const GURL& origin);

  // The cache of extension-related contexts. These may be invalidated, since
  // extension permissions change.
  ExtensionCacheMap extension_cache_;

  // The cache of WebUI-related features. These shouldn't need to be
  // invalidated (since WebUI permissions don't change), and are cached by
  // origin.
  WebUICacheMap webui_cache_;

  DISALLOW_COPY_AND_ASSIGN(FeatureCache);
};

}  // namespace extensions

#endif  // EXTENSIONS_RENDERER_FEATURE_CACHE_H_
