blob: 44cf7cfe9d5034c7590dcc5e05f836a6853df279 [file] [log] [blame]
// 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 COMPONENTS_PAYMENTS_CONTENT_SECURE_PAYMENT_CONFIRMATION_APP_H_
#define COMPONENTS_PAYMENTS_CONTENT_SECURE_PAYMENT_CONFIRMATION_APP_H_
#include <stdint.h>
#include <memory>
#include <string>
#include <vector>
#include "base/memory/weak_ptr.h"
#include "components/payments/content/payment_app.h"
#include "components/payments/content/secure_payment_confirmation_controller.h"
#include "content/public/browser/global_routing_id.h"
#include "content/public/browser/web_contents_observer.h"
#include "third_party/blink/public/mojom/payments/payment_request.mojom.h"
#include "third_party/blink/public/mojom/webauthn/authenticator.mojom-forward.h"
#include "url/origin.h"
class SkBitmap;
namespace webauthn {
class InternalAuthenticator;
} // namespace webauthn
namespace content {
class RenderFrameHost;
class WebContents;
} // namespace content
namespace payments {
class BrowserBoundKey;
class PasskeyBrowserBinder;
class PaymentRequestSpec;
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused. Keep in sync with
// src/tools/metrics/histograms/enums.xml.
enum class SecurePaymentConfirmationSystemPromptResult {
kCanceled = 0,
kAccepted = 1,
kMaxValue = kAccepted,
};
class SecurePaymentConfirmationApp : public PaymentApp,
public content::WebContentsObserver {
public:
// Please use `std::move()` for the `credential_id` parameter to avoid extra
// copies.
SecurePaymentConfirmationApp(
content::WebContents* web_contents_to_observe,
const std::string& effective_relying_party_identity,
const std::u16string& payment_instrument_label,
const std::u16string& payment_instrument_details,
std::unique_ptr<SkBitmap> payment_instrument_icon,
std::vector<uint8_t> credential_id,
std::unique_ptr<PasskeyBrowserBinder> passkey_browser_binder,
bool device_supports_browser_bound_keys_in_hardware,
const url::Origin& merchant_origin,
base::WeakPtr<PaymentRequestSpec> spec,
mojom::SecurePaymentConfirmationRequestPtr request,
std::unique_ptr<webauthn::InternalAuthenticator> authenticator,
std::vector<PaymentApp::PaymentEntityLogo> payment_entities_logos);
~SecurePaymentConfirmationApp() override;
SecurePaymentConfirmationApp(const SecurePaymentConfirmationApp& other) =
delete;
SecurePaymentConfirmationApp& operator=(
const SecurePaymentConfirmationApp& other) = delete;
// PaymentApp implementation.
void InvokePaymentApp(base::WeakPtr<Delegate> delegate) override;
bool IsCompleteForPayment() const override;
bool CanPreselect() const override;
std::u16string GetMissingInfoLabel() const override;
bool HasEnrolledInstrument() const override;
bool NeedsInstallation() const override;
std::string GetId() const override;
std::u16string GetLabel() const override;
std::u16string GetSublabel() const override;
const SkBitmap* icon_bitmap() const override;
std::vector<PaymentEntityLogo*> GetPaymentEntitiesLogos() override;
bool IsValidForModifier(const std::string& method) const override;
base::WeakPtr<PaymentApp> AsWeakPtr() override;
bool HandlesShippingAddress() const override;
bool HandlesPayerName() const override;
bool HandlesPayerEmail() const override;
bool HandlesPayerPhone() const override;
bool IsWaitingForPaymentDetailsUpdate() const override;
void UpdateWith(
mojom::PaymentRequestDetailsUpdatePtr details_update) override;
void OnPaymentDetailsNotUpdated() override;
void AbortPaymentApp(base::OnceCallback<void(bool)> abort_callback) override;
mojom::PaymentResponsePtr SetAppSpecificResponseFields(
mojom::PaymentResponsePtr response) const override;
// WebContentsObserver implementation.
void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override;
PasskeyBrowserBinder* GetPasskeyBrowserBinderForTesting();
private:
void OnGetBrowserBoundKey(
base::WeakPtr<Delegate> delegate,
blink::mojom::PublicKeyCredentialRequestOptionsPtr options,
bool is_new,
std::unique_ptr<BrowserBoundKey> browser_bound_key);
void OnGetAssertion(
base::WeakPtr<Delegate> delegate,
blink::mojom::AuthenticatorStatus status,
blink::mojom::GetAssertionAuthenticatorResponsePtr response,
blink::mojom::WebAuthnDOMExceptionDetailsPtr dom_exception_details);
// Used only for comparison with the RenderFrameHost pointer in
// RenderFrameDeleted() method.
content::GlobalRenderFrameHostId authenticator_frame_routing_id_;
const std::string effective_relying_party_identity_;
const std::u16string payment_instrument_label_;
const std::u16string payment_instrument_details_;
const std::unique_ptr<SkBitmap> payment_instrument_icon_;
const std::vector<uint8_t> credential_id_;
const url::Origin merchant_origin_;
const base::WeakPtr<PaymentRequestSpec> spec_;
const mojom::SecurePaymentConfirmationRequestPtr request_;
std::unique_ptr<webauthn::InternalAuthenticator> authenticator_;
std::unique_ptr<PasskeyBrowserBinder> passkey_browser_binder_;
// `device_supports_browser_bound_keys_in_hardware` is not set if
// passkey_browser_binder was not provided.
const bool device_supports_browser_bound_keys_in_hardware_ = false;
std::unique_ptr<BrowserBoundKey> browser_bound_key_;
std::string challenge_;
blink::mojom::GetAssertionAuthenticatorResponsePtr response_;
// This contains the logos of the entities facilitating the transaction. There
// may be up to 2 logos.
std::vector<PaymentEntityLogo> payment_entities_logos_;
base::WeakPtrFactory<SecurePaymentConfirmationApp> weak_ptr_factory_{this};
};
} // namespace payments
#endif // COMPONENTS_PAYMENTS_CONTENT_SECURE_PAYMENT_CONFIRMATION_APP_H_