1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#ifndef EXTENSIONS_COMMON_FEATURES_COMPLEX_FEATURE_H_
6c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define EXTENSIONS_COMMON_FEATURES_COMPLEX_FEATURE_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <set>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_vector.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/features/feature.h"
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A ComplexFeature is composed of one or many Features. A ComplexFeature
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is available if any Feature (i.e. permission rule) that composes it is
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// available, but not if only some combination of Features is available.
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ComplexFeature : public Feature {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef ScopedVector<Feature> FeatureList;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit ComplexFeature(scoped_ptr<FeatureList> features);
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ComplexFeature();
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // extensions::Feature:
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual Availability IsAvailableToManifest(const std::string& extension_id,
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             Manifest::Type type,
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                             Manifest::Location location,
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             int manifest_version,
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             Platform platform) const OVERRIDE;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual Availability IsAvailableToContext(const Extension* extension,
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            Context context,
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            const GURL& url,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            Platform platform) const OVERRIDE;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual bool IsIdInBlacklist(const std::string& extension_id) const OVERRIDE;
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool IsIdInWhitelist(const std::string& extension_id) const OVERRIDE;
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // extensions::Feature:
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual std::string GetAvailabilityMessage(
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AvailabilityResult result,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Manifest::Type type,
488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      const GURL& url,
498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      Context context) const OVERRIDE;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool IsInternal() const OVERRIDE;
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FeatureList features_;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ComplexFeature);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace extensions
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif  // EXTENSIONS_COMMON_FEATURES_COMPLEX_FEATURE_H_
62