1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
|
// 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,
std::unique_ptr<SkBitmap> payment_instrument_icon,
std::vector<uint8_t> credential_id,
std::unique_ptr<PasskeyBrowserBinder> passkey_browser_binder,
const url::Origin& merchant_origin,
base::WeakPtr<PaymentRequestSpec> spec,
mojom::SecurePaymentConfirmationRequestPtr request,
std::unique_ptr<webauthn::InternalAuthenticator> authenticator,
const std::u16string& network_label,
std::unique_ptr<SkBitmap> network_icon,
const std::u16string& issuer_label,
std::unique_ptr<SkBitmap> issuer_icon);
~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;
const SkBitmap* issuer_bitmap() const override;
const SkBitmap* network_bitmap() const 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;
std::u16string network_label() const { return network_label_; }
std::u16string issuer_label() const { return issuer_label_; }
PasskeyBrowserBinder* GetPasskeyBrowserBinderForTesting();
private:
void OnGetBrowserBoundKey(
base::WeakPtr<Delegate> delegate,
blink::mojom::PublicKeyCredentialRequestOptionsPtr options,
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::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_;
std::unique_ptr<BrowserBoundKey> browser_bound_key_;
std::string challenge_;
blink::mojom::GetAssertionAuthenticatorResponsePtr response_;
const std::u16string network_label_;
const std::unique_ptr<SkBitmap> network_icon_;
const std::u16string issuer_label_;
const std::unique_ptr<SkBitmap> issuer_icon_;
base::WeakPtrFactory<SecurePaymentConfirmationApp> weak_ptr_factory_{this};
};
} // namespace payments
#endif // COMPONENTS_PAYMENTS_CONTENT_SECURE_PAYMENT_CONFIRMATION_APP_H_
|