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

#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_CREDENTIALMANAGEMENT_IDENTITY_CREDENTIAL_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_CREDENTIALMANAGEMENT_IDENTITY_CREDENTIAL_H_

#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_identity_credential_disconnect_options.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_identity_credential_logout_r_ps_request.h"
#include "third_party/blink/renderer/modules/credentialmanagement/credential.h"
#include "third_party/blink/renderer/modules/modules_export.h"
#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
#include "third_party/blink/renderer/platform/weborigin/kurl.h"
#include "third_party/blink/renderer/platform/weborigin/security_origin.h"

namespace blink {

class ContentSecurityPolicy;

class MODULES_EXPORT IdentityCredential final : public Credential {
  DEFINE_WRAPPERTYPEINFO();

 public:
  static IdentityCredential* Create(const ScriptValue& token,
                                    bool is_auto_selected = false,
                                    const String& config_url = g_empty_string);

  static bool IsRejectingPromiseDueToCSP(ContentSecurityPolicy* policy,
                                         ScriptPromiseResolverBase* resolver,
                                         const KURL& provider_url);

  explicit IdentityCredential(const ScriptValue& token,
                              bool is_auto_selected,
                              const String& config_url);

  // Credential:
  bool IsIdentityCredential() const override;

  // IdentityCredential.idl
  ScriptValue token(ScriptState* script_state) const;
  const bool& isAutoSelected() const { return is_auto_selected_; }
  const String& configURL() const { return config_url_; }

  static ScriptPromise<IDLUndefined> disconnect(
      ScriptState*,
      const IdentityCredentialDisconnectOptions* options,
      ExceptionState&);

  void Trace(Visitor* visitor) const override;

 private:
  ScriptValue token_value_;
  const bool is_auto_selected_{false};
  const String config_url_;
};

}  // namespace blink

#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_CREDENTIALMANAGEMENT_IDENTITY_CREDENTIAL_H_
