chromium/chrome/browser/ash/plugin_vm/plugin_vm_features.h

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

#include <string>

#include "base/functional/callback.h"

class Profile;

namespace plugin_vm {

// PluginVmFeatures provides an interface for querying which parts of Plugin VM
// are enabled or allowed.
class PluginVmFeatures {
 public:
  static PluginVmFeatures* Get();

  enum class ProfileSupported {
    kOk,
    kErrorNonPrimary,
    kErrorChildAccount,
    kErrorOffTheRecord,
    kErrorEphemeral,
    // This is for all the other cases where the profile is not supported.
    kErrorNotSupported,
  };

  enum class PolicyConfigured {
    kOk,
    kErrorUnableToCheckPolicy,
    kErrorNotEnterpriseEnrolled,
    kErrorUserNotAffiliated,
    kErrorUnableToCheckDevicePolicy,
    kErrorNotAllowedByDevicePolicy,
    kErrorNotAllowedByUserPolicy,
    kErrorLicenseNotSetUp,
    kErrorVirtualMachinesNotAllowed,
  };

  // Remember to update `plugin_vm::GetDiagnostics()` when this struct or the
  // members change.
  struct IsAllowedDiagnostics {
    bool device_supported;
    ProfileSupported profile_supported;
    PolicyConfigured policy_configured;

    bool IsOk() const;
    // An empty string is returned if there is no error (i.e. `IsOk()`
    // returns true).
    std::string GetTopError() const;
  };

  // Check if Plugin VM is allowed for the current profile and return
  // diagnostics.
  virtual IsAllowedDiagnostics GetIsAllowedDiagnostics(const Profile* profile);

  // Checks if Plugin VM is allowed for the current profile and provides
  // a reason if it is not allowed. The reason string is to only be used
  // in crosh/vmc error messages.
  virtual bool IsAllowed(const Profile* profile, std::string* reason = nullptr);

  // Returns whether Plugin VM is installed. Using vmc may cause this to return
  // an incorrect value, e.g. by renaming or deleting VMs.
  virtual bool IsConfigured(const Profile* profile);

  // Returns true if Plugin VM is allowed and configured for the current
  // profile.
  virtual bool IsEnabled(const Profile* profile);

 protected:
  static void SetForTesting(PluginVmFeatures* features);

  PluginVmFeatures();
  virtual ~PluginVmFeatures();

 private:
  PluginVmFeatures(PluginVmFeatures&& registration) = delete;
  PluginVmFeatures& operator=(PluginVmFeatures&& registration) = delete;
};

}  // namespace plugin_vm

#endif  // CHROME_BROWSER_ASH_PLUGIN_VM_PLUGIN_VM_FEATURES_H_