// Copyright 2014 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_COMMON_MANIFEST_HANDLERS_PERMISSIONS_PARSER_H_
#define EXTENSIONS_COMMON_MANIFEST_HANDLERS_PERMISSIONS_PARSER_H_

#include "base/memory/scoped_ptr.h"
#include "base/strings/string16.h"
#include "extensions/common/permissions/api_permission.h"
#include "extensions/common/permissions/permission_set.h"

namespace extensions {

class Extension;
class URLPatternSet;

// The class for parsing the kPermissions and kOptionalPermissions keys in the
// manifest. Because permissions are slightly different than other keys (they
// are used in many different handlers and need to be the first and last key
// touched), this is not an actual ManifestHandler (hence the difference in
// name).
class PermissionsParser {
 public:
  PermissionsParser();
  ~PermissionsParser();

  // Parse the manifest-specified permissions.
  bool Parse(Extension* extension, base::string16* error);

  // Finalize the permissions, setting the related manifest data on the
  // extension.
  void Finalize(Extension* extension);

  // Modify the manifest permissions. These methods should only be used
  // during initialization and will DCHECK() for safety.
  static void AddAPIPermission(Extension* extension,
                               APIPermission::ID permission);
  static void AddAPIPermission(Extension* extension, APIPermission* permission);
  static bool HasAPIPermission(const Extension* extension,
                               APIPermission::ID permission);
  static void SetScriptableHosts(Extension* extension,
                                 const URLPatternSet& scriptable_hosts);

  // Return the extension's manifest-specified permissions. In no cases should
  // these permissions be used to determine if an action is allowed. Instead,
  // use PermissionsData.
  static scoped_refptr<const PermissionSet> GetRequiredPermissions(
      const Extension* extension);
  static scoped_refptr<const PermissionSet> GetOptionalPermissions(
      const Extension* extension);

 private:
  struct InitialPermissions;

  // The initial permissions for the extension, which can still be modified.
  scoped_ptr<InitialPermissions> initial_required_permissions_;
  scoped_ptr<InitialPermissions> initial_optional_permissions_;
};

}  // namespace extensions

#endif  // EXTENSIONS_COMMON_MANIFEST_HANDLERS_PERMISSIONS_PARSER_H_
