// Copyright (c) 2012 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 PPAPI_SHARED_IMPL_PPAPI_PERMISSIONS_H_
#define PPAPI_SHARED_IMPL_PPAPI_PERMISSIONS_H_

#include <stdint.h>

#include "ppapi/shared_impl/ppapi_shared_export.h"

namespace ppapi {

enum Permission {
  // Placeholder/uninitialized permission.
  PERMISSION_NONE = 0,

  // Allows access to dev interfaces. These are experimental interfaces not
  // tied to any particular release channel.
  PERMISSION_DEV = 1 << 0,

  // Allows access to Browser-internal interfaces.
  PERMISSION_PRIVATE = 1 << 1,

  // Allows ability to bypass user-gesture checks for showing things like
  // file select dialogs.
  PERMISSION_BYPASS_USER_GESTURE = 1 << 2,

  // Testing-only interfaces.
  PERMISSION_TESTING = 1 << 3,

  // Flash-related interfaces.
  PERMISSION_FLASH = 1 << 4,

  // "Dev channel" interfaces. This is different than PERMISSION_DEV above;
  // these interfaces may only be used on Dev or Canary channel releases of
  // Chrome.
  PERMISSION_DEV_CHANNEL = 1 << 5,

  // PDF-related interfaces.
  PERMISSION_PDF = 1 << 6,

  // Socket APIs. Formerly part of public APIs.
  PERMISSION_SOCKET = 1 << 7,

  // NOTE: If you add stuff be sure to update PERMISSION_ALL_BITS.

  // Meta permission for for initializing plugins with permissions that have
  // historically been part of public APIs but are now covered by finer-grained
  // permissions.
  PERMISSION_DEFAULT = PERMISSION_SOCKET,

  // Meta permission for initializing plugins registered on the command line
  // that get all permissions.
  PERMISSION_ALL_BITS = PERMISSION_DEV | PERMISSION_PRIVATE |
                        PERMISSION_BYPASS_USER_GESTURE | PERMISSION_TESTING |
                        PERMISSION_FLASH | PERMISSION_DEV_CHANNEL |
                        PERMISSION_PDF | PERMISSION_SOCKET,
};

class PPAPI_SHARED_EXPORT PpapiPermissions {
 public:
  // Initializes the permissions struct with no permissions.
  PpapiPermissions();

  // Initializes with the given permissions bits set.
  explicit PpapiPermissions(uint32_t perms);

  ~PpapiPermissions();

  // Returns a permissions class with all features enabled. This is for testing
  // and manually registered plugins.
  static PpapiPermissions AllPermissions();

  // Returns the effective permissions given the "base" permissions granted
  // to the given plugin and the current command line flags, which may enable
  // more features.
  static PpapiPermissions GetForCommandLine(uint32_t base_perms);

  bool HasPermission(Permission perm) const;

  // Returns the internal permission bits. Use for serialization only.
  uint32_t GetBits() const { return permissions_; }

 private:
  uint32_t permissions_;

  // Note: Copy & assign supported.
};

}  // namespace ppapi

#endif  // PPAPI_SHARED_IMPL_PPAPI_PERMISSIONS_H_
